0

I'm currently working in a weather station with online recording on Thingspeak. When I send a set of parameters (T, Pressure, Humidity, light), I don't have any problem with sending data. But when I add to the code the rain parameter, the code doesn't send the data. The rain parameter is calculated based on an interrupt, so could this affect my data sending? It is any trick that I can use to solve it?

The code:

#include <Wire.h>
#include <SoftwareSerial.h>
#include <String.h>

SoftwareSerial Sim900Serial(9,11);//Configarión de los pines serial por software: RX, TX

Weather myHumidity;//Create an instance of the humidity sensor

const byte RAIN = 2;

volatile int pulse_counter_ISR;
float mm; 
volatile unsigned long raintime, rainlast, raininterval, rain;

float humidity = 0; // [%]

void setup() {
  Serial.begin(19200); 
  Sim900Serial.begin(19200);//Arduino se comunica con el SIM900 a una velocidad de 19200bps  
  Sim900Serial.println("AT+IPR=19200");    // Tell the SIM900 not to autobaud 

  Wire.begin();  

  pinMode(RAIN, INPUT_PULLUP); // input from wind meters rain gauge sensor
  digitalWrite(RAIN, HIGH);

  myHumidity.begin();


  // attach external interrupt pins to IRQ functions
  attachInterrupt(0, interrupt_handler, FALLING);

  // turn on interrupts
  interrupts();

}

void loop() {
 calcWeather();
 comandosAT();
 delay(600000);
}

void calcWeather()
{
//Calc humidity
humidity = myHumidity.getRH();

//Calculate amount of rainfall for the last 10 minutes
mm = pulse_counter_ISR*0.2794;
pulse_counter_ISR = 0;

}

void comandosAT(){
Sim900Serial.println("AT+CIPSTATUS");//Consultar el estado actual de la conexión
delay(2000);
Sim900Serial.println("AT+CIPMUX=0");//comando configura el dispositivo para    una conexión IP única o múltiple 0=única
delay(3000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CSTT=\"internet.simple\"");
delay(1000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIICR");//REALIZAR UNA CONEXIÓN INALÁMBRICA CON GPRS O CSD
delay(3000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIFSR");// Obtenemos nuestra IP local
delay(2000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSPRT=0");//Establece un indicador '>' al enviar datos
delay(3000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSTART=\"TCP\",\"api.thingspeak.com\",\"80\"");//Indicamos el tipo de conexión, url o dirección IP y puerto al que realizamos la conexión
delay(6000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSEND");//ENVÍA DATOS A TRAVÉS DE una CONEXIÓN TCP O UDP
delay(4000);
mostrarDatosSeriales();
String datos="GET https://api.thingspeak.com/update?api_key=MYAPIKEY&field1=0" + String(humidity) + "&field2=0" + String(mm);
Sim900Serial.println(datos);//Envía datos al servidor remoto
delay(4000);
mostrarDatosSeriales();
Sim900Serial.println((char)26);
delay(5000);//Ahora esperaremos una respuesta pero esto va a depender de las condiones de la red y este valor quizá debamos modificarlo dependiendo de las condiciones de la red
Sim900Serial.println();
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSHUT");//Cierra la conexión(Desactiva el contexto GPRS PDP)
delay(5000);
mostrarDatosSeriales();
} 

void mostrarDatosSeriales()//Muestra los datos que va entregando el sim900
{
while(Sim900Serial.available()!=0)
Serial.write(Sim900Serial.read());
}

void interrupt_handler()
{
  pulse_counter_ISR = pulse_counter_ISR + 1;
}
  • so could this affect my data sending? .... run a test to find out for sure – jsotola Aug 27 '18 at 20:24
  • Did you forget to include a library from Sparkfun? – Jot Aug 27 '18 at 23:49
  • I run it and works, with and without interrupt(), but when I add more variables (4 or more) the AT-CIPSEND do not send the datas – Richi_carrillo Aug 28 '18 at 1:00
  • Finally I split the comands in two functions (comandosAT_1 and comandosAT_2) with different variables. The first one do not works and the socond one works fine. Here are the code – Richi_carrillo Aug 28 '18 at 1:14
0

Finally I split the comands in two functions (comandosAT_1 and comandosAT_2) with different variables. The first one do not works and the socond one works fine. Here are the code

void comandosAT_1(){
Sim900Serial.println("AT+CIPSTATUS");//Consultar el estado actual de la conexión
delay(2000);
Sim900Serial.println("AT+CIPMUX=0");//comando configura el dispositivo para una conexión IP única o múltiple 0=única
delay(3000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CSTT=\"internet.simple\"");//comando configura el APN, nombre de usuario y contraseña."gprs.movistar.com.ar","wap","wap"->Movistar Arg.
delay(1000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIICR");//REALIZAR UNA CONEXIÓN INALÁMBRICA CON GPRS O CSD
delay(3000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIFSR");// Obtenemos nuestra IP local
delay(2000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSPRT=0");//Establece un indicador '>' al enviar datos
delay(3000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSTART=\"TCP\",\"api.thingspeak.com\",\"80\"");//Indicamos el tipo de conexión, url o dirección IP y puerto al que realizamos la conexión
delay(6000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSEND");//ENVÍA DATOS A TRAVÉS DE una CONEXIÓN TCP O UDP
delay(4000);
mostrarDatosSeriales();
String datos="GET https://api.thingspeak.com/update?api_key=XXXXXXXXXXXXX&field1=0" + String(tempC) + "&field2=0" + String(humidity) + "&field3=0" + String(pressure);
Sim900Serial.println(datos);//Envía datos al servidor remoto
delay(4000);
mostrarDatosSeriales();
Sim900Serial.println((char)26);
delay(5000);//Ahora esperaremos una respuesta pero esto va a depender de las condiones de la red y este valor quizá debamos modificarlo dependiendo de las condiciones de la red
Sim900Serial.println();
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSHUT");//Cierra la conexión(Desactiva el contexto GPRS PDP)
delay(5000);
mostrarDatosSeriales();
} 

void comandosAT_2(){
Sim900Serial.println("AT+CIPSTATUS");//Consultar el estado actual de la conexión
delay(2000);
Sim900Serial.println("AT+CIPMUX=0");//comando configura el dispositivo para una conexión IP única o múltiple 0=única
delay(3000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CSTT=\"internet.simple\"");//comando configura el APN, nombre de usuario y contraseña."gprs.movistar.com.ar","wap","wap"->Movistar Arg.
delay(1000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIICR");//REALIZAR UNA CONEXIÓN INALÁMBRICA CON GPRS O CSD
delay(3000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIFSR");// Obtenemos nuestra IP local
delay(2000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSPRT=0");//Establece un indicador '>' al enviar datos
delay(3000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSTART=\"TCP\",\"api.thingspeak.com\",\"80\"");//Indicamos el tipo de conexión, url o dirección IP y puerto al que realizamos la conexión
delay(6000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSEND");//ENVÍA DATOS A TRAVÉS DE una CONEXIÓN TCP O UDP
delay(4000);
mostrarDatosSeriales();
String datos="GET https://api.thingspeak.com/update?api_key=XXXXXXXXXXXXX&field4=0" +  String(light_lvl) + "&field5=0" + String(mm) + "&field6=0" + String(windspeed_KMH);
Sim900Serial.println(datos);//Envía datos al servidor remoto
delay(4000);
mostrarDatosSeriales();
Sim900Serial.println((char)26);
delay(5000);//Ahora esperaremos una respuesta pero esto va a depender de las condiones de la red y este valor quizá debamos modificarlo dependiendo de las condiciones de la red
Sim900Serial.println();
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSHUT");//Cierra la conexión(Desactiva el contexto GPRS PDP)
delay(5000);
mostrarDatosSeriales();
} 

And the first answer of the serial monitor is the following:

OK AT+CIPSTATUS

OK

STATE: IP INITIAL AT+AT+CSTT="internet.simple"

OK AT+CIICR

OK AT+CIFSR

10.254.14.23 AT+CIPSPRT=0

OK AT+CIPSTART="TCP","api.thingspeak.com","80"

OK

CONNECT OKAT+CIPSEND

SEND OK

AT+CIPSHUT

SHUT OK

And the socond one is (that works)

AT+CIPSTATUS

OK

STATE: IP INITIAL AT+CIPMUX=0

OK AT+CSTT="internet.simple"

OK AT+CIICR

OK AT+CIFSR

10.110.2.23 AT+CIPSPRT=0

OK AT+CIPSTART="TCP","api.thingspeak.com","80"

OK

CONNECT OKAT+CIPSEND GET https://api.thingspeak.com/update?api_key=XXXXXXXXXXXXXXXXX&

SEND OK 381 AT+CIPSHUT

SHUT OK

You can see that after the AT+CIPSEND command, the SIM answer "GET https://api.thingspeak.com/update?api_key=XXXXXXXXXXXXXXXXX&" , then "SEND OK" and finally the number of the entry (381).

Any idea or suggestion?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.