Ayuda, 2 Sensores + ESP8266 + SQL

Proyectos hechos por una persona o muy pequeño grupo a modo personal, no proyectos industriales.
mecavito
Mensajes: 18
Registrado: 23 Dic 2019, 15:10
Agradecido: 0
Agradecimiento recibido: 4 veces

Re: Ayuda, 2 Sensores + ESP8266 + SQL

Mensaje sin leer por mecavito »

Buenas tardes

Me demoré en escribir debido a las pruebas realizadas, les comento que se realizaron unos cambios por otras sugerencias incluido además de las tuyas agregar un borrado de memoria al final del código.

Este código llegó a 10.834 inserciones de información en la base de datos cada 8 segundos aproximadamente y volvió a mi temible
Query:
, luego se detuvo, solo con reset manual retoma el proceso, ningún reset programado me ha funcionado en otras pruebas

Código usado:

Código: Seleccionar todo

#include <TimeLib.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <WiFiClient.h>

#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2// DS18B20 Data Pin
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// MySQL
IPAddress server_addr(XXX,XX,XX,XXX);   // MySQL SERVER
char user[] = "USERNAME"; // MySQL USERNAME
char password[] = "PASWWW"; // MySQL PASSWORD
char INSERT_DATA[] = "INSERT INTO mibasededatos.mitabla (valor1, valor2, tiempo) VALUES (%s, %s, NOW() + INTERVAL 1 HOUR)";
char query[200]; //aumenté de 128 a 200 por recomendación
char temperatura1[10];
char temperatura2[10];

//inicionuevo con millis y reset
//unsigned long previousMillis = 0;

// WiFi
char ssid[] = "RED WIFI"; // SSID NAME 
char pass[] = "Clave wifi"; // SSID PASSWORD 

WiFiClient client;
MySQL_Connection conn((Client *)&client);


void conectarWifi(){
      // wi fi
      WiFi.begin(ssid, pass);
      while ( WiFi.status() != WL_CONNECTED ) {
        delay ( 500 );
        Serial.print ( "." );
        }
      Serial.println ( "" );
      Serial.print ( "Connected to " );
      Serial.println ( ssid );
      Serial.print ( "IP address: " );
      Serial.println ( WiFi.localIP() );
           
}

void setup() {
      Serial.begin(115200);
      conectarWifi();
      sensors.begin();
}


void saveTempData() {
      if(WiFi.status() != WL_CONNECTED) conectarWifi();
      Serial.println("DB - Connecting...");
      while (conn.connect(server_addr, 3306, user, password) != true) {
        delay(1000);
        Serial.print (".");
        }
        MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
        // Sensores 
        sensors.requestTemperatures();
        //Serial.print("Temp 1: ");
        //Serial.println(temperatura1); //Serial.println(sensors.getTempCByIndex(0));
        //Serial.print("Temp 2: ");
        //Serial.println(temperatura2); //Serial.println(sensors.getTempCByIndex(1));
        Serial.print("Query: ");
        dtostrf(sensors.getTempCByIndex(0), 4, 2, temperatura1);
        dtostrf(sensors.getTempCByIndex(1), 4, 2, temperatura2);
        sprintf(query, INSERT_DATA, temperatura1, temperatura2);
        cur_mem->execute(query);
        Serial.println(query);
        delete cur_mem;
        Serial.println("Datos Almacenados!");
        delay(3000);
     
      
 }

void loop() {
  //if (millis() > 3600000) { // 3600000 * 1 = 1h
  //      ESP.reset();
  //  }
    saveTempData();
    Serial.print(F("Memoria libre: "));
    Serial.print(ESP.getFreeHeap() / 1024);
    Serial.println("KB");
  
}

mecavito
Mensajes: 18
Registrado: 23 Dic 2019, 15:10
Agradecido: 0
Agradecimiento recibido: 4 veces

Re: Ayuda, 2 Sensores + ESP8266 + SQL

Mensaje sin leer por mecavito »

Modifiqué el código por otro donde en una parte viene lo siguiente

Código: Seleccionar todo

void saveTempData() {
      Serial.println("DB - Connecting...");
      if (conn.connect(server_addr, 3306, user, password)) {
        delay(500);
        sensors.requestTemperatures();
        Serial.print("Query: ");
        dtostrf(sensors.getTempCByIndex(0), 4, 2, temperatura1);
        dtostrf(sensors.getTempCByIndex(1), 4, 2, temperatura2);
        sprintf(query, INSERT_DATA, temperatura1, temperatura2);
        MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);//nuevo sitio
        cur_mem->execute(query);
        Serial.println(query);
        delete cur_mem;
        conn.close();
        Serial.println("Datos Almacenados!");
        delay(3000);
        }
        else {
          Serial.println("No se conectó a DB");
          }
 }
Es viable colocar un if, por aquí?, con el fin que si no se ejecuta el query, haga otra cosa?

Código: Seleccionar todo

cur_mem->execute(query);
Gracias

Avatar de Usuario
Naguissa
Administrador del Sitio
Mensajes: 436
Registrado: 04 Jul 2016, 11:17
Agradecido: 92 veces
Agradecimiento recibido: 132 veces

Re: Ayuda, 2 Sensores + ESP8266 + SQL

Mensaje sin leer por Naguissa »

Revisando la librería sí puedes poner un if, ya que execute es una función booleana: https://github.com/ChuckBell/MySQL_Conn ... rsor.h#L67

Podrías hacer:

Código: Seleccionar todo

        if (!cur_mem->execute(query)) {
            ESP.reset();
        }

mecavito
Mensajes: 18
Registrado: 23 Dic 2019, 15:10
Agradecido: 0
Agradecimiento recibido: 4 veces

Re: Ayuda, 2 Sensores + ESP8266 + SQL

Mensaje sin leer por mecavito »

Buen día

ya probé el código y como tal funciona, pero en esta instrucción posterior no compila

Código: Seleccionar todo

        delete cur_mem;
Dice que no cur_mem no ha sido declarada...

Avatar de Usuario
Naguissa
Administrador del Sitio
Mensajes: 436
Registrado: 04 Jul 2016, 11:17
Agradecido: 92 veces
Agradecimiento recibido: 132 veces

Re: Ayuda, 2 Sensores + ESP8266 + SQL

Mensaje sin leer por Naguissa »

mecavito escribió:
27 Dic 2019, 23:56
Buen día

ya probé el código y como tal funciona, pero en esta instrucción posterior no compila

Código: Seleccionar todo

        delete cur_mem;
Dice que no cur_mem no ha sido declarada...
¿No faltan paréntesis?

mecavito
Mensajes: 18
Registrado: 23 Dic 2019, 15:10
Agradecido: 0
Agradecimiento recibido: 4 veces

Re: Ayuda, 2 Sensores + ESP8266 + SQL

Mensaje sin leer por mecavito »

Cuando lo subo sin el

Código: Seleccionar todo

	if (!cur_mem->execute(query)) {
            ESP.reset();
        }
Este

Código: Seleccionar todo

        delete cur_mem;
Funciona sin problemas

Avatar de Usuario
Naguissa
Administrador del Sitio
Mensajes: 436
Registrado: 04 Jul 2016, 11:17
Agradecido: 92 veces
Agradecimiento recibido: 132 veces

Re: Ayuda, 2 Sensores + ESP8266 + SQL

Mensaje sin leer por Naguissa »

Mira a ver que todas las llaves y paréntesis estén bien, creo que ha de faltar o sobrar algo. Copia todo el código aquí para revisar.

mecavito
Mensajes: 18
Registrado: 23 Dic 2019, 15:10
Agradecido: 0
Agradecimiento recibido: 4 veces

Re: Ayuda, 2 Sensores + ESP8266 + SQL

Mensaje sin leer por mecavito »

Feliz año 2020 para todos, muchos éxitos en sus proyectos

Salí unos días de vacaciones y dejé el proyecto funcionando aproximadamente cada minuto, duró casi 36 horas sin problemas, es decir NADA :roll: , luego simplemente no volvió a subir información al servidor.

Coloqué los paréntesis en
delete cur_mem;
, y tampoco compila, el error que sale es
'cur_mem' cannot be used as a function
A continuación el código con if en el query

Código: Seleccionar todo

#include <TimeLib.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <WiFiClient.h>

#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2 // DS18B20 Data Pin, si está en D4 es "ONE_WIRE_BUS 2", si está en D2 es "ONE_WIRE_BUS 4"
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// MySQL
IPAddress server_addr(XXX,XXX,XX,XXX);   // MySQL SERVER

char user[] = "USERNAME"; // MySQL USERNAME
char password[] = "PSWW"; // MySQL PASSWORD
char INSERT_DATA[] = "INSERT INTO database.table (valor1, valor2, tiempo) VALUES (%s, %s, NOW() + INTERVAL 1 HOUR)";
char query[200]; //aumenté de 128 a 200 por recomendación
char temperatura1[10];
char temperatura2[10];

//inicionuevo con millis y reset
//unsigned long previousMillis = 0;

// WiFi
char ssid[] = WIFI"; // SSID NAME 
char pass[] = "CLAVEWIFI"; // SSID PASSWORD 

WiFiClient client;
MySQL_Connection conn((Client *)&client);


void conectarWifi(){
      // wi fi
      WiFi.begin(ssid, pass);
      while ( WiFi.status() != WL_CONNECTED ) {
        delay ( 500 );
        Serial.print ( "." );
        }
      Serial.println ( "" );
      Serial.print ( "Connected to " );
      Serial.println ( ssid );
      Serial.print ( "IP address: " );
      Serial.println ( WiFi.localIP() );
           
  }

void setup() {
      Serial.begin(115200);
      conectarWifi();
      }

void saveTempData() {
      Serial.println("DB - Connecting...");
      if (conn.connect(server_addr, 3306, user, password)) {
        delay(500);
        sensors.requestTemperatures();
        Serial.print("Query: ");
        dtostrf(sensors.getTempCByIndex(0), 3, 2, temperatura1);
        dtostrf(sensors.getTempCByIndex(1), 3, 2, temperatura2);
        sprintf(query, INSERT_DATA, temperatura1, temperatura2);
        MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);//nuevo sitio
        if (!cur_mem->execute(query)){
          ESP.reset();
        }
        Serial.println(query);
        delete cur_mem();
        conn.close();
        Serial.println("Datos Almacenados!");
        delay(55000);
        }
        else {
          Serial.println("No se conectó a DB");
          }
  }

void loop() {
    if(WiFi.status() != WL_CONNECTED) conectarWifi();
    sensors.begin();
    saveTempData();
    Serial.print(F("Memoria libre: "));
    Serial.print(ESP.getFreeHeap() / 1024);
    Serial.println("KB");
  
  }
Aquí el último código completo.

Código: Seleccionar todo

#include <TimeLib.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <WiFiClient.h>

#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2 // DS18B20 Data Pin, si está en D4 es "ONE_WIRE_BUS 2", si está en D2 es "ONE_WIRE_BUS 4"
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// MySQL
IPAddress server_addr(XXX,XXX,XX,XXX);   // MySQL SERVER

char user[] = "USERNAME"; // MySQL USERNAME
char password[] = "PSWW"; // MySQL PASSWORD
char INSERT_DATA[] = "INSERT INTO database.table (valor1, valor2, tiempo) VALUES (%s, %s, NOW() + INTERVAL 1 HOUR)";
char query[200]; //aumenté de 128 a 200 por recomendación
char temperatura1[10];
char temperatura2[10];

//inicionuevo con millis y reset
//unsigned long previousMillis = 0;

// WiFi
char ssid[] = "WIFI"; // SSID NAME ""
char pass[] = "CLAVEWIFI"; // SSID PASSWORD ""

WiFiClient client;
MySQL_Connection conn((Client *)&client);


void conectarWifi(){
      // wi fi
      WiFi.begin(ssid, pass);
      while ( WiFi.status() != WL_CONNECTED ) {
        delay ( 500 );
        Serial.print ( "." );
        }
      Serial.println ( "" );
      Serial.print ( "Connected to " );
      Serial.println ( ssid );
      Serial.print ( "IP address: " );
      Serial.println ( WiFi.localIP() );
           
  }

void setup() {
      Serial.begin(115200);
      conectarWifi();
      }

void saveTempData() {
      Serial.println("DB - Connecting...");
      if (conn.connect(server_addr, 3306, user, password)) {
        delay(500);
        sensors.requestTemperatures();
        Serial.print("Query: ");
        dtostrf(sensors.getTempCByIndex(0), 3, 2, temperatura1);
        dtostrf(sensors.getTempCByIndex(1), 3, 2, temperatura2);
        sprintf(query, INSERT_DATA, temperatura1, temperatura2);
        MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);//nuevo sitio
        cur_mem->execute(query);
        Serial.println(query);
        delete cur_mem;
        conn.close();
        Serial.println("Datos Almacenados!");
        delay(55000);
        }
        else {
          Serial.println("No se conectó a DB");
          }
  }

void loop() {
    if(WiFi.status() != WL_CONNECTED) conectarWifi();
    sensors.begin();
    saveTempData();
    Serial.print(F("Memoria libre: "));
    Serial.print(ESP.getFreeHeap() / 1024);
    Serial.println("KB");
  
  }
Por último, estuve leyendo acerca de colocar watchdog programado, lo voy a intentar a ver que pasa.

Avatar de Usuario
Naguissa
Administrador del Sitio
Mensajes: 436
Registrado: 04 Jul 2016, 11:17
Agradecido: 92 veces
Agradecimiento recibido: 132 veces

Re: Ayuda, 2 Sensores + ESP8266 + SQL

Mensaje sin leer por Naguissa »

Hola,


Puedes probar ésto:

Código: Seleccionar todo

#include <TimeLib.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <WiFiClient.h>

#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2 // DS18B20 Data Pin, si está en D4 es "ONE_WIRE_BUS 2", si está en D2 es "ONE_WIRE_BUS 4"
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// MySQL
IPAddress server_addr(XXX,XXX,XX,XXX);   // MySQL SERVER

char user[] = "USERNAME"; // MySQL USERNAME
char password[] = "PSWW"; // MySQL PASSWORD
char INSERT_DATA[] = "INSERT INTO database.table (valor1, valor2, tiempo) VALUES (%s, %s, NOW() + INTERVAL 1 HOUR)";
char query[200]; //aumenté de 128 a 200 por recomendación
char temperatura1[10];
char temperatura2[10];

//inicionuevo con millis y reset
//unsigned long previousMillis = 0;

// WiFi
char ssid[] = WIFI"; // SSID NAME 
char pass[] = "CLAVEWIFI"; // SSID PASSWORD 

WiFiClient client;
MySQL_Connection conn((Client *)&client);


void conectarWifi(){
      // wi fi
      WiFi.begin(ssid, pass);
      while ( WiFi.status() != WL_CONNECTED ) {
        delay ( 500 );
        Serial.print ( "." );
        }
      Serial.println ( "" );
      Serial.print ( "Connected to " );
      Serial.println ( ssid );
      Serial.print ( "IP address: " );
      Serial.println ( WiFi.localIP() );
           
  }

void setup() {
      Serial.begin(115200);
      conectarWifi();
      }

void saveTempData() {
      Serial.println("DB - Connecting...");
      if (conn.connect(server_addr, 3306, user, password)) {
        // delay(500); // CAMBIO! - comentado para que el delay se ejecute en el loop.
        sensors.requestTemperatures();
        Serial.print("Query: ");
        dtostrf(sensors.getTempCByIndex(0), 6, 2, temperatura1); // CAMBIO!
        dtostrf(sensors.getTempCByIndex(1), 6, 2, temperatura2); // CAMBIO!
        sprintf(query, INSERT_DATA, temperatura1, temperatura2);
        MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);//nuevo sitio
        if (!cur_mem->execute(query)){ // Si se resetease siempre, probar a quitar este IF.
          ESP.reset();
        }
        Serial.println(query);
        delete (cur_mem); // CAMBIO!
        conn.close();
        Serial.println("Datos Almacenados!");
        delay(55000);
        }
        else {
          Serial.println("No se conectó a DB");
          }
  }

void loop() {
    if(WiFi.status() != WL_CONNECTED) conectarWifi();
    sensors.begin();
    saveTempData();
    delay(1000);  // CAMBIO!
    Serial.print(F("Memoria libre: "));
    Serial.print(ESP.getFreeHeap() / 1024);
    Serial.println("KB");
  
  }


Si puedes, pon un trozo del final de la consola, cuando deja de funcionar, para ver qué está pasando con las querys....

mecavito
Mensajes: 18
Registrado: 23 Dic 2019, 15:10
Agradecido: 0
Agradecimiento recibido: 4 veces

Re: Ayuda, 2 Sensores + ESP8266 + SQL

Mensaje sin leer por mecavito »

Hola probé el código, se resetea siempre

Esto sale en el serial
Connected to WIFI
IP address: XXX.XXX.X.X
DB - Connecting...
Connected to server version 5.6.41-84.1
Query:
ets Jan 8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 1392, room 16
tail 0
chksum 0xd0
csum 0xd0
v3d128e5c
~ld
Cuando falla en el query, simplemente queda blanco el serial, no ejecuta nada más y se queda sin ejecuciones de proceso después del "query:" en el serial así:
Connected to server version 5.6.41-84.1
Query:
Y no sube más información, solo haciendo un reset manual, o desconectando y volviendo a conectar energía...

  • Similar Topics
    Respuestas
    Vistas
    Último mensaje