(Español) Problema: Fields de un canal dejaron de actualizarse | ThingSpeak API | Forum

Avatar

Please consider registering
Guest

Search

— Forum Scope —






— Match —





— Forum Options —





Minimum search word length is 3 characters - maximum search word length is 84 characters

Register Lost password?
sp_Feed sp_TopicIcon
(Español) Problema: Fields de un canal dejaron de actualizarse
Avatar
Gustavo_JE
New Member
Forum Posts: 4
sp_UserOfflineSmall Offline
1
February 5, 2018 - 9:28 pm
sp_Permalink sp_Print

Solicito ayuda con el siguiente problema: Tengo un canal con 8 fields que se actualizan cada 10 minutos mediante 2 GET, ya que cuando intentaba actualizar los 8 fields con un solo GET los últimos 2 recibian "null". El problema puntual es que dicho canal estuvo un poco más de 2 días recibiendo datos pero luego los fields 4 y 5 recibian solo "null". Utilizo un Arduino MEGA en conjunto con un modulo ESP12 y el numero del canal es 417156

 

Desde ya, muchas gracias

Avatar
piajola

Gold
Forum Posts: 80
sp_UserOfflineSmall Offline
2
February 6, 2018 - 12:10 am
sp_Permalink sp_Print

Gustavo,

Yo uso un arduino uno con ESP01 con comandos AT y hasta ahora funciona. Podrias decir tu metodo, das poca informacion. A ver si te puedo ayudar/opinar.

Podria ser que los numeros que mandas son numeros y debes mandar 'strings' pero estoy hablando en adivinanza porque no se que haces.

Saludos Smile

Avatar
Gustavo_JE
New Member
Forum Posts: 4
sp_UserOfflineSmall Offline
3
February 6, 2018 - 10:06 am
sp_Permalink sp_Print

Hola piajola, gracias por responder. 

Elcodigo que utilizo es el siguiente:

   

   if((millis() - Periodo_Refresco_Wifi) > 600000 && Flag_Primer_Envio == false)   //Refresco cada 10 minutos

    { wdt_reset();

      ThingSUpdate();

      Serial.println("ThingSUpdate ejecutada");

      PrimerEnvio = millis();

      Flag_Primer_Envio = true;

    }

 

   if((millis() - PrimerEnvio) > 15000 && Flag_Primer_Envio == true)

    { wdt_reset();

      ThingSUpdate2();

      Serial.println("ThingSUpdate2 ejecutada");

      Flag_Primer_Envio = false;

      Periodo_Refresco_Wifi = millis();

    }

 

En esta porcion de codigo me aseguro de enviar los datos cada 10 minutos, una primera parte con 6 fields y luego un segundo mensaje con los 2 restantes 15 segundos despues. Las funciones que son llamadas son las siguientes:

void ThingSUpdate()   //Funcion que envia la informacion a Thingspeak

{

  wdt_reset();

 

  char buffer[200];     // Funcion para convertir un dato tipo float en un String

  S_Temp_Comp_01 = dtostrf(Temp_Comp_01, 4, 1, buffer); //The format is: dtostrf(floatvar, StringLengthIncDecimalPoint, numVarsAfterDecimal, charbuf);

  S_Temp_in_T = dtostrf(Temp_in_T, 4, 1, buffer);

  S_Temp_out_T = dtostrf(Temp_out_T, 4, 1, buffer);

  S_Temp_in_H = dtostrf(Temp_in_H, 4, 1, buffer);

  S_Temp_out_H = dtostrf(Temp_out_H, 4, 1, buffer);

  S_A_RMS = dtostrf(A_RMS, 4, 1, buffer);

 

  String cmd = "AT+CIPSTART=\"TCP\",\"";

  cmd += IP;

  cmd += "\",80";

  Serial3.println(cmd);

  delay(2000);

  if (Serial3.find("Error")) {

    return;

  }

  

  cmd = msg ;

  cmd += "&field1=";

  cmd += S_Temp_Comp_01;

  cmd += "&field2=";

  cmd += S_Temp_in_T;

  cmd += "&field3=";

  cmd += S_Temp_out_T;

  cmd += "&field4=";

  cmd += S_Temp_in_H;

  cmd += "&field5=";

  cmd += S_Temp_out_H;

  cmd += "&field6=";

  cmd += S_A_RMS;

  //cmd += "&field7=";

  //cmd += S_Caud_T;

  //cmd += "&field8=";

  //cmd += String(Caud_H);

  cmd += "
";

  Serial3.print("AT+CIPSEND=");

  Serial3.println(cmd.length());

  if (Serial3.find(">")) {

    Serial3.print(cmd);

  }

 

}//Fin funcion Thingspeak Update

 

 

void ThingSUpdate2()   //Funcion que envia la informacion a Thingspeak

{

  wdt_reset();

 

  char buffer[200];     // Funcion para convertir un dato tipo float en un String

  float F_Caud_H = Caud_H;

  S_Caud_T = dtostrf(F_Caud_H, -5, 1, buffer);

 

  String cmd = "AT+CIPSTART=\"TCP\",\"";

  cmd += IP;

  cmd += "\",80";

  Serial3.println(cmd);

  delay(2000);

  if (Serial3.find("Error")) {

    return;

  }

  

  cmd = msg ;

  //cmd += "&field1=";

  //cmd += S_Temp_Comp_01;

  //cmd += "&field2=";

  //cmd += S_Temp_in_T;

  //cmd += "&field3=";

  //cmd += S_Temp_out_T;

  //cmd += "&field4=";

  //cmd += S_Temp_in_H;

  //cmd += "&field5=";

  //cmd += S_Temp_out_H;

  //cmd += "&field6=";

  //cmd += S_A_RMS;

  cmd += "&field7=";

  cmd += S_Caud_T;

  cmd += "&field8=";

  cmd += String(Caud_T);

  cmd += "
";

  Serial3.print("AT+CIPSEND=");

  Serial3.println(cmd.length());

  if (Serial3.find(">")) {

    Serial3.print(cmd);

  }

 

}//Fin funcion Thingspeak Update

 

La razon por la que uso 2 funciones separadas es porque cuando intenté actualizar los 8 campos al mismo tiempo, solo recibía los primeros 6 y los últimos 2 siempre recibían "null". Esto andubo perfectamente durante un poco más de 2 días, sin embargo desde hace al menos unas 24 horas los campos 3, 4 y 5 solo reciben "null". Perdon por el formato en que presento el código 

Avatar
piajola

Gold
Forum Posts: 80
sp_UserOfflineSmall Offline
4
February 6, 2018 - 8:09 pm
sp_Permalink sp_Print sp_EditHistory

Gustavo,

Para poder usar el menor tiempo en comunicacion y ver en la PC para debugear (siempre hay problemas) yo uso AltSoftSerial Library de PRJC que va bien a 57600 en el arduino uno y creo que hay tiempo para mandar los 8 campos mas el status, en mega con dos seriales hardware a 115200 no deberia faltarte tiempo ... creo.

para que wdt_reset() pregunto ...

Yo hago:
altSer. hacia el ESP
Serial. hacia la PC cuando debugeo

- - - - - - - - - - -
// TCP connection
String cmd = "AT+CIPSTART=\"TCP\",\"";
cmd += "184.106.153.149";                    // NO api.thingspeak.com
cmd += "\",80";
altSer.println(cmd);

// if (altSer.find("Error")) { mi firmware actual pide mayusculas
if (altSer.find("ERROR")) {
  Serial.println("AT+CIPSTART error");
  eperau(8000); espera segun elapsedMillis.h
return;
}

// preparar GET string
String getStr = "GET /update?api_key=";
getStr += apiKey;
getStr += "&field1=";
getStr += String(strTemp);
getStr += "&field2=";
getStr += String(strHume);
getStr += "/r/n/r/n";             // bien clarito 2 ret + 2 nl hay que usar el quebrado invertido en vez del / para poderlo escribir en el forum

// cuantos caracteres voy a mandar
cmd = "AT+CIPSEND=";
cmd += String(getStr.length());
altSer.println(cmd);

if (altSer.find(">")) {
altSer.print(getStr);
} else {
altSer.println("AT+CIPCLOSE");
// alertar usuario que no paso nada esta vez
Serial.println("AT+CIPCLOSE");
}
- - - - - - - - - - -

copialo al IDE arduino y dile que le de autoformato

yur opinion plis  ... hay que seguirla hasta que te funcione Wink

Avatar
Gustavo_JE
New Member
Forum Posts: 4
sp_UserOfflineSmall Offline
5
February 7, 2018 - 1:31 pm
sp_Permalink sp_Print

yo utilizaba un solo "/r/n" al final del string, cual es la diferencia al usar 2?

Probando un poco más, encontre un comportamiento extraño: tal vez hayas podido deducir que mi programa lee algunas temperaturas y 2 caudales de agua y encontre que cuando tengo efectivamente señal de caudal la transmision se realiza sin problemas. En un momento cerré el caudal y cuando le tocó actualizar la información descubrí que solo se enviaba el segundo mensaje con el caudal =0 como corresponde, pero las temperaturas nunca las envió. Es extraño pues no debería funcionar así. Podrá tal vez ser un problema con la función String(Caud_T) cuando el caudal es cero?

 

Gracias!

Avatar
piajola

Gold
Forum Posts: 80
sp_UserOfflineSmall Offline
6
February 7, 2018 - 7:42 pm
sp_Permalink sp_Print

que 2 "/r/n" es el doble de lo que usas Laugh ... en serio no se, pero en algun lado lo lei. Que asi es con el ESP y arduino
Las lagrimas es lo que forja la experiencia

Yo uso termite ( https://www.compuphase.com/software_termite.htm ) no se instala no se mete en el registry es chico es rapido ... etc etc

- AT+CIPSTART="TCP","api.thingspeak.com",80
- AT+CIPSEND=77
- GET /update?api_key=___el_API_key___&field1=00.00&field2=00.00&field3=00.00

prueba esas tres lineas y veras que los CEROS no tienen problemas, termite los envia como string y TS los graba valor cero numerico. Lo acabo de probar asi que copyalo y pastealo

Total has probado mandar los 8 campos de un solo viaje?

Prueba string tu valor numerico regresado por tu sensor y tambien juega con los parametros de dtostrf (siempre me paso un dia con esta cuestion del valor del sensor y mandarlo por internet)

continuara ...

Avatar
Gustavo_JE
New Member
Forum Posts: 4
sp_UserOfflineSmall Offline
7
February 7, 2018 - 9:13 pm
sp_Permalink sp_Print

Lágrimas, montones de ellas....

 

Hasta ahora parece que todo volvio a funcionar. Actualizaré si es que ocurre algún cambio.

 

Muchas gracias por tu ayuda (y apoyo moral XD)

Forum Timezone: America/New_York

Most Users Ever Online: 114

Currently Online:
35 Guest(s)

Currently Browsing this Page:
1 Guest(s)

Top Posters:

rw950431: 252

Vinod: 164

cstapels: 96

piajola: 75

vespapierre: 63

Adarsh_Murthy: 59

Newest Members:

ibgedubo

aogomaeqaza

ureomug

itixuwidouzuv

eilimir

memozupi

Forum Stats:

Groups: 4

Forums: 17

Topics: 1313

Posts: 4565

 

Member Stats:

Guest Posters: 1

Members: 5703

Moderators: 0

Admins: 2

Administrators: Hans, lee