Buen día, estoy iniciando a aprender a manejar los archivos Json para poder crear un widget IOT que lea variables desde una API y los muestre en una pantalla. Logré la parte de la conexión a la API y los valores son almacenados en una variable, el siguiente paso es la conversión de los valores que manda la API en formato Json a variables, para esto he iniciado como siempre practicando solo con la parte que me interesa para poder ir empapándome del nuevo tema y ver posibles errores que cometa sin tener el código completo.
El detalle es que me esta pasando algo que no me había pasado, que el código no corra, así que no puedo saber en que estoy fallando.
El código con el que estoy iniciando es el de la pagina de ArduionoJson, y mi placa es un ESP8266-01.
#include <ArduinoJson.h>
void setup() {
// Initialize serial port
Serial.begin(9600);
while (!Serial) continue;
Serial.println("1");
Serial.println("2");
// Allocate the JSON document
JsonDocument doc;
// JSON input string.
const char* json = "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";
Serial.println("3");
// Deserialize the JSON document
DeserializationError error = deserializeJson(doc, json);
Serial.println("4");
// Test if parsing succeeds.
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
Serial.println("5");
// Fetch values.
//
// Most of the time, you can rely on the implicit casts.
// In other case, you can do doc["time"].as<long>();
const char* sensor = doc["sensor"];
long time = doc["time"];
double latitude = doc["data"][0];
double longitude = doc["data"][1];
Serial.println("6");
// Print values.
Serial.println(sensor);
Serial.println(time);
Serial.println(latitude, 6);
Serial.println(longitude, 6);
}
void loop() {
// not used in this example
}
He colocado algunos Serial.println() para ver en que parte se detenía el código, pero no aparece ni el primero.
No he mirado incompatibilidades con las librerías ESP.
Yo mantengo ArduinoJson en la versión 6.18.3. A partir de la 7 no he sido capaz de hacerla funcionar, tanto con los ESP01 como con los ESP32. ¿El síntoma? Reseteos continuos.
Intenté realizar lo que comentaste, como uso el ESP8266 instale versiones anteriores tanto de esa como de del ESP32, pero sin éxito, sigue sin mandarme ningún dato el programa, cargando cualquier otro programa funciona bien la placa.
He intentado esta solución también, sin éxito, he desinstalado la librería Arduino Json e instalado la version 6.21.5 y puesto el código básico de la página en su V6.
#include <ArduinoJson.h>
void setup() {
// Initialize serial port
Serial.begin(9600);
while (!Serial) continue;
// Allocate the JSON document
//
// Inside the brackets, 200 is the capacity of the memory pool in bytes.
// Don't forget to change this value to match your JSON document.
// Use arduinojson.org/v6/assistant to compute the capacity.
StaticJsonDocument<200> doc;
// StaticJsonDocument<N> allocates memory on the stack, it can be
// replaced by DynamicJsonDocument which allocates in the heap.
//
// DynamicJsonDocument doc(200);
// JSON input string.
//
// Using a char[], as shown here, enables the "zero-copy" mode. This mode uses
// the minimal amount of memory because the JsonDocument stores pointers to
// the input buffer.
// If you use another type of input, ArduinoJson must copy the strings from
// the input to the JsonDocument, so you need to increase the capacity of the
// JsonDocument.
char json[] =
"{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";
// Deserialize the JSON document
DeserializationError error = deserializeJson(doc, json);
// Test if parsing succeeds.
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
// Fetch values.
//
// Most of the time, you can rely on the implicit casts.
// In other case, you can do doc["time"].as<long>();
const char* sensor = doc["sensor"];
long time = doc["time"];
double latitude = doc["data"][0];
double longitude = doc["data"][1];
// Print values.
Serial.println(sensor);
Serial.println(time);
Serial.println(latitude, 6);
Serial.println(longitude, 6);
}
void loop() {
// not used in this example
}
Vamos a ver. Una cosa es lo que te dije de reseteos continuos al intentar conectar al wifi cualquier ESP. Otra es que no te mande datos.
Si logras conectarte a una wifi, ya no tiene nada que ver la versión. Yo desde la 7 no he probado ninguna Json, simplemente le he cambiado el numerito en el archivo library.properties.
Si no se resetea el ESP es que han arreglado el tema. Cuando salga la próxima haré pruebas.
Gracias por la prueba, no tenia duda que fuera el código ya que lo saque del ejemplo #1 de la documentación oficial de ArduinoJson, el detalle es que por alguna razón no esta corriendo en mi placa ESP8266, lo que asumo es algo como lo que han comenado, problemas de incompatibilidad software hardware, pero de lo que he intentado y de las recomendaciones que han dado no he podido hacer que cargue.
Justo hoy me acaba de llegar una placa ESP32 que encargué, cargué el programa y funcionó correctamente, si bien no se resuelve el problema del hilo, es una alternativa para poder continuar con mi proyecto.
Me quedará la duda de si es problema de compatibilidad de la librería con el ESP8266-01, entre las librerías o del software-hardware, sea cual sea el problema quizás es muy díficil resolverlo y mas remotamente.
Agradezco los consejos y por lo pronto adecuaré el programa principal y cambiaré a esta placa para continuar el proyecto.