Indice di calore heat index con SHT1 11 e libreria sensiron

...vorrei visualizzare su un display LCD 20x4 oltre alla temperatura ed umidita fornita dal SHT11 l'indice di calore; non saprei come calcolarlo avendo disponibili la temperatura e l'umidità (che visualizzo regolarmente sul display) ...riporto di seguito quello che ho trovato come calcolarlo.
Sono una frana, non saprei come tradurlo in 'codice arduino' ... chi può aiutarmi

grazie

[i]
L’indice Humidex (H) è così formulato:
H = T + 5/9 * (e-10), cioè
H = T + 0,5555 * (e-10)
dove T è la temperatura dell’aria (in °C), ed "e" è la pressione di vapore dell’aria (hPa) osservata, per esempio tramite la misura con uno psicrometro. Poiché quest'ultima grandezza non è facile da reperire, la si può calcolare a partire dall'umidità relativa:
e = (6,11210^(7,5T/(237,7+T))*UR/100)
con T = temperatura dell'aria (°C) e UR = umidità relativa dell'aria (%).
H non ha un’unità di misura propria, pertanto si può abitualmente associare alla stessa unità della temperatura (°C) anche se si tratta di un indice e non di una grandezza fisica.
Facciamo un esempio: la temperatura dell'aria misurata da un termometro è di 34 °C, l'umidità relativa è del 60 %

  • ricaviamo prima "e": (6,11210^(7,534/(237,7+34))*60/100) = 31,832
  • H vale dunque: 34 + 0,5555 * (31,832 - 10) = 46
    [/b][/b][/i]

Ecco un comodo calcolatore per Humidex:
www.physlink.com/reference/weather.cfm

Nota che è presente anche la formula per calcolarlo in cui le temperature sono espresse in °K, compresa la temperatura del punto di rugiada (dewpoint).

... si grazie per l'interessamento; avevo trovato anche io diversi siti e le formule dove poter calcolare l'indice di calore partendo dalla temperatura ed umidità.
il mio problema è 'tradurre' la formula per il calcolo dell'heat index in codice arduino; ho fatto un po di prove partendo dallo sketch che uso che visualizza sul display temperatura, umidità e dewpoint ma ho fatto solo casini........sò 'muovermi' abbastanza bene con l'hardware ma con il software sono una frana.....
grazie

Lascio a te l'onere della verifica...

float Humidex(float Tair, float DewPoint) {
  float E = 6.11 * exp(5417.7530 * ((1/273.16) - (1/DewPoint)))
  float H = 0.5555 *(E - 10.0);
  return Tair + H;
}

cyberhs:
Lascio a te l'onere della verifica...

float Humidex(float Tair, float DewPoint) {

float E = 6.11 * exp(5417.7530 * ((1/273.16) - (1/DewPoint)))
  float H = 0.5555 *(E - 10.0);
  return Tair + H;
}

....perfetto, grazie!!... stasera provo se funziona e ti faccio sapere

cyberhs:
Lascio a te l'onere della verifica...

float Humidex(float Tair, float DewPoint) {

float E = 6.11 * exp(5417.7530 * ((1/273.16) - (1/DewPoint)))
 float H = 0.5555 *(E - 10.0);
 return Tair + H;
}

ciao Cyberhs.... devo ancora disturbarti, ho provato ad aggiungere i tuoi suggerimenti ma non ne sono venuto a capo di niente.. forse non li ho inseriti nel punto corretto dello scheck oppure ho fatto altri pasticci......
saresti così gentile da verificare lo sheck e se ho inserito correttamente i tuoi suggerimenti?....
adesso il display mostra correttamente temepratura, umidita e dewpoint ...quando aggiungo le tue righe e lancio la verifica nella finestra in basso dell'ide vengono visualizzato un po di errori...
grazie

/*

  4 APRILE 2014
  TEMPERATURA UMIDITA E DEWPOINT CON SENSORE SHT11 SENSIRON
  
*/ 




#include <LiquidCrystal.h>
#include "Sensirion.h"






int greenLED=8;	                //Pin7 = Green LED
int redLED=9;			//Pin8 = Red LED
int blueLED=10;	                //Pin9 = Blue LED










#define sensirionDataPin  7      //pin data sensore collegato al pin 7
#define sensirionClockPin 6      //pin clock sensore collegato al pin 6

float temperature;
float humidity;
float dewpoint;

//float humidex;




//------------------PER INDICE DI CALORE  --------------------------



   float humidex(float temperature, float dewpoint) {
   float E = 6.11 * exp(5417.7530 * ((1/273.16) - (1/dewpoint)))
   float H = 0.5555 *(E - 10.0);
   return temperature + H;
   }

//------------------PER INDICE DI CALORE  --------------------------









Sensirion tempSensor = Sensirion(sensirionDataPin, sensirionClockPin); 






// initialize the LiquidCrystal library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);



void setup()
{
  

 
  
  
  pinMode(redLED, OUTPUT);			  //LED set to output
  pinMode(blueLED, OUTPUT);			//LED set to output
  pinMode(greenLED, OUTPUT);			//LED set to output
  
 
  
  
  
  lcd.begin(20, 4);
  lcd.clear();
  
  
  
  
  lcd.setCursor(0,0);
  lcd.print("    A R D U I N O");
  lcd.setCursor(0,1);
  lcd.print("     TEMPERATURA ");
  
  lcd.setCursor(0,2);
  lcd.print("     UMIDITA E ");
  
  lcd.setCursor(0,3);
  lcd.print("DEWPOINT  CON  SHT11");
  
  
// delay(5000);
  lcd.clear();
  


  
  
 delay(1000);
  
  
  }


void loop()
{
  
  
   tempSensor.measure(&temperature, &humidity, &dewpoint);

if (temperature >= 24)                        //temperatura maggiore o uguale a 24 led rosso acceso
  {
    digitalWrite (redLED, LOW);	        //led rosso acceso
    digitalWrite (blueLED, HIGH);        //led blu spento
    digitalWrite (greenLED, HIGH);       //lev verde spento
 

  }
  else if ((temperature < 24) && (temperature >20))   //temperatura da 20 a 24 led verde acceso
  {
    digitalWrite (redLED, HIGH);	//led rosso spento
    digitalWrite (blueLED, HIGH);	//led blu spento
    digitalWrite (greenLED, LOW);       //led verde acceso

  }
   else	if ( temperature <= 20)              //temperatura minore o uguale a 20 led blu acceso
  {
    digitalWrite (redLED, HIGH);      //led rosso spento
    digitalWrite (blueLED, LOW);	//led blu acceso
    digitalWrite (greenLED, HIGH);	//led verde spento

}


  
  
  //lcd.clear();
  lcd.setCursor(0, 0); 
  lcd.print("TEMPERATURA");
  lcd.setCursor(13, 0); 
 
  
 lcd.print(temperature);
 
 
 
  lcd.print (" C"); 

    
  lcd.setCursor(0,1);
  lcd.print("UMIDITA'");
  lcd.setCursor(13, 1);
  lcd.print(humidity);
  
  lcd.print(" %");
  
  

  
  lcd.setCursor(0,2);
  lcd.print("DEWPOINT");
  lcd.setCursor(13, 2); 
  lcd.print(dewpoint);
  
  lcd.print(" C");
  




  lcd.setCursor(0,3);
  lcd.print("HUMIDEX");
  lcd.setCursor(13, 3); // bottom lef
  lcd.print(humidex);
  
  lcd.print(" C");
  

  
  
}
 
 
 /* come calcolare indice di calore
 
 L’indice Humidex (H) è così formulato:
 H = T + 5/9 * (e-10), cioè
 
 H = T + 0,5555 * (e-10)
 dove T è la temperatura dell’aria (in °C), ed "e" è la pressione di vapore dell’aria (hPa) osservata, per esempio tramite la misura con uno psicrometro.
 Poiché quest'ultima grandezza non è facile da reperire, la si può calcolare a partire dall'umidità relativa:
 
 e = (6,112*10^(7,5*T/(237,7+T))*UR/100)

 con T = temperatura dell'aria (°C) e UR = umidità relativa dell'aria (%).

 H non ha un’unità di misura propria, pertanto si può abitualmente associare alla stessa unità della temperatura (°C) anche se si tratta di un indice e non di una grandezza fisica.

 Facciamo un esempio: la temperatura dell'aria misurata da un termometro è di 34 °C, l'umidità relativa è del 60 %

 - ricaviamo prima "e": (6,112*10^(7,5*34/(237,7+34))*60/100) = 31,832

 - H vale dunque: 34 + 0,5555 * (31,832 - 10) = 46

 Ovvero la sensazione di caldo sul corpo umano risulta pari a 46 °C.
 
 
 
//Dex point and humidex calculator
//Humidex = (air temperature) + h
// h = (0.5555)*(e - 10.0);
// e = 6.11 * exp(5417.7530 * ((1/273.16) - (1/dewpoint)))

// http://www.physlink.com/reference/weather.cfm

// heat index (HI) or humiture 
// http://en.wikipedia.org/wiki/Heat_index
// http://www.nws.noaa.gov/os/heat/index.shtml#heatindex
//HI = -42.379 + 2.04901523T + 10.14333127R - 0.22475541TR - 6.83783x10
//    -3T2 - 5.481717x10 - 2R2 + 1.22874x10 -3T2R + 8.5282x10
// -4TR2 - 1.99x10-6T2R2
// where T = ambient dry bulb temperature (°F)
// R = relative humidity (integer percentage).
// http://www.4wx.com/wxcalc/formulas/heatIndex.php


//Heat Index = -42.379 + (2.04901523 x T) + (10.14333127 x R) - (0.22475541 x T x R) - (6.83783x10-3 x T2) - (5.481717x10-2 x R2) + (1.22874x10-3 x T2 x R) + (8.5282x10-4 x T x R2) - (1.99x10-6 x T2 x R2)
// Where, 
//T = Temperature in ?F
// R = Relative Humidity in %
// Heat index is utilized only in warm weather  >=70° F
// http://www.gorhamschaffler.com/humidity_formulas.htm
 
 
 */

Ricorda che il codice deve essere inserito con l'apposito tag "#".

Hai detto che hai avuto degli errori, ma quali?

cyberhs:
Ricorda che il codice deve essere inserito con l'apposito tag "#".

Hai detto che hai avuto degli errori, ma quali?

....mi scuso per il codice inserito qui;
ti riporto quello che viene visualizzato nella finestra in basso quando clicco su verifica:

sketch_apr09b.ino: In function 'float humidex(float, float)':
sketch_apr09b:50: error: expected ',' or ';' before 'float'
sketch_apr09b:51: error: 'H' was not declared in this scope
sketch_apr09b.ino: In function 'void loop()':
sketch_apr09b:191: error: call of overloaded 'print(float (&)(float, float))' is ambiguous
/Applications/Arduino 1.05.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print.h:58: note: candidates are: size_t Print::print(char) <near match>
/Applications/Arduino 1.05.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print.h:59: note:                 size_t Print::print(unsigned char, int) <near match>
/Applications/Arduino 1.05.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print.h:60: note:                 size_t Print::print(int, int) <near match>
/Applications/Arduino 1.05.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print.h:61: note:                 size_t Print::print(unsigned int, int) <near match>
/Applications/Arduino 1.05.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print.h:62: note:                 size_t Print::print(long int, int) <near match>
/Applications/Arduino 1.05.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print.h:63: note:                 size_t Print::print(long unsigned int, int) <near match>

...non saprei proprio come ovviare... intanto ti ringrazio del tuo interessamento.
ciao

Nella mia routine manca un terminatore di istruzione ";":

float E = 6.11 * exp(5417.7530 * ((1/273.16) - (1/dewpoint)));

Inoltre il punto di rugiada (dewpoint) dovrebbe essere espresso in °K

Antal, il codice ed i messaggi di errore del terminale ricordati di includerli con i tag appositi

...eccomi sono ancora qui (per vostra sfortuna)... allora vi aggiorno su quello che ho fatto:
ho ridotto il codice all'osso, adesso viene compilato regolarmente senza errori ed il display mi mostra i valori di temperatura, umidita e dewpoint (fin qui non vi sono problemi visto che per avere questi 3 parametri vengono forniti dal sensore e non c'è da far nessun calcolo); il problema è l'indicazione dell'indice di calore (HUMIDEX) che viene calcolato in questo modo:

HUMIDEX = temperature + h

float e = 6.11 * exp(5417.7530 * ((1/273.16) - (1/ dewpoint)));
float h = 0.5555 *(e - 10.0);

ho fatto un po di prove ed ho notato che il valore h da sommare alla temperatura per ottenere il valore di HUMIDEX, con la formula inserita nel codice, ottengo un valore fisso non dipendente dal valore dewpoint e negativo...il valore h è sempre -5.55

di seguito il codice (spero di inserirlo correttamente ) potete darci un'occhiata se vi sono errori, cose strane o manca qualcosa ?
grazie
...ho allegato il file, non trovo come inserirlo con l'apposito tag

INDICE_DI_CALORE.ino (1.38 KB)

Per calcolare humidex dei prima calcolare E e poi H: non puoi cambiare l'ordine del calcolo!

Inoltre ha convertito il dewpoint in gradi °K?

cyberhs:
Per calcolare humidex dei prima calcolare E e poi H: non puoi cambiare l'ordine del calcolo!

Inoltre ha convertito il dewpoint in gradi °K?

...scusa l'ignoranza, ma nel listato non è già così?.. prima è calcolato il valore di 'e ' poi quello di 'h'... dopo di che sommo il valore di h alla temperatura

lcd.print(temperature + h);....................sbaglio qualcosa?

Per convertire in kelvin basta aggiungere 273 al valore di dewpoint espresso in gradi centigradi gusto?
float e = 6.11 * exp(5417.7530 * ((1/273.16) - (1/ dewpoint+273)));

edit:
il problema credo che sia nella formula per calcolare il valore di 'e', .......il risultato è sempre 0, indipendentemente dal valore di dewpoint inserito

Per convertire in kelvin basta aggiungere 273 al valore di dewpoint espresso in gradi centigradi gusto?
float e = 6.11 * exp(5417.7530 * ((1/273.16) - (1/ dewpoint+273)));

No, sbagliato:

float e = 6.11 * exp(5417.7530 * ((1/273.16) - (1/ (dewpoint+273.15))));

...ragazzi, scusate se ci torno su ma non ci vengo a capo!!
chi dà un'occhio allo Sketch di seguito e mi da qualche consiglio su come far visualizzare l'indice di calore 'HUMIDEX'
il valore dovrebbe essere calcolato in questo modo: HUMIDEX = (temperature) + h

e = 6.11 * exp(5417.7530 * ((1/273.16) - (1/dewpoint+273.16)));

h = 0.5555 *(e - 10.0);

il problema è che 'h' risulta essere sempre un numero fisso ed indipendente dal valore di dewpoint (risulta essere sempre -5.55) .....la formula è corretta, chi può aiutarmi, cosa sbaglio?
grazie

/*
  12 APRILE 2014
  TEMPERATURA UMIDITA E DEWPOINT CON SENSORE SHT11 SENSIRON
*/ 


#include <LiquidCrystal.h>
#include "Sensirion.h"


#define sensirionDataPin  7      //pin data sensore collegato al pin 7
#define sensirionClockPin 6      //pin clock sensore collegato al pin 6

float temperature;
float humidity;
float dewpoint;



//------------------PER INDICE DI CALORE  --------------------------
 
//HUMIDEX h = (temperature) + h


float e = 6.11 * exp(5417.7530 * ((1/273.16) - (1/dewpoint+273.16)));
  

float h = 0.5555 *(e - 10.0);


//------------------PER INDICE DI CALORE  --------------------------



Sensirion tempSensor = Sensirion(sensirionDataPin, sensirionClockPin); 


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


void setup()
{
  
  lcd.begin(20, 4);
  lcd.clear();
  
}
  

void loop()
{
  
  
   tempSensor.measure(&temperature, &humidity, &dewpoint);
  
 
  lcd.setCursor(0, 0); 
  lcd.print("TEMPERATURA");
  lcd.setCursor(13, 0); 
  lcd.print(temperature);
 
  lcd.print (" C"); 

    
     
  lcd.setCursor(0,1);
  lcd.print("UMIDITA'");
  lcd.setCursor(13, 1);
  lcd.print(humidity);
  
  lcd.print(" %");
  
  

  
  lcd.setCursor(0,2);
  lcd.print("DEWPOINT");
  lcd.setCursor(13, 2); 
  lcd.print(dewpoint);
  
  lcd.print(" C");
  



  lcd.setCursor(0,3);
  lcd.print("HUMIDEX");
  lcd.setCursor(13, 3); // bottom lef
  lcd.print(temperature + h);
  
  lcd.print(" C");
  

  
  
}

Belle tutte quelle righe vuote. A che servono?
Stai scrivendo un tema e più è lungo è più un voto alto ti danno ? ]:slight_smile:

nid69ita:
Belle tutte quelle righe vuote. A che servono?
Stai scrivendo un tema e più è lungo è più un voto alto ti danno ? ]:slight_smile:

...quindi il tuo suggerimento per risolvere il problema è togliere le righe vuote?.....dopo funziona?
...adesso ci provo!!!!!

....ho risolto inserendo nel listato la seguente equazione:
HI = -42.379 + 2.04901523T + 10.14333127RH - 0.22475541TRH - 0.00683783T2 - 0.05481717RH2 + 0.00122874T2RH + 0.00085282TRH2 - 0.00000199T2RH2

adesso il calcolo dell'indice di calore viene eseguito correttamente ed il valore visualizzato sul display.......di seguito il codice per chi interessato.

/*
  26 APRILE 2014
  TEMPERATURA, UMIDITA, DEWPOINT ED INDICE DI CALORE CON SENSORE SHT11 SENSIRON
*/ 


#include <LiquidCrystal.h>
#include "Sensirion.h"


#define sensirionDataPin  7      //pin data sensore collegato al pin 7
#define sensirionClockPin 6      //pin clock sensore collegato al pin 6



float temperature;
float humidity;
float dewpoint;




Sensirion tempSensor = Sensirion(sensirionDataPin, sensirionClockPin); 


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


void setup()
{
  
  lcd.begin(20, 4);
  lcd.clear();
  
}
  

void loop()
{
  
  
  
  //------------------PER INDICE DI CALORE  --------------------------
  
 
  
  float f= (temperature*1.8)+32;
  
  
  float h= (-42.379+(2.04901523*f)+(10.14333127*humidity)-(0.22475541*f*humidity)-(0.00683783*f*f)-(0.05481717*humidity*humidity)+(0.00122874*f*f*humidity)+(0.00085282*f*humidity*humidity)-(0.00000199*f*f*humidity*humidity));
   
   
  //------------------PER INDICE DI CALORE  --------------------------
  
  
  
  
   tempSensor.measure(&temperature, &humidity, &dewpoint);
  
 
  lcd.setCursor(0, 0); 
  lcd.print("TEMPERATURA");
  lcd.setCursor(13, 0); 
  lcd.print(temperature);
 
  lcd.print (" C"); 

    
     
  lcd.setCursor(0,1);
  lcd.print("UMIDITA'");
  lcd.setCursor(13, 1);
  lcd.print(humidity);
  
  lcd.print(" %");
  
  

  
  lcd.setCursor(0,2);
  lcd.print("DEWPOINT");
  lcd.setCursor(13, 2); 
  lcd.print(dewpoint);
  
  lcd.print(" C");
  



  lcd.setCursor(0,3);
  lcd.print("HUMIDEX");
  lcd.setCursor(13, 3); 

   lcd.print((h-32)/1.8);
  lcd.print(" C");
  

  
  
}

Attento che Arduino implementa solo numeri in virgola mobile a 32 bit e per di più con 6/7 cifre significative, ma nel tuo sketch vedo numeri anche con 10 cifre. Non avrai tutta quella precisione, ricorda.

grazie della risposta,
il valore che mi restituisce arduino è molto simile a quello che ottengo da vari siti che permettono il calcolo dell'indice di calore inserendo il valore della temperatura e dell'umidità o dalle tabelle sempre riportate sui vari siti metereologici.... mi sembra che la formula pur contenendo diversi numeri con molti decimali funziona, l'ho provata con diversi valori di umidità e temperatura

Non sò se hai letto dall'inizio... la mia intenzione era di calcolare l'indice di calore con una formula moto più semplice.. questa:
e = (6,11210^(7,5T/(237,7+T))*UR/100)

con T = temperatura dell'aria (°C) e UR = umidità relativa dell'aria (%).

esempio: la temperatura =34 °C, l'umidità relativa = 60 %

e= (6,11210^(7,534/(237,7+34))*60/100) = 31,832

però se faccio eseguire il calcolo ad arduino in questo modo:

float e = 6.112 * exp(7.5*34/(237.7+34))*60/100);

ottengo un valore non corretto

l'indice di calore può anche essere calcolato dal valore di DEWPOINT... ma anche in questo caso se faccio eseguire il calcolo ad arduino ... mi da un valore errato...0

float e = 6.11 * exp(5417.7530 * ((1/273.16) - (1/dewpoint)));

Faccio una domanda da ignorante: per tradurre questa formula e= (6,11210^(7,534/(237,7+34))*60/100) = 31,832 in codice arduino è corretto scriverla in questo modo?

float e = 6.112 * exp(7.5*34/(237.7+34))*60/100);

grazie...