🚀 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:
👉 Il risultato sarà una piccola centralina domotica capace di mostrare immediatamente cosa sta accadendo nell’ambiente.
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:
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
Il pulsante e il sensore magnetico utilizzano le resistenze interne INPUT_PULLUP di Arduino.
- 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
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:
Per realizzare il progetto devi installare:
- Adafruit SSD1306;
- Adafruit GFX Library;
- DHT sensor library;
- Adafruit Unified Sensor.
🔌 Schema di collegamento
Display OLED SSD1306
Sensore DHT11
Se utilizzi un modulo DHT11:
Fotoresistenza LDR
Realizza un partitore di tensione:
Sensore magnetico reed switch
Pulsante allarme
Modulo relè
Display OLED SSD1306
- VCC → 5V;
- GND → GND;
- SDA → A4;
- SCL → A5.
Sensore DHT11
Se utilizzi un modulo DHT11:
- VCC → 5V;
- GND → GND;
- DATA → pin digitale 2.
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.
- porta chiusa e magnete vicino → normalmente LOW;
- porta aperta e magnete lontano → normalmente HIGH.
Pulsante allarme
- un terminale → pin digitale 4;
- terminale opposto → GND.
Modulo relè
- VCC → 5V;
- GND → GND;
- IN → pin digitale 8.
- 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.
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.
💻 Codice Arduino
Il programma controlla continuamente:
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.
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);
}
============================================================
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:
Quando la porta viene aperta con l’allarme attivo, Arduino mostra immediatamente il messaggio:
PORTA APERTA
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:
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.
🚪 Controllo della porta
Il reed switch è formato da due parti:
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.
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:
Il display mostra sempre lo stato corrente del sistema.
L’allarme viene attivato o disattivato tramite il pulsante.
Quando è attivo:
- porta chiusa → sistema regolare;
- porta aperta → stato di allarme.
Il display mostra sempre lo stato corrente del sistema.
📟 Dashboard domotica
La schermata principale mostra:
La schermata principale mostra:
- temperatura;
- luminosità;
- porta aperta o chiusa;
- allarme attivo o spento;
- relè acceso o spento.
⚠️ Gestione degli errori
Se il DHT11 non restituisce un valore valido:
👉 Un errore del sensore di temperatura non blocca quindi la gestione della porta, dell’allarme o del relè.
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:
👉 Questa struttura potrà essere ampliata nei progetti successivi con Wi-Fi, più relè, sensori di movimento e controllo remoto.
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?
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.