Dudas sobre los datos

Hola de nuevo, Ega, vamos a ver, seguro que me equivoco al interpretarte, pero los microsegundos que tengo en el sketch (ESP.deepSleep (3540000);), directamente son:

3540000 milisegundos = 59 minutos, + 60000 milis (1 minuto) = 3.600.000 milis = 60 minutos.

Si multiplico 3540000·10 ·6 = 212.400.000 milis = 3.540 minutos = 59 horas.

Me equivoco? No lo he entendido?

Sobre el fallo de los dos dispositivos, me mosquea mucho que se produzcan exactamente los mismos fallos en las dos lecturas siempre. Me he decidido a separarlos. He dejado el original tal cual y he abierto otra cuenta, con otro correo, he copiado el sketch del primero, que funciona más o menos bien, le he cambiado los parámetros del device y credenciales y estoy a la espera de ver si funciona…

pero el problema con los datos sigue igual… arfffffffffffffffff, ya no se que hacer!!! Empieza a asaltarme el desespero y ronda el desanimo…

Imatge1

Salu2 cordiales, y gracias por la ayuda…

Esta instrucción va a hacer que el dispositivo se duerma por 3.54 segundos, porque el parámetro de entrada de la función según la documentación, es en microsegundos.

Haz la estimación en segundos y multiplicas por 10^6 (1000000), en la instrucción lo tienes en milisegundos, en ese caso deberías multiplicar por 10^3 para tenerlo en microsegundos, me explico?

Gracias por la aclaración, EGA, ni me había fijado en el “detallito” de los micro y los milis… Si lo pongo directamente en milis no sirve? O Thinger y el sketch funcionan con microsegundos?

De momento está puesto, a ver que pasa… Ya te digo algo.

Gracias por la ayuda. Salu2 cordiales.

Lo que le pongas como parámetro en ese comando lo va a interpretar en microsegundos, no tiene nada que ver con thinger ni con las otras instrucciones.

Por ejemplo, hay una instruccion que es delayMicroseconds(); que es equivalente al delay que conocemos (que funciona con milisegundos), pero esta funciona con microsegundos, no tienen nada que ver con el resto de instrucciones ni con la plataforma.

Buenos días de nuevo. He dejado pasar tiempo por varias razones que no vienen al caso, pero no he dejado de trabajar en mi proyecto.

En primer lugar, he aparcado el tema de hibernación, ya que no ha habido manera de hacerlo funcionar, y he vuelto al tema del salto horario que, en lugar de imprimir cada hora los datos, empieza bien, pero después de un tiempo, a veces 2-3 días, a veces al cabo de 2h, se vuelve loco e imprime cada cuando le da la gana:

Debe ser algo de Thinger, ya que tengo otro proyecto, igual, pero con otros datos, y me hace lo mismo, salta el horario cuando quiere, y en diferentes horas. Ya no se que mirar…

No se si alguien tiene el mismo problema o soy yo el raro…

Hola @jaume,

Cuando desarrollamos algo crítico solemos introducir variables de debug de la conexión, así si ocurre alguna pérdida de datos sabemos el motivo: En el recurso de salida un millis(); y un WiFi.RSSI(); a ver si en esos casos el dispositivo ha estado en el limbo, o si tiene perdidas de señal… también sería útil que introdujeras en tu código esta estructura (Check Cloud Connection on Arduino) que permite detectar el estado de la conexión y registrar ese tipo de problemas o incuso resetear la conexión si se queda congelada, que a veces pasa.

En la próxima versión del servidor también se incluirá la posibilidad de recuperar un OK de la escritura del bucket, así si hay cualquier tipo de problema con la conexión podemos hacer que siga intentándolo hasta conseguirlo.

Pero me resulta extraño que no te funcionara bien lo de hibernar la placa, la mayoría de las placas que hacen este tipo de lecturas tienen esa configuración y no hay problemas de pérdidas.

un saludo

un saludo

Si es necesario que el dato se almacene cada hora exactamente, yo controlaría el tiempo en el que se hace cada escritura con el microcontrolador.

Puedes ejecutar la rutina cada hora y encender el micro al momento que quieras que se haga la primera lectura, o implementar un cliente NTP y capturar la hora de internet con el micro, y dar la instruccion de que sea cada hora especifica que escriba en el bucket.

Ah y no seria la plataforma que interrogue al dispositivo, seria el microcontrolador que escriba directamente en la plataforma :wink:

Saludos

Gracias por la ayuda, Jtrinc. He mirado el enlace, pero me temo que no comprendo. Donde coloco estas instrucciones? Deben sustituir a alguna existente? Las coloco justo debajo del #define DISABLE_TLS, al principio, pero no me compila… Ufffffffffffff…

Salu2

Gracias por la ayuda, Ega, esta era la idea para evitar tener conectada la alimentación al exterior y también serviría para este caso, pero lo estuve probando con todo lo que me comentasteis, y no hubo manera de hacerlo funcionar. En su momento abandoné provisionalmente la idea, aburrido de fracasar. Si logro solucionar este tema del salto, volveré sobre el tema…

Salu2

Hola jtrinc26, bueno, he retomado tu sugerencia de dormir el ESP8266 y ahora compila, pero no aparecen datos en el bucket. Supongo que será problema de configuración de Thinger. Como debería configurarlo para que funcionara?

Creo entender que Thinger estaría todo el tiempo abierto a que se le enviaran los datos y es el ESP el que los envia, los recoge Thinger y los imprime, no es así? O Thinger va a buscarlos como hasta ahora, a una hora predeterminada, en que ESP esté enviando datos y los imprime? Si es así, como se sincroniza el envio de datos y la recogida e impresión en Thinger, para ahorrar el máximo de energía? Lo he entendido o no? No se si se entiende la duda…

Gracias por la ayuda.

Salu2.

Y otra cosa, después de cargar el sketch, se deben puentear RST y D0, para que después de hivernar se vuelva a poner en marcha?

Salu2

Si, eso es un detalle importante!! en D0 está el pin del RTC interno, es el que manda la señal “wake up”.

Gracias, Jtrinc26, pero como debo configurar el bucket para este sistema?

Cuando creas el bucket en el “Data source” seleccionas “By device call”.

y en el dispositivo la instrucción:

thing.write_bucket("Bucket_Name", "environment");

Va a escribir en el bucket el contenido de las variables definidas en “environment”.

Debes ser cuidadoso con la frecuencia que llames la instrucción, un error puede hacer que el micro intente escribir sin control en el bucket.

Saludos,

Gracias por la ayuda, Ega. Esto no funciona. Imprime los valores en serial, pero no en el bucket.

Veamos si entiendo el funcionamiento de todo el proceso:

1.- En thinger tengo esta configuración:

Es la correcta? Hay que modificar algun otro parámetro?

2.- Al cargar el sketch, desconecto el puente entre RST y D0, si no no compila. Cuando está cargado vuelvo a puentear los pines.

3.- Entiendo que Thinger está abierto a cualquier dato que le envíe ESP? Está pendiente de que ESP le envíe los datos, que son los que imprimirá? Es así?

4.- Sobre el sketch: He añadido las instrucciones que sugería jtrinc26 y, si la configuración de Thinger és correcta, en las siguientes instrucciones creo que está el quid de la cuestión:

a.- if(!t) //Si la conexión se ha creado y el recurso se ha enviado correctamente, t == 1
{
b.- thing.write_bucket(“Bucket_Name”, “environment”); //thing.write_bucket(“climaStick2”, “environment”); //llama al bucket
c.- delay (2000); //Para estar seguro que el mensaje se ha enviado completo
d.- ESP.deepSleep (100000 * 60); //(100000 * 60 * 5); //Dormir el procesador durante 1 minuto

a.- Que significa esta instrucción?

b.- En esta situació, es el ESP8266 el que llama al bucket y le da los datos? O Es el bucket que intenta recoger datos permanentemente y solo pilla los que por un breve lapso de tiempo le facilita el ESP8266?

c.- Este lapso de tiempo (2000 microsegundos = 0.002 segundos), es el que ESP está abierto enviando los datos? Es decir, está despierto? Si es así, no puede funcionar en la vida, ya que desde que despierta y se rearma, hasta que imprime un tren de datos (al menos en el serial), pasan unos 6-7 segundos), con lo que estos 0.002 segundos, son evidentemente insuficientes para enviar nada. Estoy equivocado? Lo he entendido o no?

d.- Creo que lo he hecho bien. Le doy un tiempo de 1 minuto dormido, en lugar de los 5 minutos originales, para poder acelerar el control.

Es así como funciona o estoy equivocado?

Por favor, si logras proporcionarme esta información, creo que me aclararé y podré seguir adelante.

Muchas gracias por la ayuda.

Salu2 cordiales.

Buen día, respondo las dudas que puedo

El bucket esta a la escucha, cualquier dispositivo podría escribir datos allí, no intenta recoger los datos de ningún dispositivo, fíjate que al configurar no estableces con que dispositivo va a funcionar, es absurdo pensar que va a interrogar todos los dispositivos de tu cuenta a ver en cual instante alguno quiere escribir información en base de datos.

La instruccion delay(); es en milisegundos, delayMicroseconds(); en microsegundos ojo con eso, y va a dar un breve periodo de tiempo para la completar la comunicación, el microcontrolador ejecuta una instrucción a la vez, mientras esta imprimiendo datos en el puerto serial no puede estar ejecutando la instrucción de delay.

Según la documentación, el argumento de esta función es en microsegundos, revisa las matemáticas.

Hola Ega, hace días que me peleo con el tema. veamos:

He conseguido solucionar parte del problema. Ahora, en serial, imprime datos cada minuto:

Pero en Thinger solo imprime la fecha y la hora, sin datos, también cada minuto:

Si comento estas instrucciones en el sketch y modifico el Bucket Settings:

entonces la impresión es más o menos correcta (1):

De lo que se deduce, que el error está en esta instrucción:


if(!t) //Si la connexió s’ha creat i el recurs s’ha enviat correctament, t == 1
{
thing.write_bucket (“ESP8266V4”, “1 Temperatura, 2 Humitat, 3 Pressió”); //Trucant al bucket
delay (2000); //(2 segons = 2000 mil·lisegons)
ESP.deepSleep (100000060); (1 minut = 100000060 microsegons)
}

(Todavía no pongo el índice de calor y el punto de rocio, para abreviar).

He intentado lo inimaginable para colocar entre las comillas las instrucciones correctas, pero no consigo dar con la solución. Cómo debería ser?

(1): Y otra cosa, que no se si debo ponerla aquí o debería abrir otro hilo:

En Thinger, cuando funciona más o menos correctamente, se leen estas lecturas:

Al descargar los datos para excel en csv, con Temperatura, Humedad y Presión no hay problema, pero con el índice de calor y el punto de rocío, las traspasa mal:

En excel, mientras que el resto de datos está en formato de celdas “General”, estas dos columnas vienen formato en formato “Número”, con “Separación de miles” activado. donde escribe 247.635, debería escribir 12.76.

En estos dos datos (índice y punto), en el sketch, he intentado colocar el /100 y ,2, para que corra el punto (posteriormente con excel modificable a coma) hasta dos dígitos, coma, dos decimales, pero tampoco consigo encontrar la manera de hacerlo. Con las otras tres columnas fue fácil, pero en estas dos no lo consigo. Alguna sugerencia?

Bueno, perdonad la paliza, pero son los dos últimos escollos (creo) que necesito salvar para poder cerrar el proyecto y ponerlo a trabajar.

Muchas gracias por la atención y la ayuda.

Salu2 cordiales.

Estimado, comparte el último sketch completo, en la instrucción para escribir en el bucket solo debes colocar el nombre del “thing” y si son 3 diferentes, debes usar 3 instrucciones diferentes, aunque es preferible usar una sola instrucción y en un solo “thing” agregar varias variables.

Lo del punto de rocío pienso que se soluciona truncando los decimales, aplica la instrucción “round_to_float” que comentamos en este mismo hilo, en posts anteriores a ver que tal va.

Saludos,

Gracias por la respuesta, P.e, adjunto el sketch completo, tal y como lo tengo ahora:

 #define _DEBUG_  //Imprimeix, a serial, l'estat de la connexió WiFi
    #define _DISABLE_TLS_  //Imprimeix, a serial, l'estat de la connexió WiFi

    #include <ESP8266WiFi.h>       //Librería de conexión WiFi del módulo ESP8266
    #include <ThingerESP8266.h>    //Librería de la plataforma thinger.io

    #include <Wire.h>
    #include <SPI.h>
    #include <Adafruit_Sensor.h>
    #include <Adafruit_BME280.h>

    // Assignar pins ESP8266 a pins arduino
    #define D1 5
    #define D2 4
    #define D4 2
    #define D3 0

    // Assignar SPI als pins
    #define BME_SCK D1  //SCL BME280
    #define BME_MOSI D2  //SDA BME280
    #define BME_CS D3  //SCB BME280
    #define BME_MISO D4 //SD0 BME280

    #define SEALEVELPRESSURE_HPA (1013.25)  //Pressió aproximada. Es pot modificar

    //Adafruit_BME280 bme(BME_CS); // hardware SPI
    Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);  //Programari SPI

    unsigned long delayTime;  

    //Paràmetres del connexió thinger.io
    #define username "nom usuari"
    #define deviceId "ESP8266V4"  //Identificador dispositiu
    #define deviceCredentials "contrasenya"  //contrasenya dispositiu

    ThingerESP8266 thing (username, deviceId, deviceCredentials);

    int t = 0;  /////////////////////////////////////////////

    //Paràmetres de connexió WiFi
    const char WiFi_ssid[] = "xarxa WiFi";  //Nom xarxa
    const char WiFi_password[] = "contrasenya";  //Clau de xarxa WiFi

    //Gestió de decimals a la impressió de Thinger
    float round_to_dp( float in_value, int decimal_place )
    {
      float multiplier = powf( 10.0f, decimal_place );
      in_value = roundf( in_value * multiplier ) / multiplier;
      return in_value;
    }



    void setup() 
    {
        Serial.begin (115200);  //Obre connexió amb serial
        Serial.println (F ("BME280 test"));

        bool status;
        
     // Configuració per defecte
        status = bme.begin();
        if (!status) 
        {
        Serial.println ("No es troba el sensor BME280. Verificar cablejat!");
        while (1);
        }
        
        Serial.println ("-- Sensor funcionant --");  
        delay (1000); //Velocitat a la que imprimeix a serial

        Serial.println();

      thing.add_wifi (WiFi_ssid, WiFi_password);  //Inicialització WiFi per comunicar-se amb l'API

    pinMode (13, HIGH);  //El LED estarà en tot el procés///////////////////////////

    thing["ESP8266V4"] >> [](pson & out)  //Inicializació de la lectura de dades des de l'API
    {
    out ["1 Temperatura"] = round_to_dp(bme.readTemperature() / 1.09, 2); 
    out ["2 Humitat"] = round_to_dp (bme.readHumidity() / 0.77, 2); 
    out ["3 Pressió"] = round_to_dp (bme.readPressure() / 99.76, 2);  
    out ["4 Índex xafogor"] = (float)(0.63 * (bme.readTemperature() + 61.0 + ((bme.readTemperature() - 68.0) * 1.32) + (bme.readHumidity() * 0.094)));
    out ["5 Punt rosada"] = (float) (bme.readTemperature() - ((100-bme.readHumidity()) /5));

    t++;  /////////////////////////////////////
    digitalWrite (13, LOW);  /////////////////////////

    };

    }



    void loop()  
    { 
        thing.handle();
    ////////////////////////////////////////////

    if(!t) //Si la connexió s'ha creat i el recurs s'ha enviat correctament, t == 1
    {
    thing.write_bucket ("ESP8266V4", "1 Temperatura, 2 Humitat, 3 Pressió");  //Trucant al bucket
    delay (2000);  //(2 segons) Per estar segur que el missatge s’ha enviat completament (mil·lisegons)
    ESP.deepSleep (1000000*60);   //Dormir el processador durant 1 minut (microsegons) 
    }

    /////////////////////////

        printValues();  //Descomentar per veure valors a serial
    }


    /*
     * Només per depuració. Un cop comprovat el funcionament al serial, cal desactivar 
     * aquestes instruccions per llegir al serial, altrament interfereix en la recollida
     * de dades a Thinger, provocant que les lectures les faci a hores diferents 
     * a les predeterminades.
     */

     
    void printValues() //Impressió valors a serial
    {   
      Serial.println();  //Salt de línia entre info connexió i dades a serial
    //Temperatura  
        Serial.print ("Temperatura: ");
        float fTemp = bme.readTemperature();
        Serial.print (fTemp);  
        Serial.println (" ºC");  

    //Humitat
        Serial.print ("Humitat: ");
        float rH = bme.readHumidity() / 0.77;
        Serial.print (rH);
        Serial.println(" %");

    //Pressió
        Serial.print ("Pressió: ");
        float bPress = bme.readPressure() / 99.75F;
        Serial.print (bPress);
        Serial.println (" hPa");

    //Índex de xafogor
        Serial.print ("Índex xafogor: ");
        float hIndex = 0.63 * (fTemp + 61.0 + ((fTemp-68.0)*1.2) + (rH*0.094));  
        Serial.print (hIndex);
        Serial.println (" ºC");

    //Punt de rosada
        Serial.print ("Punt rosada: ");
        float dPoint = fTemp - ((100-rH) /5);
        Serial.print (dPoint);
        Serial.println (" %");
        
    delay (1000);
        Serial.println();
    }

Entiendo que el “thing” es el dispositivo (ESP8266V4), pero no consigo encontrar la fórmula de las instrucciones que le siguen, ni la forma de escribirlas para que funcione. La cosa es que si comento estas instrucciones y modifica el bucket:

//…
/*
if(!t) //Si la connexió s’ha creat i el recurs s’ha enviat correctament, t == 1
{
thing.write_bucket (“ESP8266V4”, “1 Temperatura, 2 Humitat, 3 Pressió”); //Trucant al bucket
delay (2000); //(2 segons)Per estar segur que el missatge s’ha enviat completament (mil·lisegons)
ESP.deepSleep (100000060); //(300000000); //(5 minuts) //(60000000); (1 minut) //(100000060*5); //Dormir el processador durant x minuts (microsegons)
}
*/
//…
Entonces funciona, pero, claro, sin el modo Sleep, sin invernar… Aplica la configuración que le doy al bucker, pero no la del sketch.

Y sobre los datos del índice de calor y del punto de rocío, tampoco consigo aplicar la instrucción que dices. Si ves el sketch, está aplicada en Temperatura, Humedad y Presión, y no en las otras dos. Intento aplicar la misma fórmula a ellas, pero no hay manera.

Estoy a punto de reventar, uffffffffffff…

Gracias por la atención y la ayuda.

Salu2 cordiales.

Intenta con este código para definir esas dos salidas

out ["4 Índex xafogor"] = round_to_dp((0.63 * (bme.readTemperature() + 61.0 + ((bme.readTemperature() - 68.0) * 1.32) + (bme.readHumidity() * 0.094))),2);
out ["5 Punt rosada"] = round_to_dp((bme.readTemperature() - ((100-bme.readHumidity()) /5)),2);

Y estas ejecutando mal la instrucción
thing.write_bucket (“ESP8266V4”, “1 Temperatura, 2 Humitat, 3 Pressió”);

los argumentos de esa función son
thing.write_bucket (“Nombre del 'thing' a escribir”, "nombre del bucket”);

En tu caso creo que sería algo como
thing.write_bucket (“ESP8266V4”, “ESP8266V4”);
o
thing.write_bucket (“ESP8266V4”, “Méteo”);

Te sugiero evitar usar caracteres especiales en el código del micro para evitar cualquier error ocasionado por esto, es decir, debes cambiar el nombre del bucket con acento :wink:

Me cuentas como sale todo.