Buongiorno, oggi vedremo insieme come utilizzare il sensore di umidità e temperatura DHT11 con un micocontrollore Arduino. Si tratta di un sensore molto comune nei kit e, se utilizzata la giusta libreria, anche molto semplice da usare. Il sensore resituisce un numero intero, quindi nè la temperatura nè l’umidità avranno cifre decimali. Se dovesse interessare una precisione maggiore esiste il sensore DHT21 che invece restituisce valori di tipo float. Per affrofondimenti vi invito a visitare il playground di Arduino.
Utilizzeremo:
- Arduino Uno (o modello analogo, io nell’esempio utilizzo un Arduino Nano che è uguale nelle funzionalità ma occupa meno spazio)
- sensore KY-015 o DHT11 (il primo è montato su un pcb e ha già una resistenza, il secondo è ‘nudo’ e la resistenza la dobbiamo mettere noi.) Nell’esempio utilizzerò il KY-015
- resistenza da 10k ohm nel caso si usi il sensore DHT11 ‘nudo’
- libreria dht11 scaricabile da qui oppure dal gestore librerie di arduino
Di seguito lo schema di collegamento in entrambi i casi.
/* codice scritto da Alessandro Oppo per 9minuti.it sulla base degli esempi pubblicati da Rob Tillaart, creatore della libreria. */ #include <dht.h> #define DHT11_PIN 5 dht DHT; int umidita; int temperatura; void setup() { Serial.begin(9600); } void loop() { DHT.read11(DHT11_PIN); umidita = DHT.humidity; temperatura = DHT.temperature; Serial.print("Umidità: "); Serial.println(umidita); Serial.print("Temperatura: "); Serial.println(temperatura); Serial.println(); delay(2000); }
Analizziamo il codice scritto.
1 includiamo la libreria dht.h di Rob Tillaart
2 indichiamo il pin digitale a cui attaccheremo il sensore tramite una #define
4 creazione di un oggetto DHT di tipo dht. Se ad esempio volessimo utilizzare due sensori di temperatura dovremmo scrivere:
dht sensore1;
dht sensore2;
5, 6 dichiarazione di due variabili intere in cui salveremo i valori
10 inizializziamo della porta seriale con un baud rate di 9600
15 chiamiamo il metodo read11 appartenente all’oggetto DHT, come parametro mettiamo il numero del pin digitale
17, 18 salviamo i valori di umidità e temperatura prendendoli dalle proprietà dell’oggetto DHT (humidity e temperature)
20-24 stampa dei valori ricavati
26 attesa di 2000 ms (2 secondi) prima di tornare all’inizio del loop
Faccio notare che se avessimo scritto
Serial.println(DHT.temperature);
avremmo potuto stampare direttamente la temperatura, ho però preferito salvare tutto in una variabile esterna per sottolineare la differenza fra proprietà di un oggetto e variabile normale.
Vediamo ora un altro esempio, ovvero lo sketch dht11_test trovabile nella libreria di Rob Tillaart. Questo sketch è particolarmente utile nel qual caso dovessero esserci dei problemi, infatti ha uno scopo di tipo diagnostico oltre che esemplificativo. Commenterò solamente i passaggi diversi.
// // FILE: dht11_test.ino // AUTHOR: Rob Tillaart // VERSION: 0.1.01 // PURPOSE: DHT library test sketch for DHT11 && Arduino // URL: // // Released to the public domain // #include <dht.h> dht DHT; #define DHT11_PIN 5 void setup() { Serial.begin(9600); Serial.println("DHT TEST PROGRAM "); Serial.print("LIBRARY VERSION: "); Serial.println(DHT_LIB_VERSION); Serial.println(); Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)"); } void loop() { // READ DATA Serial.print("DHT11, \t"); int chk = DHT.read11(DHT11_PIN); switch (chk) { case DHTLIB_OK: Serial.print("OK,\t"); break; case DHTLIB_ERROR_CHECKSUM: Serial.print("Checksum error,\t"); break; case DHTLIB_ERROR_TIMEOUT: Serial.print("Time out error,\t"); break; case DHTLIB_ERROR_CONNECT: Serial.print("Connect error,\t"); break; case DHTLIB_ERROR_ACK_L: Serial.print("Ack Low error,\t"); break; case DHTLIB_ERROR_ACK_H: Serial.print("Ack High error,\t"); break; default: Serial.print("Unknown error,\t"); break; } // DISPLAY DATA Serial.print(DHT.humidity, 1); Serial.print(",\t"); Serial.println(DHT.temperature, 1); delay(2000); } // // END OF FILE //
21-25 stampa a schermo, da notare che il codice eseguito nella funzione setup viene eseuito una sola volta, all’avvio.
23 DHT_LIB_VERSION è una proprietà della libreria in cui è salvato la versione della stessa
25 \t è il comando per tabulare
32 chiamata del metodo read11() dell’oggetto DHT, il metodo restituisce come return un intero salvato all’interno della variabile chk.
33-56 costrutto di tipo switch case, a seconda del valore della variabile chk il programma eseguirà il codice contenuto tra un case e il proprio break. Se ad esempio la variabile contenesse DHTLIB_OK, il codice eseguito sarebbe Serial.print(“OK,\t”). Il break interromperebbe il costrutto switch e il codice riprenderebbe dalla riga 57. Come avrete notato i case in questo caso non sono numeri interi ma insiemi di caratteri, questo perchè l’autore della libreria ha dichiarato una #define assegnando un valore intero ad una parola, esattamente come abbiamo fatto noi per la dichiarazione del pin del sensore alla riga 2 dell’esempio precedente.
58-60 stampa dei valori, da notare il secondo parametro nella funzione Serial.print. Mi riferisco all’1, il quale segna la precisione dei numeri decimali, in questo caso, ovviamente, uno. Se noi provassimo a mettere 2 avremmo una precisione a doppia cifra, ma, come abbiamo visto prima, il sensore DHT11 restituisce un valore intero.
Se qualcosa non dovesse essere chiaro, se aveste suggerimenti o critiche, vi pregherei di indicarmelo nei commenti.
Grazie mille,
Alessandro