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("");
}








