In questo tutorial imparerai come DHT11 e DHT22/AM2302 funzionano i sensori digitali di temperatura e umidità e come puoi usarli con Arduino. Questi sensori sono molto popolari per progetti di elettronica fai-da-te e sono perfetti per stazioni meteorologiche remote, progetti di domotica e sistemi di monitoraggio per piante/giardini.
In questo articolo ho incluso schemi di collegamento e diversi esempi di codice così potrai iniziare a sperimentare con il tuo sensore. Dopo ogni esempio, spiego come funziona il codice, quindi non avrai problemi a modificarlo secondo le tue esigenze.
Per prima cosa daremo un’occhiata alla libreria Adafruit DHT. Poi ti mostrerò come combinare il sensore con un LCD 16×2 per creare una semplice stazione meteorologica.
Materiali
Componenti hardware
| 4 pin DHT11 sensor | × 1 | Amazon |
| 4 pin DHT22/AM2302 sensor | × 1 | Amazon |
| 3 pin DHT11 sensor (consigliato) | × 1 | Amazon |
| 3 pin DHT22/AM2302 sensor (consigliato) | × 1 | Amazon |
| 5 – 10 kΩ resistor (solo per sensori a 4 pin) | × 1 | Amazon |
| Arduino Uno Rev3 | × 1 | Amazon |
| Breadboard | × 1 | Amazon |
| Jumper wires | ~ 10 | Amazon |
| USB cable type A/B | × 1 | Amazon |
| 16×2 character I2C LCD (opzionale) | × 1 | Amazon |
Software
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Come funzionano i sensori di temperatura e umidità DHT11 e DHT22/AM2302?
Se apri un DHT11 o un sensore DHT22/AM2302, vedrai che contiene due elementi sensori: un elemento per l’umidità e un NTC (termistore).
L’elemento per l’umidità è composto da due elettrodi con un substrato che trattiene l’umidità tra di essi. Il sensore misura la resistenza tra gli elettrodi, che cambia in base alla quantità di umidità nell’aria.
Sul retro del sensore trovi un piccolo IC che misura e elabora il segnale analogico. Memorizza anche i coefficienti di calibrazione e fa la conversione da analogico a digitale.
Cos’è l’umidità relativa?
Se guardi il datasheet dei sensori DHTxx, vedrai che misurano l’umidità relativa (RH) dell’aria e non l’umidità assoluta. Ma qual è la differenza? L’umidità assoluta è la quantità di vapore acqueo nell’aria (espressa in g/m³), indipendentemente dalla temperatura. L’umidità relativa invece tiene conto della temperatura.
L’umidità relativa è il rapporto tra la quantità effettiva di vapore acqueo presente nell’aria e la quantità massima di vapore acqueo che l’aria può contenere a una data temperatura.
L’aria calda può contenere più acqua di quella fredda. Questo significa che per la stessa quantità di vapore acqueo, l’umidità relativa nell’aria fredda sarà più alta che in aria calda. Al 100% di umidità relativa, l’aria è satura ed è al punto di rugiada.
Specifiche DHT11
| Tensione di funzionamento | 3.3 – 5.5 V |
| Corrente di funzionamento | Misura: 0.3 mA, standby: 60 μA |
| Intervallo di misura umidità | 5 – 95 % RH ± 5 % RH |
| Intervallo di misura temperatura | -20 – 60 °C ± 2 °C |
| Protocollo di comunicazione | 1-Wire |
| Periodo di campionamento | > 2 secondi |
| Dimensioni corpo | 15.5 x 12 x 5.5 mm |
| Dimensioni pin | 8 mm lunghezza, 2.54 mm passo |
| Vantaggio | Costo ultra basso |
| Costo | Check price |
Per maggiori informazioni puoi consultare il datasheet qui sotto:
Specifiche DHT22/AM2302
| Tensione di funzionamento | 3.3 – 5.5 V |
| Corrente di funzionamento | Misura: 0.5 mA, standby: 15 μA |
| Intervallo di misura umidità | 0 – 99.9 % RH ± 2 % RH |
| Intervallo di misura temperatura | -40 – 80 °C ± 1 °C |
| Protocollo di comunicazione | Protocollo bus 1-Wire |
| Periodo di campionamento | 2 secondi |
| Dimensioni corpo | 25 x 15 x 7 mm, foro di montaggio ⌀ 3 mm |
| Dimensioni pin | 7 mm lunghezza, 2.54 mm passo |
| Vantaggio | Più preciso |
| Costo | Check price |
Puoi scaricare il datasheet per il DHT22/AM2302 qui sotto:
Nota che il AM2302 è semplicemente una versione cablata del sensore DHT22 con 3 fili.

Come puoi vedere, le specifiche del DHT11 e del DHT22/AM2302 sono abbastanza simili. La differenza principale è che il DHT22 è più preciso e ha un intervallo di misura più ampio. Il DHT11 è un po’ più piccolo del DHT22 ed è anche meno costoso.
La cosa bella di questi sensori è che sono intercambiabili, cioè puoi semplicemente sostituire il DHT11 con un DHT22 o viceversa, il cablaggio è esattamente lo stesso. Dovrai solo fare una piccola modifica nel setup del codice, come vedrai più avanti.
Cablaggio – Collegare DHT11 e DHT22/AM2302 ad Arduino Uno
Gli schemi di cablaggio qui sotto mostrano come collegare sensori di temperatura e umidità a 3 o 4 pin all’Arduino Uno. È necessario un resistore di pull-up da 10 kΩ tra la linea del segnale e i 5 V per assicurare che il livello del segnale rimanga alto di default (consulta il datasheet per maggiori dettagli).


Nota che il sensore DHT22/AM2302 è collegato esattamente come il DHT11. Le connessioni sono anche riportate nella tabella qui sotto. Ho numerato i pin da 1 a 4 da sinistra a destra quando i fori del sensore sono rivolti verso di te.
Connessioni DHT11 e DHT22 a 4 pin
| DHT11/DHT22 | Arduino |
|---|---|
| Pin 1 | 5 V |
| Pin 2 | Collegare al pin digitale 2 e ai 5 V tramite resistore da 10 kΩ |
| Pin 3 | Non collegato |
| Pin 4 | GND |
Puoi anche acquistare i sensori montati su una piccola PCB (sensori a 3 pin). Queste breakout board facilitano il collegamento del sensore ad Arduino e includono già un resistore di pull-up. Assicurati di controllare l’etichetta del sensore, l’ordine dei pin può variare a seconda del produttore.

Connessioni DHT11 a 3 pin
| DHT11 a 3 pin | Arduino |
|---|---|
| s | Pin digitale 2 |
| + | 5 V |
| – | GND |
Gli esempi di codice qui sotto usano il pin digitale 2 per ricevere i dati dal sensore, ma puoi cambiarlo con qualsiasi pin digitale tu voglia.

Connessioni DHT22/AM2302 a 3 pin
| DHT22 a 3 pin | Arduino |
|---|---|
| DAT | Pin digitale 2 |
| VCC | 5 V |
| GND | GND |
Installazione delle librerie Arduino necessarie
Il codice qui sotto usa la libreria Adafruit DHT sensor che puoi scaricare da GitHub. Questa libreria funziona solo se hai anche installato la libreria Adafruit Unified Sensor , anch’essa disponibile su GitHub.
Puoi anche scaricare le due librerie cliccando sui pulsanti qui sotto:
Puoi installare la libreria andando su Sketch > Include Library > Add .ZIP Library nell’IDE di Arduino.
Un’altra opzione è navigare su Tools > Manage Libraries… o premere Ctrl + Shift + I su Windows. Si aprirà il Library Manager e aggiornerà la lista delle librerie installate.

Puoi cercare ‘dht’ e ‘adafruit unified sensor’ e cercare la libreria di Adafruit. Seleziona l’ultima versione e clicca su Install.

Esempio di codice Arduino per sensore di temperatura e umidità DHT11/DHT22
Puoi caricare il seguente esempio di codice sul tuo Arduino usando l’IDE Arduino. Poi spiegherò come funziona il codice.
Puoi copiare il codice cliccando sul pulsante in alto a destra nel campo del codice.
/* Arduino example code for DHT11, DHT22/AM2302
and DHT21/AM2301 temperature and humidity sensors.
www.www.makerguides.com */
#include "Adafruit_Sensor.h"
#include "DHT.h"
// Set DHT pin:
#define DHTPIN 2
// Set DHT type, uncomment whatever type you're using!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Initialize DHT sensor for normal 16mhz Arduino:
DHT dht = DHT(DHTPIN, DHTTYPE);
void setup() {
// Begin serial communication at a baud rate of 9600:
Serial.begin(9600);
// Setup sensor:
dht.begin();
}
void loop() {
// Wait a few seconds between measurements:
delay(2000);
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
// Read the humidity in %:
float h = dht.readHumidity();
// Read the temperature as Celsius:
float t = dht.readTemperature();
// Read the temperature as Fahrenheit:
float f = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again):
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Compute heat index in Fahrenheit (default):
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius:
float hic = dht.computeHeatIndex(t, h, false);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" % ");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(f);
Serial.print(" \xC2\xB0");
Serial.print("F ");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(hif);
Serial.print(" \xC2\xB0");
Serial.println("F");
}
Dovresti vedere il seguente output nel monitor seriale (Ctrl + Shift + M):

Spiegazione del codice
Il primo passo è includere le librerie Adafruit DHT e Unified Sensor.
#include "Adafruit_Sensor.h" #include "DHT.h"
Poi dobbiamo definire il pin di collegamento del DHT ad Arduino e impostare anche il tipo di sensore DHT. Nel nostro esempio usiamo un sensore DHT11 collegato al pin 2.
L’istruzione #define serve per dare un nome a un valore costante. Il compilatore sostituirà ogni riferimento a questa costante con il valore definito quando il programma viene compilato. Quindi ovunque menzioni DHTPIN, il compilatore lo sostituirà con il valore 2 durante la compilazione.
// Set DHT pin: #define DHTPIN 2 // Set DHT type, uncomment whatever type you're using! #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301)
Successivamente, devi creare una nuova istanza della classe DHT con il tipo e il collegamento appropriati. Per questo usiamo la funzione DHT(pin,type).
In questo caso ho chiamato il sensore ‘dht’ ma puoi usare altri nomi, come ‘temperature_sensor’ o ‘dht11’ ecc.DHT temperature_sensor = DHT(DHTPIN, DHTTYPE);. Puoi creare più istanze della classe DHT con nomi, pin e tipi diversi. Questo ti permette di usare facilmente 2 o più sensori contemporaneamente.
// Initialize DHT sensor for normal 16mhz Arduino: DHT dht = DHT(DHTPIN, DHTTYPE);
Funzione setup
Nel setup(), iniziamo la comunicazione seriale a 9600 baud. Assicurati che anche il Monitor Seriale sia impostato a 9600! Inizializziamo anche il sensore con dht.begin().
void setup() {
// Begin serial communication at a baud rate of 9600:
Serial.begin(9600);
// Setup sensor:
dht.begin();
}
Funzione loop
La sezione loop() del codice inizia con un ritardo di 2 secondi. Questo ritardo serve a dare tempo al sensore di effettuare le letture. La frequenza massima di campionamento del DHT22 è ogni 2 secondi, mentre quella del DHT11 è una volta al secondo.
// Wait a few seconds between measurements: delay(2000);
Prendere le letture di temperatura e umidità è molto semplice perché la libreria ha diverse funzioni integrate. Per ottenere una lettura dell’umidità in ‘%’, puoi usare la funzione readHumidity(). In questo caso salviamo la lettura nella variabile ‘h’. Nota che è di tipo float.
Quando vuoi usare una funzione sull’oggetto DHT, devi prima specificare il nome che hai dato al sensore. Nel nostro caso è ‘dht’.
// Read the humidity in %: float h = dht.readHumidity();
Prendere le letture di temperatura è altrettanto facile con la funzione readTemperature().
// Read the temperature as Celsius: float t = dht.readTemperature();
Se vuoi ottenere la temperatura in Fahrenheit invece che in Celsius, hai due opzioni. Puoi passare true alla funzione readTemperature, oppure usare la funzione convert:
// Read the temperature as Fahrenheit: float f = dht.readTemperature(true); // Alternative, use convert function: float f = dht.convertCtoF(t);
Poi c’è una piccola sezione di codice che verifica se il sensore è collegato correttamente e sta restituendo una lettura. In caso contrario, verrà stampato un messaggio di errore sul Monitor Seriale.
// Check if any reads failed and exit early (to try again):
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
La libreria ha anche una funzione integrata che può calcolare l’indice di calore combinando le letture di temperatura e umidità. L’ heat index è anche noto come “temperatura percepita” o “temperatura apparente”.
// Compute heat index in Fahrenheit (default): float hif = dht.computeHeatIndex(f, h); // Compute heat index in Celsius: float hic = dht.computeHeatIndex(t, h, false);
Infine, le letture vengono visualizzate sul Monitor Seriale. Nota che la riga Serial.print(" \xC2\xB0"); serve per stampare il simbolo del grado.
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" % ");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(f);
Serial.print(" \xC2\xB0");
Serial.print("F ");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(hif);
Serial.print(" \xC2\xB0");
Serial.println("F");
Esempio di codice per sensore di temperatura e umidità DHT11 e DHT22/AM2302 con LCD I2C e Arduino
Combinando un sensore di temperatura e umidità con un piccolo LCD, puoi creare una stazione meteorologica economica.
Nel seguente esempio userò un LCD caratteri I2C. Dovrai fare qualche collegamento in più ad Arduino per poter controllare l’LCD 16×2. Il sensore DHT11 o DHT22/AM2302 è collegato come prima.
Lo schema di cablaggio qui sotto mostra come collegare un LCD I2C ad Arduino.

Le connessioni sono anche riportate nella tabella seguente:
Connessioni LCD I2C
| LCD I2C | Arduino |
|---|---|
| GND | GND |
| VCC | 5 V |
| SDA | A4 |
| SCL | A5 |
Se non usi un Arduino Uno, i pin SDA e SCL possono trovarsi in posizioni diverse. Un Arduino UNO con layout R3 (pinout 1.0) ha anche i pin SDA (linea dati) e SCL (linea clock) vicino al pin AREF. Consulta la tabella qui sotto per maggiori dettagli.
| Scheda | SDA | SCL |
|---|---|---|
| Arduino Uno | A4 | A5 |
| Arduino Nano | A4 | A5 |
| Arduino Micro | 2 | 3 |
| Arduino Mega 2560 | 20 | 21 |
| Arduino Leonardo | 2 | 3 |
| Arduino Due | 20 | 21 |
Il codice usa la libreria LiquidCrystal_I2C che puoi scaricare da GitHub. Include anche la libreria Wire.h che permette di comunicare con dispositivi I2C. Questa libreria dovrebbe essere preinstallata nell’IDE Arduino.
Il codice qui sotto è per lo più uguale a prima, ma ora visualizziamo temperatura e umidità sull’LCD invece che sul Monitor Seriale.
Puoi copiare il codice cliccando sul pulsante in alto a destra nel campo del codice.
/* Arduino example code for DHT11, DHT22/AM2302
and DHT21/AM2301 temperature and humidity sensors
with I2C LCD. More info: www.www.makerguides.com */
#include "Adafruit_Sensor.h"
#include "DHT.h"
#include "Wire.h"
#include "LiquidCrystal_I2C.h"
// Set DHT pin:
#define DHTPIN 2
// Define SDA and SCL pin for LCD:
#define SDAPin A4 // Data pin
#define SCLPin A5 // Clock pin
// Set DHT type, uncomment whatever type you're using!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Initialize DHT sensor for normal 16mhz Arduino:
DHT dht = DHT(DHTPIN, DHTTYPE);
// Connect to LCD via I2C, default address 0x27 (A0-A2 not jumpered):
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2); //Change to (0x27,20,4) for 2004 LCD
void setup() {
// Setup sensor:
dht.begin();
// Initiate the LCD:
lcd.init();
lcd.backlight();
}
void loop() {
// Wait a few seconds between measurements:
delay(2000);
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
// Read the humidity in %:
float h = dht.readHumidity();
// Read the temperature as Celsius:
float t = dht.readTemperature();
// Read the temperature as Fahrenheit:
float f = dht.readTemperature(true);
// Compute heat index in Fahrenheit (default):
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius:
float hic = dht.computeHeatIndex(t, h, false);
// Print the temperature and the humidity on the LCD:
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" " "\xDF" "C");
lcd.setCursor(0, 1);
lcd.print("Humid: ");
lcd.print(h);
lcd.print(" %");
}
Guida alla risoluzione dei problemi DHT11/DHT22
Quando lavori con questi sensori, potresti ricevere i seguenti messaggi di errore:
“Failed to read from DHT sensor!”
Questo messaggio può apparire nel monitor seriale quando il sensore non restituisce una lettura. Le cause possono essere diverse:
- Tipo di sensore: Assicurati di aver decommentato il DHTTYPE corretto nel setup del codice. Controlla l’esempio sopra.
- Frequenza di campionamento: I sensori DHT sono piuttosto lenti, la frequenza massima di campionamento è circa ogni 2 secondi. Aumentare il ritardo tra le misurazioni potrebbe risolvere questo errore.
- Alimentazione: Anche se i sensori DHTxx possono funzionare da 3.3 a 5 V, il produttore consiglia 5 V. In alcuni casi, alimentare il sensore a 5 V risolve il problema. Assicurati che il tuo microcontrollore supporti anche 5 V sui pin GPIO.
“Errore fatale: Adafruit_Sensor.h: File o directory non trovato”
Potresti ricevere questo errore quando provi a compilare il codice. Significa che non hai installato (correttamente) la libreria Adafruit Unified Sensor .
Scorri un po’ più su in questo post e vedrai dove e come scaricare e installare la libreria.
Conclusione
In questo articolo ti ho mostrato come funzionano i sensori di temperatura e umidità DHT11 e DHT22/AM2302 e come usarli con Arduino.
Spero che tu l’abbia trovato utile e informativo. Per altri sensori di temperatura dai un’occhiata ai nostri LM35 analog temperature sensor with Arduino e TMP36 analog temperature sensor with Arduino tutorial.
Se hai domande, suggerimenti o pensi che manchi qualcosa in questo tutorial, lascia pure un commento qui sotto.

