Añadir "índice de calor" al Data Buckets (SOLUCIONADO)


#1

Buenos días. Estoy trabajando con Arduino + ESP8266 + BME280 y Thinger. Dejando de lado algun problema que tengo con los saltos horarios, que ya trato en otro apartado, mi proyecto imprime los datos de Temperatura, Humedad y Presión en Thinger correctamente. Hasta aquí, casi todo bien.

La cosa es que le he añadido el índice de calor y punto de rocío al sketch. En este tengo las instrucciones para poder leer estos datos en serial. y los veo correctamente, pero no consigo que estos datos (índice de calor y punto de rocío) puedan ser traspasados al Data Buckets de Thinger.

El sketch con el el trabajo es este:

#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 "loko"
#define deviceId "ESP8266V3"
#define deviceCredentials "jmnnfrr1955"

ThingerESP8266 thing (username, deviceId, deviceCredentials);
 
//Paràmetres de connexió WiFi
const char WiFi_ssid[] = "MIWIFI_2G_PtG4";  //Nom real de xarxa: WIFI_5G_PtG4
const char WiFi_password[] = "sh96xFX2";  //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 ("-- Test predeterminat --");
    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


thing["BME280"] >> [](pson& out)  //Inicializació de la lectura de dades des de l'API
{
out ["Temperatura"] = round_to_dp(bme.readTemperature(), 2);  //*4*
out ["Humitat"] = round_to_dp (bme.readHumidity(), 2); //*4*
out ["Pressió"] = round_to_dp (bme.readPressure() / 100, 2);  //*4* i *5*

out ["Índex xafogor"];
float hIndex = 0.63 * (bme.readTemperature() + 61.0 + ((bme.readTemperature() - 68.0) * 1.2) + (bme.readHumidity() * 0.094));

};

}



void loop()  
{ 
    thing.handle();
    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
{  
//Temperatura  
    Serial.print ("Temperatura: ");
//    Serial.print (bme.readTemperature() / 1.10); //*1*(bme.readTemperature());
//    Serial.println (" *C");
    
    float fTemp = bme.readTemperature() / 1.09;//03; /////1.12;   //()*9.0/5.0+32;  //////////////////////
    Serial.print (fTemp);  //////////////////////////////
    Serial.println (" ºC");  //////////////////////////////////////

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

//Pressió
    Serial.print ("Pressió: ");
//    Serial.print (bme.readPressure() / 100.1F);  //*3*
//    Serial.println (" hPa");

    float bPress = bme.readPressure() / 99.75F;  //100.0F / 33.8638866667;  ////////////
    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)); //*6* //float hIndex = 0.5 * (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();
   
}

La cosa es que tengo claro estas instrucciones, que envían los datos a Thinger:

out [“Temperatura”] = round_to_dp(bme.readTemperature(), 2); //4
out [“Humitat”] = round_to_dp (bme.readHumidity(), 2); //4
out [“Pressió”] = round_to_dp (bme.readPressure() / 100, 2); //4

Estos parámetros los recoge directamente del sensor BME280, pero no se cómo añadir, con que instrucción añadiría los datos del índice de calor y del punto de rocío.
Entiendo que los de Temperatura, Humedad y Presión són datos específicos y “puros”, que da el sensor, pero los otros dos provienen de fórmulas y, por tanto, imagino que las instrucciones no seran iguales a las anteriores.

He probado todo lo que se me ha ocurrido, pero no hay manera.

Agradecería que si alguien que lo ha hecho o sabe cómo hacerlo, me echara un cable.

Gracias por la atención y la ayuda.

Salu2 cordiales.


#2

Hola @jaume,

No sé si te estoy entendiendo bien pero… hay algo raro en la declaración de tu recurso de salida, ¿has probado con…?

thing["BME280"] >> [](pson& out)  //Inicializació de la lectura de dades des de l'API
{
out ["Temperatura"] = round_to_dp(bme.readTemperature(), 2);  //*4*
out ["Humitat"] = round_to_dp (bme.readHumidity(), 2); //*4*
out ["Pressió"] = round_to_dp (bme.readPressure() / 100, 2);  //*4* i *5*

out ["Índex xafogor"] =(float)( 0.63 * (bme.readTemperature() + 61.0 + ((bme.readTemperature() - 68.0) * 1.2) + (bme.readHumidity() * 0.094)));

};

#3

Jtrinc, ERES UN CRAK!!! Ya está solucionado. había probado esta fórmula, pero no había caído en colocar entre paréntesis el float. Por eso, sin paréntesis, no me compilaba.

Muchas gracias, mira que llevo días peleándome con el tema…

Una pregunta más:

Es posible mover las columnas que imprime el Thinger?

Ahora las imprime así, en este orden:

Quisiera colocar las columnas en este orden: Temperatura, Humedad, Presión, Índice calor y Punto de rocío. Es posible? Modificando la posición en el sketch no cambia esta presentación. Hay alguna manera?

Salu2


#4

jajaj Me alegro!
Lo de las columnas… la verdad es que no lo he intentado nunca, es posible que sea orden alfabético, quizá funcione si incluyes un id numérico al principio.

un saludo!


#5

Muchas gracias, Jtrinc26, lo has vuelto a clavar!!! Colocándole una ID, lo imprime cómo quiero. Tienes razón, Thinger muestra las columnas por orden alfabético.

Muchas gracias de nuevo, y cierro este hilo. Has sido de inmensa ayuda!!!

Salu2 cordiales :wink::blush: