PROGETTO #97 • AUTOMAZIONE

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.

Difficoltà Intermedia
Tempo 60–90 minuti
Concetti DHT11 • LCD • Relè

🧠 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.

🎯 Cosa imparerai
  • 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

🔥 Temperatura bassa Se la temperatura scende sotto 20 °C, Arduino attiva il riscaldamento.
✅ Temperatura corretta Tra 20 °C e 28 °C entrambi gli attuatori rimangono spenti.
❄️ Temperatura alta Sopra 28 °C Arduino attiva il raffreddamento.
💡 Concetto chiave

Arduino confronta continuamente la temperatura misurata con due soglie e decide quale uscita attivare.


🧰 Materiale necessario

Arduino UNO
Sensore DHT11
Display LCD 16×2 I2C
Modulo relè o LED di prova
Breadboard
Cavi jumper
🧰 Kit Arduino consigliato

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.
📚 I miei libri su Arduino
Volume 1 Volume 2 Volume 3 ℹ️ 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.

Controllo temperatura Arduino con DHT11 LCD e relè
⚡ Attenzione agli attuatori reali

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);

}
💡 Codice migliorato

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;
📌 Nota importante

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.
💡 Evoluzione del progetto

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

  1. Collega Arduino, DHT11 e display.
  2. Carica il programma senza collegare carichi reali.
  3. Verifica la temperatura sul display.
  4. Usa due LED per simulare raffreddamento e riscaldamento.
  5. Modifica temporaneamente le soglie per verificare entrambe le uscite.
  6. 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.

🔁 Varianti possibili

🌡️ Sensore DHT22 Utilizzare un sensore con precisione e intervallo di misura superiori.
💧 Controllo umidità Utilizzare anche il dato di umidità per comandare ventole o umidificatori.
🚨 Buzzer di allarme Attivare un avviso acustico quando vengono superate soglie critiche.
🏠 Termostato smart Aggiungere WiFi, registrazione dati e controllo remoto.