Controllo temperatura Arduino con DHT11, LCD e relè
Realizziamo un sistema automatico capace di monitorare la temperatura e gestire autonomamente raffreddamento e riscaldamento tramite Arduino.
🧠 Introduzione
Nei progetti più semplici Arduino viene spesso utilizzato soltanto per leggere e visualizzare una temperatura.
In questo progetto facciamo un passo in avanti: Arduino non si limita più a osservare l’ambiente, ma può anche intervenire automaticamente.
Utilizzeremo un sensore DHT11 per misurare la temperatura e un display LCD 16×2 I2C per mostrare il valore in tempo reale.
In base alla temperatura rilevata, Arduino potrà attivare:
- un sistema di raffreddamento;
- un sistema di riscaldamento;
- oppure mantenere entrambi spenti.
Questo principio è alla base di termostati, serre automatiche, sistemi HVAC, incubatrici e numerosi sistemi industriali.
- come leggere la temperatura con un DHT11;
- come visualizzare i dati su LCD I2C;
- come impostare una soglia minima e massima;
- come comandare due attuatori;
- come creare un semplice controllo automatico della temperatura.
🌡️ Le tre condizioni del sistema
Arduino confronta continuamente la temperatura misurata con due soglie e decide quale uscita attivare.
🧰 Materiale necessario
Un kit completo permette di avere già a disposizione sensori, breadboard, cavi, resistenze e molti altri componenti utili.
Vedi il kit Arduino ℹ️ Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.🔌 Schema di collegamento
Sensore DHT11
- VCC → 5V Arduino
- GND → GND Arduino
- DATA → Pin 2 Arduino
Display LCD (I2C)
- VCC → 5V Arduino
- GND → GND Arduino
- SDA → Pin A4 Arduino
- SCL → Pin A5 Arduino
Attuatori
- Ventola / relè raffreddamento → Pin 7
- Riscaldamento / relè → Pin 8
⚠️ Tutti i GND devono essere collegati insieme.
Arduino deve comandare ventole, riscaldatori o altri carichi tramite relè, transistor o driver adeguati. Non collegare carichi ad alta corrente direttamente ai pin della scheda.
📚 Librerie necessarie
Per questo progetto servono:
- DHT.h
- LiquidCrystal_I2C
Puoi installarle dal Gestore Librerie dell’IDE Arduino.
💻 Codice Arduino
// ============================================
// Progetto 97 - Controllo temperatura avanzato
// Raffreddamento + riscaldamento
// ============================================
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// ============================================
// DISPLAY LCD
// ============================================
LiquidCrystal_I2C lcd(0x27, 16, 2);
// ============================================
// SENSORE DHT11
// ============================================
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// ============================================
// ATTUATORI
// ============================================
const int ventola = 7;
const int riscaldamento = 8;
// ============================================
// SOGLIE TEMPERATURA
// ============================================
const float tempMax = 28.0;
const float tempMin = 20.0;
void setup() {
// Avvia LCD
lcd.init();
lcd.backlight();
// Avvia sensore DHT11
dht.begin();
// Configura uscite
pinMode(ventola, OUTPUT);
pinMode(riscaldamento, OUTPUT);
// Stato iniziale sicuro
digitalWrite(ventola, LOW);
digitalWrite(riscaldamento, LOW);
Serial.begin(9600);
}
void loop() {
// ==========================================
// LETTURA TEMPERATURA
// ==========================================
float temperatura = dht.readTemperature();
// ==========================================
// CONTROLLO ERRORE SENSORE
// ==========================================
if (isnan(temperatura)) {
digitalWrite(ventola, LOW);
digitalWrite(riscaldamento, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Errore sensore");
delay(2000);
return;
}
// ==========================================
// VISUALIZZAZIONE TEMPERATURA
// ==========================================
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperatura, 1);
lcd.print(" C");
// ==========================================
// LOGICA CONTROLLO
// ==========================================
if (temperatura > tempMax) {
// Temperatura troppo alta
digitalWrite(ventola, HIGH);
digitalWrite(riscaldamento, LOW);
lcd.setCursor(0, 1);
lcd.print("Raffreddamento");
}
else if (temperatura < tempMin) {
// Temperatura troppo bassa
digitalWrite(ventola, LOW);
digitalWrite(riscaldamento, HIGH);
lcd.setCursor(0, 1);
lcd.print("Riscaldamento");
}
else {
// Temperatura nella zona corretta
digitalWrite(ventola, LOW);
digitalWrite(riscaldamento, LOW);
lcd.setCursor(0, 1);
lcd.print("Temperatura OK");
}
// ==========================================
// MONITOR SERIALE
// ==========================================
Serial.print("Temperatura: ");
Serial.print(temperatura);
Serial.println(" C");
// DHT11 non necessita aggiornamenti rapidi
delay(2000);
}
Ho mantenuto invariati pin, soglie e funzionamento del progetto originale. Ho aggiunto soltanto una struttura più leggibile, uno stato iniziale sicuro e lo spegnimento degli attuatori in caso di errore del sensore.
⚙️ Come funziona il programma
1 Lettura della temperatura
Arduino interroga il DHT11 tramite:
dht.readTemperature()
2 Controllo della lettura
Se il sensore restituisce un valore non valido, la funzione:
isnan(temperatura)
permette di riconoscere l’errore e bloccare gli attuatori.
3 Confronto con le soglie
Il programma confronta la temperatura con:
- tempMin = 20 °C
- tempMax = 28 °C
4 Attivazione dell’uscita
Arduino decide se attivare raffreddamento, riscaldamento oppure nessuno dei due.
❄️ Quando si attiva il raffreddamento
Quando:
temperatura > 28
Arduino esegue:
digitalWrite(ventola, HIGH);
digitalWrite(riscaldamento, LOW);
Il pin 7 viene quindi attivato mentre il pin 8 rimane spento.
🔥 Quando si attiva il riscaldamento
Quando:
temperatura < 20
Arduino esegue:
digitalWrite(ventola, LOW);
digitalWrite(riscaldamento, HIGH);
Il sistema di riscaldamento viene quindi attivato.
✅ Zona di temperatura corretta
Se la temperatura si trova tra 20 °C e 28 °C, Arduino considera l’ambiente all’interno dell’intervallo impostato.
Entrambe le uscite vengono quindi disattivate:
digitalWrite(ventola, LOW);
digitalWrite(riscaldamento, LOW);
Sul display compare:
Temperatura OK
📟 Informazioni sul display LCD
Il display mostra due informazioni principali.
Nella prima riga viene visualizzata la temperatura:
Temp: 24.5 C
Nella seconda riga viene mostrato lo stato del sistema:
Temperatura OK
oppure:
Raffreddamento
oppure:
Riscaldamento
🎚️ Le soglie di temperatura
I valori possono essere modificati direttamente nel codice:
const float tempMax = 28.0;
const float tempMin = 20.0;
Per esempio, per mantenere l’ambiente tra 21 °C e 25 °C:
const float tempMax = 25.0;
const float tempMin = 21.0;
Le soglie devono essere scelte in base all’applicazione reale: una serra, un contenitore elettronico e una stanza domestica richiedono temperature operative differenti.
🔄 A cosa serve realmente l’isteresi
Nei sistemi di regolazione reali non è consigliabile accendere e spegnere continuamente un attuatore quando la temperatura oscilla di pochi decimi di grado.
Un vero controllo con isteresi utilizza una soglia di accensione e una soglia differente per lo spegnimento.
Per esempio:
- ventola ON sopra 28 °C;
- ventola OFF soltanto sotto 27 °C.
La struttura di questo progetto è già un’ottima base per aggiungere in seguito una vera banda di isteresi separata per raffreddamento e riscaldamento.
🧪 Primo test consigliato
- Collega Arduino, DHT11 e display.
- Carica il programma senza collegare carichi reali.
- Verifica la temperatura sul display.
- Usa due LED per simulare raffreddamento e riscaldamento.
- Modifica temporaneamente le soglie per verificare entrambe le uscite.
- Solo dopo collega eventuali moduli relè.
🛡️ Comportamento in caso di errore
Un sensore può temporaneamente restituire un valore non valido.
Nel codice migliorato, quando questo accade, Arduino:
- spegne la ventola;
- spegne il riscaldamento;
- mostra Errore sensore sul display.
Questa è una scelta più sicura rispetto a lasciare un attuatore acceso senza conoscere la temperatura reale.
✅ Cosa hai imparato
- come utilizzare un sensore DHT11;
- come visualizzare una temperatura su LCD;
- come definire soglie minima e massima;
- come controllare due uscite automatiche;
- come gestire un errore del sensore;
- come creare la base di un sistema termostatico Arduino.

