Temperatura e umidità con Arduino, DHT11 e display LCD
Realizziamo un piccolo termo-igrometro con Arduino: il sensore DHT11 misura temperatura e umidità relativa e i valori vengono mostrati direttamente su un display LCD 16×2.
Cosa imparerai
- che cosa misura il sensore DHT11;
- che cos’è l’umidità relativa;
- come collegare il DHT11 ad Arduino;
- la differenza tra DHT11 a 4 pin e modulo a 3 pin;
- come leggere temperatura e umidità via software;
- come visualizzare i dati su LCD 16×2;
- come gestire errori di lettura e aggiornamenti periodici.
Che cos’è il DHT11
Il DHT11 è un sensore digitale capace di fornire due grandezze ambientali: temperatura e umidità relativa. Per questo è molto usato nei primi progetti di monitoraggio ambientale, nei termo-igrometri e nelle piccole stazioni meteo.
Nella pagina originale il DHT11 viene indicato con un intervallo di temperatura da 0 a 50 °C, umidità relativa dal 20% al 90% e alimentazione compresa tra 3 V e 5,5 V.
| Parametro | Valore riportato nel progetto originale |
|---|---|
| Temperatura | 0–50 °C |
| Precisione temperatura | ±2 °C |
| Umidità relativa | 20–90% RH |
| Precisione umidità | ±5% RH |
| Alimentazione | 3–5,5 V |
Che cos’è l’umidità relativa
L’umidità relativa indica quanta umidità è presente nell’aria rispetto alla quantità massima di vapore acqueo che l’aria può contenere nelle condizioni considerate.
Il valore viene espresso in percentuale. Un’umidità relativa elevata indica che l’aria è più vicina alla saturazione; quando si raggiungono le condizioni di saturazione può comparire condensazione.
Formula dell’umidità relativa presente nel progetto originale.
Come misura il DHT11
Il progetto originale descrive il DHT11 come un dispositivo che rileva l’umidità attraverso un elemento sensibile la cui risposta elettrica cambia con la quantità di vapore acqueo presente nell’aria. Per la temperatura, invece, viene utilizzato un elemento sensibile di tipo termistore.
Materiale necessario
🧰 Kit Arduino consigliato
Per questo e molti altri progetti è comodo avere un kit con sensori, display, breadboard e cavetti già inclusi.
👉 Guarda il kit Arduino consigliatoLink di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
📘 Vuoi imparare Arduino passo dopo passo?
Se vuoi approfondire e realizzare progetti più completi, puoi dare un’occhiata anche ai miei libri dedicati ad Arduino. All’interno troverai spiegazioni semplici, schemi chiari e molti progetti pratici pensati per chi parte da zero.
👉 Scopri i miei libri su ArduinoLink di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
Schema di collegamento
Schema originale del progetto con DHT11 e display LCD.
Collegamento del DHT11
Il sensore utilizza una linea dati digitale. Nel progetto il segnale è collegato al pin 8 di Arduino.
| DHT11 | Collegamento |
|---|---|
| VCC | 5V |
| DATA | Pin 8 Arduino |
| GND | GND |
Pinout del DHT11 presente nella vecchia pagina.
Collegamento del display LCD
Il display usa lo stesso cablaggio parallelo del progetto precedente:
| Segnale LCD | Pin Arduino |
|---|---|
| RS | 12 |
| E | 11 |
| D4 | 5 |
| D5 | 4 |
| D6 | 3 |
| D7 | 2 |
Le librerie utilizzate
Lo sketch usa due librerie: DHT.h per il sensore
e LiquidCrystal.h per il display.
DHT.h veniva incluso due volte
e mancava l’avvio esplicito del sensore. Nella versione qui sotto
ho ripulito lo sketch e aggiunto dht.begin() nel
setup().
Codice Arduino commentato
// ==========================================================
// DHT11 + DISPLAY LCD 16x2 CON ARDUINO
// Visualizza temperatura e umidità sul display
// ==========================================================
// Libreria per il sensore DHT11
#include <DHT.h>
// Libreria per il display LCD
#include <LiquidCrystal.h>
// Pin digitale collegato al segnale DATA del DHT11
#define DHTPIN 8
// Tipo di sensore utilizzato
#define DHTTYPE DHT11
// Crea l'oggetto DHT
DHT dht(DHTPIN, DHTTYPE);
// Crea l'oggetto LCD:
// RS = 12, E = 11, D4 = 5, D5 = 4, D6 = 3, D7 = 2
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
// Inizializza il display 16 colonne x 2 righe
lcd.begin(16, 2);
// Avvia il sensore DHT11
dht.begin();
// Scrive le etichette iniziali
lcd.setCursor(0, 0);
lcd.print("Temp:");
lcd.setCursor(0, 1);
lcd.print("Umid:");
}
void loop() {
// Legge la temperatura in gradi Celsius
float temperatura = dht.readTemperature();
// Legge l'umidità relativa in percentuale
float umidita = dht.readHumidity();
// Controlla se una delle due letture non è valida
if (isnan(temperatura) || isnan(umidita)) {
lcd.setCursor(6, 0);
lcd.print("Errore ");
lcd.setCursor(6, 1);
lcd.print("lettura");
// Attende prima del tentativo successivo
delay(2000);
return;
}
// Mostra la temperatura sulla prima riga
lcd.setCursor(6, 0);
lcd.print(temperatura, 1);
lcd.print(" C ");
// Mostra l'umidità sulla seconda riga
lcd.setCursor(6, 1);
lcd.print(umidita, 1);
lcd.print(" % ");
// Aggiorna i dati ogni 2 secondi
delay(2000);
}
Il codice spiegato passo passo
Definiamo il DHT11
DHTPIN indica il pin 8, mentre DHTTYPE
specifica che il sensore è un DHT11.
Inizializziamo sensore e display
Nel setup() avviamo il display con lcd.begin()
e il sensore con dht.begin().
Leggiamo temperatura e umidità
readTemperature() restituisce la temperatura e
readHumidity() l’umidità relativa.
Controlliamo gli errori
Se il sensore non restituisce una misura valida, il programma mostra un messaggio di errore sul display invece di visualizzare valori errati.
Aggiorniamo il display
I nuovi valori vengono scritti sulle due righe e aggiornati periodicamente.
Perché usare float invece di int
Nel vecchio sketch temperatura e umidità erano memorizzate in variabili
int. Usando float possiamo conservare anche
eventuali cifre decimali restituite dalla libreria e decidere poi
quante mostrarne sul display.
Video dimostrativo
Scarica libreria e sketch originali
Manteniamo disponibili anche i file storici associati alla vecchia pagina.
⬇️ Scarica libreria DHT originale⬇️ Scarica dht-11_lcd.ino
Debug rapido
- controlla che il segnale del DHT11 sia collegato al pin 8;
- verifica VCC e GND;
- controlla se il tuo modulo DHT11 include già la resistenza di pull-up;
- se il display è acceso ma non mostra testo, regola il contrasto;
- verifica i collegamenti RS, E e D4-D7 del display;
- se compaiono valori non validi, controlla il sensore e la libreria;
- non aggiornare il display inutilmente centinaia di volte al secondo.
Come trasformarlo in una piccola stazione meteo
Questo progetto è già la base di una semplice stazione ambientale. Per evolverlo puoi aggiungere altri sensori e funzioni:
- sensore di pressione atmosferica;
- orologio RTC per data e ora;
- memorizzazione delle misure su scheda SD;
- display OLED o LCD I2C;
- ESP32 per inviare i valori via Wi-Fi;
- soglie con LED o buzzer;
- ventola automatica quando la temperatura supera un limite.
DHT11 o sensori più precisi?
Il DHT11 è adatto soprattutto a esercizi didattici e progetti semplici. Se il progetto richiede misure più precise o un intervallo operativo più ampio, si può passare in seguito a sensori ambientali più evoluti mantenendo sostanzialmente la stessa logica generale: acquisizione, controllo del dato e visualizzazione.
Cosa devi ricordare
- Il DHT11 misura temperatura e umidità relativa.
- Il segnale del progetto è collegato al pin 8.
dht.begin()inizializza il sensore.readTemperature()legge la temperatura.readHumidity()legge l’umidità.- Il display LCD rende il progetto autonomo dal Monitor Seriale.
- È buona pratica controllare sempre che la lettura sia valida.
Domande frequenti
Perché il DHT11 restituisce una lettura non valida?
Controlla alimentazione, pin dati, cablaggio e presenza della resistenza di pull-up quando necessaria. Verifica inoltre che il sensore sia stato inizializzato correttamente nel programma.
Posso usare il progetto senza display LCD?
Sì. Puoi inviare temperatura e umidità al Monitor Seriale oppure a un altro sistema di visualizzazione.
Posso sostituire il display con uno I2C?
Sì. Il cablaggio diventa molto più semplice, ma bisogna modificare la libreria e le istruzioni usate per inizializzare il display.
Posso comandare una ventola in base alla temperatura?
Sì. È una delle evoluzioni più naturali: si imposta una soglia e, quando viene superata, Arduino può pilotare una ventola tramite l’opportuno circuito di potenza.

