Buenas, Estoy trabajando con el Esp8266 NodeMCU enviando datos como objetos de tipo Json a un servidor. Para no generar spam al servidor una vez compilado un numero de datos, 60 en mi caso, los envié como un array. Inicialmente, decidi crear los objetos con un ciclo For, sin embargo al correr el programa este me generaba un error del tipo "Exception(2)" en el monitor serial, lo que reiniciaba el ESP. Investigando en distintos foros sobre esta problematica todo apunta a un problema con la memoria flash, y sugerian el uso de funciones como Wifi.Persistent(false) para evitar que los datos del WiFi sobreescribieran en la memoria y que esto causara su reinicio, sin embargo esto no funciono. Asi que decidi no usar el ciclo For y crear objeto por objeto a través de una funcion que llame 60 veces. Hasta el objeto 15, este envia los datos satisfactoriamente al servidor, pero al ingresarle más objetos, el error "Exception(2)" y reset del Esp8266 persisten asi como el mensaje del servidor de "Connection Refused".
En otros foros sugieren que se use directamente la dirrecion Ip, en vez de host, sin embargo por el servidor que estoy utilizando esto no es permitido.
Adjunto mi codigo:
#include <ESP8266WiFi.h>
#include <WiFiManager.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
String bearer = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3N1ZWRBdCI6MTU2MDQ4NjQ5NS45OTQ5MzUsImlzc3Vl";
String Host = "http://efihome.herokuapp.com/api/logs";
int httpCode;
const char* ID = "ADBCD";
const char* PASS = "1234567890";
HTTPClient http; //Objeto de clase HTTPClient
const int capacity = JSON_ARRAY_SIZE(30) + 30 * JSON_OBJECT_SIZE(10);
StaticJsonDocument<capacity> doc;
JsonObject obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10,
obj11, obj12, obj13, obj14, obj15, obj16, obj17, obj18, obj19, obj20,
obj21, obj22, obj23, obj24, obj25, obj26, obj27, obj28, obj29, obj30,
obj31, obj32, obj33, obj34, obj35, obj36, obj37, obj38, obj39, obj40,
obj41, obj42, obj43, obj44, obj45, obj46, obj47, obj48, obj49, obj50;
float current[60] = {1.5, 6.8, 5.0, 6.7, 6.2, 6.6, 1.5, 6.8, 5.0, 6.7,
6.2, 6.6, 1.5, 6.8, 5.0, 6.7, 6.2, 6.6, 1.5, 6.8,
5.0, 6.7, 6.2, 6.6, 6.6, 1.5, 6.8, 5.0, 6.7, 6.2,
6.6, 1.5, 6.8, 5.0, 6.7, 6.2, 6.6, 1.5, 6.8, 5.0,
6.7, 6.2, 6.6, 1.5, 6.8, 5.0, 6.7, 6.2, 6.6, 6.6};
double date = 1560456080;
String deviceID = "97367434-CA04-4FC7-A8BA-703DCFCBA081";
float power[60] = {20.5, 25.6, 10.0, 9.8, 15.2, 20.6, 20.5, 25.6, 10.0, 9.8,
15.2, 20.6, 20.5, 25.6, 10.0, 9.8, 15.2, 20.6, 20.5, 25.6,
10.0, 9.8, 15.2, 20.6, 15.2, 20.5, 25.6, 10.0, 9.8, 15.2,
20.6, 20.5, 25.6, 10.0, 9.8, 15.2, 20.6, 20.5, 25.6, 10.0,
9.8, 15.2, 20.6, 20.5, 25.6, 10.0, 9.8, 15.2, 20.6, 15.2};
float FactorPower[60] = {0.7, 0.8, 0.9, 1.0, 0.95, 0.8, 0.7, 0.8, 0.9, 1.0,
0.95, 0.8, 0.7, 0.8, 0.9, 1.0, 0.95, 0.8, 0.7, 0.8,
0.9, 1.0, 0.95, 0.8, 0.9, 1.0, 0.95, 0.8, 0.7, 0.8,
0.7, 0.8, 0.9, 1.0, 0.95, 0.8, 0.7, 0.8, 0.9, 1.0,
0.95, 0.8, 0.7, 0.8, 0.9, 1.0, 0.95, 0.8, 0.7, 0.8,
0.9, 1.0, 0.95, 0.8, 0.9, 1.0, 0.95, 0.8, 0.7, 0.8};
float voltage[60] = {117.5, 120.5, 118.9, 118.5, 119.2, 117.8, 117.5, 120.5, 118.9, 118.5,
119.2, 117.8, 117.5, 120.5, 118.9, 118.5, 119.2, 117.8, 117.5, 120.5,
118.9, 118.5, 119.2, 117.8, 116.8, 117.5, 120.5, 118.9, 118.5, 119.2,
117.8, 117.5, 120.5, 118.9, 118.5, 119.2, 117.8, 117.5, 120.5, 118.9,
118.5, 119.2, 117.8, 117.5, 120.5, 118.9, 118.5, 119.2, 117.8, 116.8};
void setup() {
Serial.begin(9600);
// WiFi.persistent(false);
WiFi.begin(ID, PASS); //Inicia la conexión con la red Wi-Fi.
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting...");
}
Serial.println("WiFi Conectado");
GETServidor();
}
void loop() {
// put your main code here, to run repeatedly:
}
void GETServidor() {
CreateObj(obj1, 0);
CreateObj(obj2, 1);
CreateObj(obj3, 2);
CreateObj(obj4, 3);
CreateObj(obj5, 4);
CreateObj(obj6, 5);
CreateObj(obj7, 6);
CreateObj(obj8, 7);
CreateObj(obj9, 8);
CreateObj(obj10, 9);
CreateObj(obj11, 10);
CreateObj(obj12, 11);
CreateObj(obj13, 12);
CreateObj(obj14, 13);
CreateObj(obj15, 14);
CreateObj(obj16, 15);
CreateObj(obj17, 16);
CreateObj(obj18, 17);
CreateObj(obj19, 18);
CreateObj(obj20, 19);
CreateObj(obj21, 20);
CreateObj(obj22, 21);
CreateObj(obj23, 22);
CreateObj(obj24, 23);
CreateObj(obj25, 24);
CreateObj(obj26, 25);
CreateObj(obj27, 26);
CreateObj(obj28, 27);
CreateObj(obj29, 28);
CreateObj(obj30, 29);
CreateObj(obj31, 30);
CreateObj(obj32, 31);
CreateObj(obj33, 32);
CreateObj(obj34, 33);
CreateObj(obj35, 34);
CreateObj(obj36, 35);
CreateObj(obj37, 36);
CreateObj(obj38, 37);
CreateObj(obj39, 38);
CreateObj(obj40, 39);
CreateObj(obj41, 40);
CreateObj(obj42, 41);
CreateObj(obj43, 42);
CreateObj(obj44, 43);
CreateObj(obj45, 44);
CreateObj(obj46, 45);
CreateObj(obj47, 46);
CreateObj(obj48, 47);
CreateObj(obj49, 48);
CreateObj(obj50, 49);
// Cada array hasta , = 185
char rootBuffer[185*50];
serializeJsonPretty(doc, rootBuffer);
//Serial.println(rootBuffer);
if (http.begin(Host)) {
http.addHeader("Accept", "application/json");
http.addHeader("Authorization", "Bearer " + bearer);
http.addHeader("Content-Type", "application/json");
httpCode = http.POST(rootBuffer);
if (httpCode > 0) {
Serial.printf("[HTTP] POST... code: %d\n", httpCode);
if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
Serial.println(payload);
}
}
else {
Serial.printf("[HTTP] POST... failed, error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
} else {
Serial.println("Fallo en conexión con servidor");
}
}
void CreateObj(JsonObject obj, int i) {
obj = doc.createNestedObject();
obj["current"] = current[i];
obj["date"] = date;
obj["device_id"] = deviceID;
obj["power"] = power[i];
obj["factor_power"] = FactorPower[i];
obj["voltage"] = voltage[i];
}