Dudas sobre los datos

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.

P.e, muchísimas gracias, eres un verdadero crac!!! No dejas de sorprenderme. Me he peleado con estos dos problemas, la tira de tiempo y tu, en un plis-plas, lo solucionas… Realmente a-som-bros-so…

Sobre la primera parte, mira que no se ocurrió eliminar el “float”, tal y como está en las otras tres instrucciones. Y mira que no recuerdo de donde salió el ponerlos… Si lo hubiera eliminado desde el principio, las modificaciones y pruebas que hice, habrían funcionado.

Y sobre la segunda parte, no entendí los argumentos, el funcionamiento lógico de la instrucción. Un poco enrevesado, no?

Y sobre la tercera parte, ya intuí que los acentos y caracteres especiales debían modificarse, pero lo dejé para el final, ya que lo tenía controlado.

Ahora parece que todo funciona perfectamente. Solo me quedará adaptar el control del tiempo y controlar el consumo.

Insisto, muchas gracias por la ayuda. Me ha servido para comprender más el funcionamiento de Thinger y el de la programación.

Venga, pues un montón de saludos cordiales.

No es tan enredado si se tiene que campo es el importante, fíjate que el nombre del conjunto que engloba todas las variables (yo le llamo “thing”) es lo que se le coloca a la función como primer argumento (indistintamente del nombre de las variables que se registran), y el segundo argumento es el bucket en el que se va a escribir (porque puedes tener ilimitados buckets en un despliegue propio, por ejemplo).

Cualquier inquietud adicional que tengas, no dudes en preguntar.

Saludos y éxitos

Re-hola de nuevo, Ega, pensaba que ya estaba todo bajo control, pero no es así. De momento sigo alimentando el proyecto desde la red 220V y USB, y las impresiones de los datos es correcta. Las hace cada hora, pero con una deriva horaria que no entiendo:
Cada impresión, de cada hora, la hace tres minutos antes…

Ahora tengo el tema de la hibernación de esta manera:

thing.write_bucket (“ESP8266V4”, “ESP8266V4”); //Trucant al bucket
delay (2000); //(2 segundos) Asegurarse que mensaje se ha enviado OK (milisegundos)
ESP.deepSleep (3540000000+58000000); //59 min + 58 seg = 1h - 2 segundos (en microsegundos)

Es decir, 3.540.000.000 (59 minutos) + 58.000.000 (58 segundos), que con los 2.000 milisegundos (2 segundos) despierto, completan los 60 minutos de 1h.

Este retraso de 3 minutos, también lo produce si pongo:

ESP.deepSleep (3.600.000.000); //60 minutos

Podría entender que el baile horario fuera de pocos segundos arriba o abajo, pero no entiendo el salto de 3 minutos.

Yo entiendo que justo después de los 2 segundos despierto, es decir, después de 1h exacta, inicia la hibernación, y a los 59 minutos y 58 segundos, despierta durante 2 segundos y envía los datos, pero no parece ser este el ciclo.

Tienes idea de qué es lo que estoy haciendo mal? Me equivoco con los cálculos? Con el argumento? De donde salen estos 3 minutos de error?

Gracias por la atención y la ayuda.

Salu2 cordiales.

Mira yo creo que es una tolerancia propia del microcontrolador, o sea el esta contando 3.600 millones de uS, y tiene un error de 180 millones de uS, es decir, un 5% contando microsegundos, no sé si sea aceptable o no.

Es importante recordar que el micro es un dispositivo real, que tiene tolerancias, no sé si esa tolerancia es la propia del dispositivo o si por algún evento se alteró su valor de fábrica, por ejemplo, sé que los osciladores de cristal si se calientan mucho al momento de ser soldados, se altera su frecuencia natural de oscilación, y todos los componentes tienen un comportamiento que se ve alterado de acuerdo a la temperatura de operación.

Yo probaría con otra tarjeta a ver que tal, porque es lo que se me ocurre que pueda estar sucediendo, ya que el proceso de conexión es prácticamente instantáneo como para atribuirle ese retardo que está registrando.

Si puedes probar otra tarjeta, nos avisas que tal :+1:

Hola, Ega, he cambiado la ESP y hace exactamente igual, un desfase de 3 minutos.

Se me ocurrió comentar lo que hace referencia al serial:

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

  y 
...................

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 calor: ");
    float hIndex = 0.63 * (fTemp + 61.0 + ((fTemp-68.0)*1.2) + (rH*0.094)); //*6*
    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 (100);  //(1000);
    Serial.println();
       
}


Y el resultado aún es peor. con esto comentado, recoge los datos cada minuto:

Lo digo, por qué alguna cosa debe de haber en estas instrucciones, que tal vez, interfieran en el envío de lecturas al Thinger.

Cómo lo ves?

Salu2 cordiales

No entiendo, sigue configurado para dormir una hora, y publica los resultados cada minuto?

Para no enredarme la vida, yo lo haría dormir 3 minutos menos a ver que tal va…

Los datos que se publiquen por serial, no deben afectar el funcionamiento del micro, es decir, las instrucciones que tienes allí no van a tardar 3 minutos en ejecutar para atribuirle este retraso al puerto serial, en esa función lo que más tarda es la adquisición de los datos desde el sensor, eso si no sé cuanto tarda pero dudo que tome 3 minutos.

Y sí, es buena práctica evitar las instrucciones que publiquen por el puerto serial al llevar el micro a producción :wink:

Bueno, mientras busco el fallo referente al serial, si lo pongo a dormir 3 minutos menos, sigue imprimiendo los datos con 3 minutos de retardo. Es decir, que modifique lo que modifique, el error sigue produciéndose…

O sea si se despierta 3 minutos antes, introduce un error de 6 minutos??

Eso si esta SUPER raro O.O

Hola, ega, no, se despierta a cada hora justa, pero bailando 3 minutos.

Cambié la placa NodeMCU por otra, y lo mismo. Cambié por una Wemos D1 mini pro y hace exactamente lo mismo, por lo que deduzco que se trata de un problema del sketch.

Lo que estoy intentando revisar, por ahora sin éxito, es aislat el serial. Teóricamente las instrucciones para serial y para Thinger, deberían ser autónomas, pero en mi caso hay alguna interferencia (que no logro localizar), ya que como comenté anteriormente, si comento las instrucciones del serial, entonces imprime en Thinger cada minuto.

Sigo peleándome…

Hi guys,

sorry, I can somewhat read your Spanish, but not express myself precisely enough, so I’ll write in English.

A few remarks.

  1. If you want a precise timing, the best is to get the time from NTP. You go then to sleep for 59 minutes and 55 seconds and just reboot on time and send when the exact hour changes.
  2. The csv downloads are formatted according to US locales.
    If your Windows is set to Spanish locales, Excel will interpret all values as text.
    The best is to shortly go to US locales before importing CSV, then save as Excel.
    You will then get values in your cells, that are ways easier to process/format.

Alternatively, you may just copy the csv file into Window’s text editor, bulk replace commas with tabs, replace dots with commas and will get a CSV that imports gracefully in your Spanish Excel.

Regards