Leggere la temperatura e l’umidità con il sensore DHT22 e il microcontrollore ESP32
Introduzione
La funzione più semplice, anche definita “Hello World”, per un’applicazione IOT è sicuramente quella della rilevazione della temperatura e in questo post andremo ad analizzare il codice e le caratteristiche del sensore di temperatura maggiormente utilizzato dai makers.
Per questo tipo di applicazione useremo uno dei migliori sensori di temperatura che appartiene alla famiglia DHT.
I sensori di temperatura DHT si distinguono per due diverse tipologie: DHT11 e DHT22, entrambi dalle ottime caratteristiche, le differenze principali sono una maggiore risoluzione e range di temperatura a favore del secondo modello.
Caratteristiche e differenze tra DHT22 e DHT11
Il sensore ha tre terminali, due per l’alimentazione e uno di comunicazione che può essere sia input che output e per questo motivo è un open collector di conseguenza è necessario inserire un resistore di pull-up del valore di 1kΩ.
Entrambi i sensori possono rilevare la temperatura e il tasso di umidità, per ogni coppia di valori letti, il sensore invia al microcontrollore una stringa di 40 bits, che ha il seguente formato:
- 16 data bits: tasso di umidità
- 16 data bits: temperatura
- 8 data bits: check-sum
Un esempio della stringa di bit inviata dal sensore al microcontrollore:
La conversione da binario a decimale segue la regola riportata nell’esempio seguente:
Se il bit più significativo dei 16 bits della temperatura è uguale ad “1” significa che la temperatura letta è minore di zero.
Il microcontrollore può eseguire un controllo sulla correttezza dei dati ricevuti grazie agli ultimi 8 bits inviati dal sensore, come riportato nell’esempio di seguito:
Somma 0000 0010 + 1000 1100 + 0000 0001 +0101 1111 = (1110 1110) Check-Sum
Il microcontrollore esegue la somma dei bits ricevuti, come riportato sopra ed effettua un controllo sull’ultimo byte ricevuto, se i due bytes sono identici il microcontrollore può considerare i dati ricevuti come corretti, altrimenti li deve scartare.
Le differenze tra i due sensori sono riportata nella seguente tabella comparativa:
Il sensore DHT22 ha decisamente caratteristiche migliori, ad un costo leggermente superiore.
I due sensori forniscono una misura dell’umidità e temperatura già calibrata, il valore letto, corrisponde al valore reale della grandezza misurata.
Ogni sensore è compensato in temperatura e calibrato in una camera termica dove si calcola il coefficiente di proporzionalità è memorizzato all’interno del sensore in una memoria OTP (One Time Programmabile).
Codice e applicazione
Lo schema elettrico di questa applicazione è riportata in Figura 2
Prima di procedere alla scrittura del codice, dobbiamo caricare la libreria del sensore DHT22, come indicato nella gif di seguito.
#include "DHT.h" #define DHTPIN 4 //il pin d'ingresso del microcontrollore dove e' connesso il sensore // togliere il commento solo al tipo di sensore usato //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 //#define DHTTYPE DHT21 // DHT 21 (AM2301) // inizializziamo il sensore DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); } void loop() { // ad ogni lettura introduciamo un ritardo di due secondi delay(2000); // leggiamo l'umidita' float h = dht.readHumidity(); // Leggiamo la temperatura in gradi centigradi float t = dht.readTemperature(); // controlliamo se abbiamo letto correttamente i dati . if (isnan(h) || isnan(t) ) { Serial.println(" La lettura e' fallita"); return; } Serial.print("Umidita': "); Serial.print(h); Serial.print("% Temperatura: "); Serial.print(t); Serial.println(""); }