PROGETTI ARDUINO

  • HOME
  • 200 Progetti
  • Progetti e Tutorial
  • Reti
    • Impara le reti
    • internet fibra
    • wifi mesh
    • modem router
    • diagnostica reti
    • ethernet lan
    • sicurezza configurazione
  • Elettronica
  • Recensioni
  • Manuale
  • Contatti
  • HOME
  • 200 Progetti
  • Progetti e Tutorial
  • Reti
    • Impara le reti
    • internet fibra
    • wifi mesh
    • modem router
    • diagnostica reti
    • ethernet lan
    • sicurezza configurazione
  • Elettronica
  • Recensioni
  • Manuale
  • Contatti

Progetto 131
​Display stato sistema domotico

🚀 Introduzione
​

Vuoi creare un piccolo pannello di controllo capace di mostrare lo stato dei dispositivi presenti in casa? 🏠📟
​
In questo progetto realizzerai un display per il monitoraggio di un sistema domotico, utilizzando Arduino e un display OLED SSD1306.
​
Il sistema controllerà diversi sensori e dispositivi, mostrando in un’unica schermata:
  • temperatura ambientale;
  • livello di luminosità;
  • stato di una porta;
  • stato dell’allarme;
  • stato di un relè.
​
👉 Il risultato sarà una piccola centralina domotica capace di mostrare immediatamente cosa sta accadendo nell’ambiente.

🎯 Cosa realizzerai
​

Con Arduino creerai un sistema che:
  • 🌡️ misura la temperatura;
  • 💡 rileva il livello di luminosità;
  • 🚪 controlla se una porta è aperta o chiusa;
  • 🚨 segnala lo stato dell’allarme;
  • ⚡ mostra lo stato di un relè;
  • 📟 visualizza tutto su display OLED;
  • 🔘 permette di attivare o disattivare l’allarme;
  • 💡 accende automaticamente il relè quando l’ambiente è buio;
  • ⚠️ mostra un avviso quando la porta viene aperta con l’allarme attivo;
  • ⏱️ aggiorna il sistema senza bloccare Arduino.

🧰 Materiale necessario
​
  • 1x Arduino UNO;
  • 1x display OLED 0,96 pollici I2C SSD1306;
  • 1x sensore DHT11;
  • 1x fotoresistenza LDR;
  • 1x resistenza da 10 kΩ;
  • 1x sensore magnetico reed switch;
  • 1x modulo relè 5V;
  • 1x pulsante;
  • cavetti jumper;
  • breadboard;
  • cavo USB.
​
Il pulsante e il sensore magnetico utilizzano le resistenze interne INPUT_PULLUP di Arduino.

🛒 Non hai ancora i componenti?

Molti dei progetti presenti su progettiarduino.com utilizzano componenti elettronici di base come LED, resistenze, sensori e breadboard.
Se stai iniziando con Arduino, il modo più semplice è utilizzare un kit completo per principianti, che include quasi tutti i componenti necessari per realizzare molti dei progetti presenti sul sito.

👉 Kit Arduino consigliato:
ℹ️ Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
https://amzn.to/4b3dxjW

📘 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 Arduino:
ℹ️ Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
https://amzn.to/4rfzjXE
​

📚 Librerie necessarie
​

Per realizzare il progetto devi installare:
  • Adafruit SSD1306;
  • Adafruit GFX Library;
  • DHT sensor library;
  • Adafruit Unified Sensor.
La libreria Wire, necessaria per la comunicazione I2C, è già inclusa nell’Arduino IDE.

🔌 Schema di collegamento
​

​Display OLED SSD1306
  • VCC → 5V;
  • GND → GND;
  • SDA → A4;
  • SCL → A5.
L’indirizzo I2C utilizzato nel codice è 0x3C.

Sensore DHT11
Se utilizzi un modulo DHT11:
  • VCC → 5V;
  • GND → GND;
  • DATA → pin digitale 2.
Se utilizzi il sensore senza modulo, collega una resistenza da 10 kΩ tra DATA e 5V.

Fotoresistenza LDR
Realizza un partitore di tensione:
  • un terminale della fotoresistenza → 5V;
  • terminale opposto → A0;
  • resistenza da 10 kΩ tra A0 e GND.

Sensore magnetico reed switch
  • un terminale → pin digitale 3;
  • terminale opposto → GND.
Con INPUT_PULLUP:
  • porta chiusa e magnete vicino → normalmente LOW;
  • porta aperta e magnete lontano → normalmente HIGH.
Il comportamento può cambiare in base al tipo di reed switch utilizzato.

Pulsante allarme
  • un terminale → pin digitale 4;
  • terminale opposto → GND.
Ogni pressione attiva o disattiva il sistema di allarme.

Modulo relè
  • VCC → 5V;
  • GND → GND;
  • IN → pin digitale 8.
Il codice è configurato per un modulo relè attivo a livello basso:
  • LOW → relè acceso;
  • HIGH → relè spento.
⚠️ Sicurezza del relè
​

Per le prove iniziali utilizza un LED o un carico a bassa tensione.
​
👉 Non collegare dispositivi a 230V se non possiedi esperienza e competenze adeguate. La tensione di rete può provocare folgorazioni, incendi e danni ai componenti.
Foto

💻 Codice Arduino
​

Il programma controlla continuamente:
  • temperatura;
  • luminosità;
  • stato della porta;
  • stato dell’allarme;
  • stato del relè.
​
Il relè viene acceso automaticamente quando la luminosità scende sotto la soglia impostata.
Se l’allarme è attivo e la porta viene aperta, sul display appare una schermata di avviso.
​/*
  ============================================================
  Progetto 131 - Display stato sistema domotico
  Monitora temperatura, luce, porta, allarme e rele
  ============================================================
*/

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>

// Dimensioni e indirizzo del display OLED
#define LARGHEZZA_DISPLAY 128
#define ALTEZZA_DISPLAY 64
#define RESET_OLED -1
#define INDIRIZZO_OLED 0x3C

// Configurazione del sensore DHT11
#define PIN_DHT 2
#define TIPO_DHT DHT11

// Collegamenti degli altri componenti
#define PIN_PORTA 3
#define PIN_PULSANTE 4
#define PIN_RELE 8
#define PIN_LUCE A0

// Livelli logici del modulo relè.
// Molti moduli relè sono attivi a livello LOW.
const byte RELE_ATTIVO = LOW;
const byte RELE_DISATTIVO = HIGH;

// Soglia sotto la quale viene accesa la luce
const int SOGLIA_LUMINOSITA = 30;

// Intervallo tra due letture dei sensori
const unsigned long INTERVALLO_LETTURA = 2000;

// Tempo antirimbalzo del pulsante
const unsigned long TEMPO_DEBOUNCE = 180;

// Oggetti utilizzati per il display e il sensore
Adafruit_SSD1306 display(
  LARGHEZZA_DISPLAY,
  ALTEZZA_DISPLAY,
  &Wire,
  RESET_OLED
);

DHT dht(PIN_DHT, TIPO_DHT);

// Valori ambientali correnti
float temperatura = 0.0;
int luminositaPercentuale = 0;

// Stato dei sensori e dei dispositivi
bool sensoreDhtValido = false;
bool portaAperta = false;
bool allarmeAttivo = false;
bool statoAllarme = false;
bool releAcceso = false;

// Variabili temporali
unsigned long ultimaLettura = 0;
unsigned long ultimaPressione = 0;

// Memorizza l'ultimo stato grafico,
// così il display viene aggiornato solo quando serve
bool aggiornamentoDisplayRichiesto = true;

void setup() {
  // Il reed switch e il pulsante sono collegati
  // tra il rispettivo pin e GND
  pinMode(PIN_PORTA, INPUT_PULLUP);
  pinMode(PIN_PULSANTE, INPUT_PULLUP);

  // Configura il pin del relè come uscita
  pinMode(PIN_RELE, OUTPUT);

  // Mantiene il relè spento durante l'avvio
  impostaRele(false);

  // Avvia il sensore DHT11
  dht.begin();

  // Inizializza il display OLED
  if (!display.begin(
        SSD1306_SWITCHCAPVCC,
        INDIRIZZO_OLED
      )) {
    // Se il display non viene rilevato,
    // il programma rimane bloccato
    while (true) {
    }
  }

  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextWrap(false);

  // Mostra una breve schermata iniziale
  mostraAvvio();

  // Legge subito tutti gli ingressi
  leggiSensori();
  controllaSistema();
  mostraSchermata();

  ultimaLettura = millis();
}

void loop() {
  // Controlla continuamente il pulsante
  gestisciPulsante();

  // La porta viene letta continuamente,
  // perché un'apertura deve essere rilevata subito
  bool nuovoStatoPorta =
    digitalRead(PIN_PORTA) == HIGH;

  // Se lo stato della porta cambia,
  // richiede l'aggiornamento del display
  if (nuovoStatoPorta != portaAperta) {
    portaAperta = nuovoStatoPorta;
    aggiornamentoDisplayRichiesto = true;
  }

  // Legge periodicamente temperatura e luminosità
  if (millis() - ultimaLettura >= INTERVALLO_LETTURA) {
    ultimaLettura = millis();

    leggiSensori();
    aggiornamentoDisplayRichiesto = true;
  }

  // Aggiorna relè e stato dell'allarme
  controllaSistema();

  // Ridisegna il display soltanto quando
  // uno dei valori o degli stati è cambiato
  if (aggiornamentoDisplayRichiesto) {
    mostraSchermata();
    aggiornamentoDisplayRichiesto = false;
  }
}

void leggiSensori() {
  // Legge la temperatura dal sensore DHT11
  float nuovaTemperatura = dht.readTemperature();

  // Se la lettura è valida,
  // aggiorna il valore memorizzato
  if (!isnan(nuovaTemperatura)) {
    temperatura = nuovaTemperatura;
    sensoreDhtValido = true;
  } else {
    sensoreDhtValido = false;
  }

  // Legge il partitore formato da LDR
  // e resistenza da 10 kΩ
  int valoreLuce = analogRead(PIN_LUCE);

  // Converte il valore analogico
  // in una percentuale da 0 a 100
  luminositaPercentuale = map(
    valoreLuce,
    0,
    1023,
    0,
    100
  );

  // Mantiene il valore nei limiti previsti
  luminositaPercentuale = constrain(
    luminositaPercentuale,
    0,
    100
  );
}

void gestisciPulsante() {
  // Con INPUT_PULLUP il pulsante premuto
  // viene letto come livello LOW
  if (digitalRead(PIN_PULSANTE) == LOW &&
      millis() - ultimaPressione >= TEMPO_DEBOUNCE) {
    ultimaPressione = millis();

    // Inverte lo stato dell'allarme
    allarmeAttivo = !allarmeAttivo;

    // Richiede l'aggiornamento immediato del display
    aggiornamentoDisplayRichiesto = true;
  }
}

void controllaSistema() {
  // Il relè si accende automaticamente
  // quando la luminosità scende sotto la soglia
  bool nuovoStatoRele =
    luminositaPercentuale < SOGLIA_LUMINOSITA;

  // Aggiorna il relè soltanto se lo stato è cambiato
  if (nuovoStatoRele != releAcceso) {
    impostaRele(nuovoStatoRele);
    aggiornamentoDisplayRichiesto = true;
  }

  // L'allarme scatta soltanto quando
  // il sistema è attivo e la porta è aperta
  bool nuovoStatoAllarme =
    allarmeAttivo && portaAperta;

  if (nuovoStatoAllarme != statoAllarme) {
    statoAllarme = nuovoStatoAllarme;
    aggiornamentoDisplayRichiesto = true;
  }
}

void impostaRele(bool acceso) {
  // Memorizza lo stato logico del relè
  releAcceso = acceso;

  // Applica il livello corretto al modulo
  if (releAcceso) {
    digitalWrite(PIN_RELE, RELE_ATTIVO);
  } else {
    digitalWrite(PIN_RELE, RELE_DISATTIVO);
  }
}

void mostraSchermata() {
  // Pulisce il display prima di ridisegnarlo
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);

  // Se è presente un allarme,
  // mostra una schermata dedicata
  if (statoAllarme) {
    mostraAllarme();
  } else {
    mostraDashboard();
  }

  // Invia al display tutti gli elementi disegnati
  display.display();
}

void mostraDashboard() {
  display.setTextSize(1);

  // Titolo della dashboard
  display.setCursor(0, 0);
  display.print("SISTEMA DOMOTICO");

  display.drawLine(
    0,
    10,
    127,
    10,
    SSD1306_WHITE
  );

  // Temperatura ambientale
  display.setCursor(0, 15);
  display.print("Temp: ");

  if (sensoreDhtValido) {
    display.print(temperatura, 1);
    display.print((char)247);
    display.print("C");
  } else {
    display.print("DHT ERR");
  }

  // Livello di luminosità
  display.setCursor(72, 15);
  display.print("Luce:");
  display.print(luminositaPercentuale);
  display.print("%");

  // Stato della porta
  display.setCursor(0, 29);
  display.print("Porta: ");

  if (portaAperta) {
    display.print("APERTA");
  } else {
    display.print("CHIUSA");
  }

  // Stato dell'allarme
  display.setCursor(0, 42);
  display.print("Allarme: ");

  if (allarmeAttivo) {
    display.print("ATTIVO");
  } else {
    display.print("SPENTO");
  }

  // Stato del relè
  display.setCursor(0, 55);
  display.print("Luce rele: ");

  if (releAcceso) {
    display.print("ON");
  } else {
    display.print("OFF");
  }

  // Indicatore del pulsante
  display.setCursor(92, 55);
  display.print("BTN");
}

void mostraAllarme() {
  // Disegna un bordo attorno alla schermata di allarme
  display.drawRect(
    0,
    0,
    128,
    64,
    SSD1306_WHITE
  );

  display.setTextSize(2);
  display.setCursor(22, 7);
  display.print("ALLARME");

  display.setTextSize(1);
  display.setCursor(25, 30);
  display.print("PORTA APERTA");

  display.setCursor(12, 45);
  display.print("Controlla ingresso");

  display.setCursor(15, 55);
  display.print("Premi per disattivare");
}

void mostraAvvio() {
  display.clearDisplay();
  display.setTextSize(1);

  display.setCursor(18, 14);
  display.print("Sistema domotico");

  display.setCursor(20, 30);
  display.print("Monitor di stato");

  display.setCursor(28, 47);
  display.print("Progetto 131");

  display.display();

  delay(1800);
}

⚙️ Come funziona
​

​Arduino legge il sensore DHT11 e la fotoresistenza a intervalli regolari.

Il sensore magnetico viene invece controllato continuamente.

Il display mostra una dashboard con tutte le informazioni principali.
​
Il pulsante permette di cambiare lo stato dell’allarme:
  • allarme attivo;
  • allarme disattivato.
​
Quando la porta viene aperta con l’allarme attivo, Arduino mostra immediatamente il messaggio:
PORTA APERTA

💡 Controllo automatico del relè
​

Il valore della fotoresistenza viene convertito in una percentuale compresa tra 0 e 100.
Quando la luminosità scende sotto il 30%, Arduino accende il relè.
Il relè potrebbe controllare:
  • una lampada;
  • una striscia LED;
  • una luce di cortesia;
  • un dispositivo a bassa tensione.
Quando la luminosità torna sopra la soglia, il relè viene disattivato.

🚪 Controllo della porta
​

Il reed switch è formato da due parti:
  • un contatto magnetico;
  • un magnete.
​
Quando la porta è chiusa, il magnete si trova vicino al sensore.
Quando la porta viene aperta, il contatto cambia stato e Arduino rileva l’evento.
👉 Se il tuo sensore restituisce uno stato opposto, puoi invertire la lettura nel codice.

🚨 Gestione dell’allarme
​

L’allarme viene attivato o disattivato tramite il pulsante.
Quando è attivo:
  • porta chiusa → sistema regolare;
  • porta aperta → stato di allarme.
Quando è disattivato, la porta può essere aperta senza generare avvisi.
Il display mostra sempre lo stato corrente del sistema.

📟 Dashboard domotica
​

La schermata principale mostra:
  • temperatura;
  • luminosità;
  • porta aperta o chiusa;
  • allarme attivo o spento;
  • relè acceso o spento.
Le informazioni vengono organizzate su più righe, così da essere leggibili anche sul piccolo display OLED.

⚠️ Gestione degli errori

Se il DHT11 non restituisce un valore valido:
  • l’ultima temperatura corretta rimane memorizzata;
  • sul display appare DHT ERR;
  • il resto del sistema continua a funzionare;
  • Arduino prova nuovamente alla lettura successiva.
​
👉 Un errore del sensore di temperatura non blocca quindi la gestione della porta, dell’allarme o del relè.

🧠 Perché è un progetto importante
​

Con questo progetto impari a:
  • creare una dashboard domotica;
  • controllare più sensori contemporaneamente;
  • utilizzare un reed switch;
  • gestire uno stato di allarme;
  • controllare automaticamente un relè;
  • mostrare più informazioni su display OLED;
  • utilizzare ingressi digitali e analogici;
  • gestire errori senza bloccare il sistema;
  • organizzare il codice in funzioni;
  • realizzare una piccola centralina domestica.
​
👉 Questa struttura potrà essere ampliata nei progetti successivi con Wi-Fi, più relè, sensori di movimento e controllo remoto.

🔄 Varianti possibili
​

Vuoi migliorare il progetto?
  • 🔊 aggiungi un buzzer di allarme;
  • 🚶 collega un sensore PIR;
  • 🔐 aggiungi un lettore RFID;
  • 💾 salva gli eventi nella EEPROM;
  • ⏰ registra data e ora con RTC DS3231;
  • 📶 invia notifiche tramite Wi-Fi;
  • 💡 aggiungi più relè per controllare altre luci;
  • 🌡️ utilizza un sensore DHT22;
  • 🔘 aggiungi pulsanti per il controllo manuale;
  • 📋 crea un menu con più schermate;
  • 🔋 aggiungi un indicatore della batteria;
  • 📱 controlla il sistema tramite smartphone.

Foto
Foto

© ProgettiArduino.com 2026 - Fancello Salvatore
​ Layout, immagini e testi sono di esclusiva proprietà di www.progettiarduino.com 
Privacy Policy