Gestiamo un sensore DHT22 con Arduino
Posted by hosiris su novembre 7, 2011
Tempo fa ho descritto una metodologia che ci permettesse di sfruttare un sensore di temperatura per ottenere delle statistiche sull’andamento di questo parametro.
Al fine di costruire una stazione meteo completa, ho modificato il progetto precedente utilizzando un sensore DHT22 che trova integrati sia un sensore di temperatura che un sensore di umidità.
Comunque questo sarà un progetto temporaneo.
In un prossimo articolo mostrerò come utilizzare un sensore di pressione ed in conclusione scriverò un bel tutorial completo di tutte le parti, guardando il sistema nel suo insieme.
Reputo comunque importanti questi passaggi intermedi perché, secondo me, permettono una maggiore comprensione. Ma passiamo alla parte interessante.
Come sempre diamo una bella letta al datasheet, così da poter creare il circuito di adatto:
A questo punto sarà necessario scaricare la libreria del sensore per Arduino: Libreria DHT22.
Una volta preparato tutto possiamo passare alla scrittura del codice:
#include
#define DHT22_PIN 2
DHT22 myDHT22(DHT22_PIN);
void setup(void)
{
Serial.begin(9600);
}
void loop(void)
{
DHT22_ERROR_t errorCode;
delay(5000);
Serial.print("Requesting data...");
errorCode = myDHT22.readData();
switch(errorCode)
{
case DHT_ERROR_NONE:
Serial.print("Got Data ");
Serial.print(myDHT22.getTemperatureC());
Serial.print("C ");
Serial.print(myDHT22.getHumidity());
Serial.println("%");
break;
case DHT_ERROR_CHECKSUM:
Serial.print("check sum error ");
Serial.print(myDHT22.getTemperatureC());
Serial.print("C ");
Serial.print(myDHT22.getHumidity());
Serial.println("%");
break;
case DHT_BUS_HUNG:
Serial.println("BUS Hung ");
break;
case DHT_ERROR_NOT_PRESENT:
Serial.println("Not Present ");
break;
case DHT_ERROR_ACK_TOO_LONG:
Serial.println("ACK time out ");
break;
case DHT_ERROR_SYNC_TIMEOUT:
Serial.println("Sync Timeout ");
break;
case DHT_ERROR_DATA_TIMEOUT:
Serial.println("Data Timeout ");
break;
case DHT_ERROR_TOOQUICK:
Serial.println("Polled to quick ");
break;
}
}
Un semplicissimo tratto di codice in cui non facciamo altro che leggere dal pin dati del sensore e restituire i valori sul monitor seriale.
Nel seguente video è possibile vedere il risultato:
Buon divertimento!
Frattanto nella blogosfera #41 « Ok, panico said
[…] Gestiamo un sensore DHT22 con Arduino ::: HosiriS […]
Francesco said
Ciao ma da quanto è la resistenza nell’esempio?
Francesco said
ho messo una resistenza da 10 kohm mi legge lla temp e l’umidità ma solo ogni tanto…le altre volte mi dà sync timeout!
hosiris said
Ciao,
la resistenza è da 4.7kOhm.
Anceh io ho avuto il problema del timeout, puoi risolvere giocando con i delay, quelli che ho messo nell’esempio rispondevano bene con il mio sistema.
Francesco said
in che senso rispondevano bene con il tuo sistema? 5000ms so sempre 5000ms! e poi la tua resistenza ha l’ultimo colore giallo che va corretto a rosso per avere il valore di 4.7 k….così sono 470 K ;)….cmq grazie mille per la risposta e a presto!
hosiris said
Si hai ragione, è normale che 5s so sempre gli stessi, magari ci ritardi piccolissimi sulle trasmissioni di cui non teniamo conto e che fanno la differenza. Scusa per la confusione ma non mi ero accorto di aver sbagliato il valore della resistenza nello schema, cercherò di correggere al più presto.
Francesco said
quindi non ho cmq capito come e in che senso “giocare” con il delay!
hosiris said
Prova ad aumentare un po’ il ritardo!
hosiris said
Cmq potresti anche guardare l’ultimo articolo (MeteArduino) in cui trovi la descrizione dell’intera stazione meteo.
federica said
come potrei questo prolema? case DHT_ERROR_ACK_TOO_LONG:
hosiris said
Ciao, anche io ho avuto qualche volta lo stesso problema. Per risolvere dovresti apportare una modifica alla libreria DHT22. All’interno del codice devi cercare la linea in cui viene gestito quell’errore (è sufficiente fare una ricerca con la stringa DHT_ERROR_ACK_TOO_LONG) e aumentare il tempo.
federica said
no credo sia perchè avevo il sensore collegato al contrario perchè nell’imagine non è chiaro qual è il fronte e quale i retro