Ayuda, 2 Sensores + ESP8266 + SQL

Proyectos hechos por una persona o muy pequeño grupo a modo personal, no proyectos industriales.
Avatar de Usuario
Naguissa
Administrador del Sitio
Mensajes: 508
Registrado: 04 Jul 2016, 11:17
Agradecido: 111 veces
Agradecimiento recibido: 134 veces

Re: Ayuda, 2 Sensores + ESP8266 + SQL

Mensaje sin leer por Naguissa »

Vamos a ir a por un código que elimine la parte problemática, el número con decimales....

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);



// CAMBIO2, añado esta función:
void ftoa(char *a, double f, int precision)
{
 long p[] = {0,10,100,1000,10000,100000,1000000,10000000,100000000};
 
 long heiltal = (long)f;
 itoa(heiltal, a, 10);
 while (*a != '\0') a++;
 *a++ = '.';
 long desimal = abs((long)((f - heiltal) * p[precision]));
 itoa(desimal, a, 10);
}


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: ");
        
        ftoa(temperatura1, sensors.getTempCByIndex(0), 2); // CAMBIO2!
        ftoa(temperatura2, sensors.getTempCByIndex(1), 2); // CAMBIO2!

        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");
  
  }

ftoa la he sacado de aquí: https://forum.arduino.cc/index.php?topic=44262.0


Si no funciona o no compila te pasaría una manera mas ruprestre, pero mas eficiente y sencilla para tu caso.
mecavito
Mensajes: 18
Registrado: 23 Dic 2019, 15:10
Agradecido: 1 vez
Agradecimiento recibido: 4 veces

Re: Ayuda, 2 Sensores + ESP8266 + SQL

Mensaje sin leer por mecavito »

Gracias Naguissa, como siempre aumentando el nivel de mejora

Ya puse en funcionamiento el código, compiló y cargó información en el servidor
estoy revisando y esperando, también cambié a una red wi fi "con menos señal" (con el fin que ocurran problemas, de hecho es la de mi celu que tiene mala señal aquí) y ver que pasa

Serial de los últimos ingresos
.......
Connected to WIFI
IP address: 192.168.1.2
DB - Connecting...
Connected to server version 5.6.41-84.1
Query: INSERT INTO db1234.tabla2 (valor1, valor2, tiempo) VALUES (20.31, 20.37, NOW() + INTERVAL 1 HOUR)
Disconnected.
Datos Almacenados!
Memoria libre: 49KB
DB - Connecting...
Connected to server version 5.6.41-84.1
Query: INSERT INTO db1234.tabla2 (valor1, valor2, tiempo) VALUES (20.31, 20.37, NOW() + INTERVAL 1 HOUR)
Disconnected.
Datos Almacenados!
Memoria libre: 49KB
DB - Connecting...
Connected to server version 5.6.41-84.1
Query: INSERT INTO db1234.tabla2 (valor1, valor2, tiempo) VALUES (20.31, 20.37, NOW() + INTERVAL 1 HOUR)
Disconnected.
Datos Almacenados!
Memoria libre: 49KB
DB - Connecting...
Connected to server version 5.6.41-84.1
Query: INSERT INTO db1234.tabla2 (valor1, valor2, tiempo) VALUES (20.31, 20.37, NOW() + INTERVAL 1 HOUR)
Disconnected.
Datos Almacenados!
mecavito
Mensajes: 18
Registrado: 23 Dic 2019, 15:10
Agradecido: 1 vez
Agradecimiento recibido: 4 veces

Re: Ayuda, 2 Sensores + ESP8266 + SQL

Mensaje sin leer por mecavito »

Error, esta vez fué así (por primera vez sale información)
DB - Connecting...
Connected to server version 5.6.41-84.1
Query: INSERT INTO db1234.tabla2 (valor1, valor2, tiempo) VALUES (20.31, 20.43, NOW() + INTERVAL 1 HOUR)
Disconnected.
Datos Almacenados!
Memoria libre: 49KB
DB - Connecting...
Connected to server version 5.6.41-84.1
Query: INSERT INTO db1234.tabla2 (valor1, valor2, tiempo) VALUES (20.31, 20.43, NOW() + INTERVAL 1 HOUR)
Disconnected.
Datos Almacenados!
Memoria libre: 49KB
DB - Connecting...
Connected to server version 5.6.41-84.1
Query: ERROR: Class requires connected server.
Igual se quedó sin hacer nada mas, queda en stand by y no sigue funcionando, es necesario resetar manualmente
Avatar de Usuario
Naguissa
Administrador del Sitio
Mensajes: 508
Registrado: 04 Jul 2016, 11:17
Agradecido: 111 veces
Agradecimiento recibido: 134 veces

Re: Ayuda, 2 Sensores + ESP8266 + SQL

Mensaje sin leer por Naguissa »

Tras esta línea:

Código: Seleccionar todo

        Serial.println("Datos Almacenados!");
Añade:

Código: Seleccionar todo

    conn.close();                  // close the connection
mecavito
Mensajes: 18
Registrado: 23 Dic 2019, 15:10
Agradecido: 1 vez
Agradecimiento recibido: 4 veces

Re: Ayuda, 2 Sensores + ESP8266 + SQL

Mensaje sin leer por mecavito »

Ya está incluida y el if en cur_mem->execute(query); lo quité ya que se resetea siempre
Avatar de Usuario
Naguissa
Administrador del Sitio
Mensajes: 508
Registrado: 04 Jul 2016, 11:17
Agradecido: 111 veces
Agradecimiento recibido: 134 veces

Re: Ayuda, 2 Sensores + ESP8266 + SQL

Mensaje sin leer por Naguissa »

mecavito escribió: 08 Ene 2020, 19:17 Ya está incluida y el if en cur_mem->execute(query); lo quité ya que se resetea siempre
La documentación no lo deja claro, creía que podía devolver 0/1 pero parece que siempre devuelve 0, al menos en los INSERT....
mecavito
Mensajes: 18
Registrado: 23 Dic 2019, 15:10
Agradecido: 1 vez
Agradecimiento recibido: 4 veces

Re: Ayuda, 2 Sensores + ESP8266 + SQL

Mensaje sin leer por mecavito »

Si, probé el if con otra forma de hacerlo y la respuesta en el serial es la misma, un reseteo constante, en otras palabras no se puede hacer if en

Código: Seleccionar todo

cur_mem->execute(query);
más

Código: Seleccionar todo

ESP.reset();
Siempre, como dices, el valor será cero y resetea; lo cual en mi caso es preocupante ya que entonces siempre el programa quedará trabado y no hay manera por este lado de resetearlo

Leí que se puede enviar un mensaje o un texto al esp8266 desde una página web y resetarlo, buscaré entonces la información al respecto
Avatar de Usuario
Naguissa
Administrador del Sitio
Mensajes: 508
Registrado: 04 Jul 2016, 11:17
Agradecido: 111 veces
Agradecimiento recibido: 134 veces

Re: Ayuda, 2 Sensores + ESP8266 + SQL

Mensaje sin leer por Naguissa »

Sobre los mensajes tienes varias opciones:

- Conectas directamente a una web dentro del ESP. Ésto te permite trabajar sin servidores, pero te hace difícil trabajar desde fuera de casa (por ejemplo, has de abrir el puerto del router que necesites). Además, ocupa espacio y carga el programa.

- Conectas a un servidor web externo. Un ejemplo es conectar a un servidor web PHP gratuito donde haces una web para integrarse con el ESP.

- Conectas a un servidor Node Red. Tendrás que montar uno o usar uno existente, y es algo complicadillo.

- Conectas a una API externa. Algo parecido al Arduino Data API de esta web, pero adaptada para intercambiar mensajes.

- Mi recomendación, conectas a un servidor MQTT. En esta misma web se ofrece un servidor MQTT para tus proyectos Arduino, el cuál es privado y gratuito. Si lo integras en tu programa puedes usar otro dispositivo o usar el cliente de escritorio para intercambiar mensajes. Aquí puedes ver un ejemplo de uso de MQTT en Arduino y del cliente de escritorio.
mecavito
Mensajes: 18
Registrado: 23 Dic 2019, 15:10
Agradecido: 1 vez
Agradecimiento recibido: 4 veces

Re: Ayuda, 2 Sensores + ESP8266 + SQL

Mensaje sin leer por mecavito »

Buen día

Muchas gracias, comencé a leer la info y a revisar todo al respecto.

Por otro lado decidí hacer un proyecto gemelo en paralelo, (la info la ingreso en otra tabla, es lo único que cambia) para ver como se comportaban, y me di cuenta que fallan al mismo tiempo exactamente, es decir a la misma hora, me pregunto :geek: si tendrá que ver con el servidor web php donde ingreso la info que hay problemas...
mecavito
Mensajes: 18
Registrado: 23 Dic 2019, 15:10
Agradecido: 1 vez
Agradecimiento recibido: 4 veces

Re: Ayuda, 2 Sensores + ESP8266 + SQL

Mensaje sin leer por mecavito »

Buenas tardes

He aprendido demasiado con este simple proyecto, agradezco hasta el momento a todos los que me han apoyado, especialmente a Naguissa por todo su extenso conocimiento, antes de explicar el cambio realizado doy unas conclusiones acerca de lo sucedido con el método insert en DB mysql
Aspectos positivos
1. Es un código simple (a la final) aunque para mí fue como aprender todo un lenguaje :lol:
2. Se conecta directamente a la base de datos sin páginas, saltos ni otros intermediarios
3. Para proyectos locales es la mejor opción

Aspectos negativos
1. Si tienes tu dispositivo en un lugar externo es un problema si no tienes un hosting con IP fija o deberás "abrir" al mundo el acceso a tus servidores
2. En caso que el hosting o el servicio web o tu servidor local tnega un lagg, o haga algo fuera de lo común, el código Query se queda pegado y deja de subir info, solo puedes resetear manualmente para seguir funcionando
3. Es muy complicado (al menos hasta donde lo trabajé) colocar un watchdog o un reset funcional, en mi experiencia debido al punto anterior deberás resetear manualmente

Por las sugerencias de Naguissa decidí cambiar de enfoque, de todas las opciones las que más me llamaron la atención fueron MTTQ y servidor PHP a través de una web y así lo estoy ejecutando y creo que con menos problemas que antes (hasta ahora ;) ); la del node red ni la entendí :cry:

En futuros post en este sitio colocaré los códigos y cambios que haya realizado tanto en PHP como con MTTQ (aunque en este último me demoraré un poco más de tiempo, me gustaría desarrollar mi propio MTTQ local :geek: )
Estos usuarios agradecieron al autor mecavito por el mensaje:
Naguissa
Valoración: 33%
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje