Benvenuti in SilentNoMore, ecco il nostro progetto di elettronica e programmazione sviluppato su piattaforma Arduino. Il sistema è progettato per il monitoraggio in tempo reale dei parametri ambientali di temperatura e umidità, integrando un sistema di allarme acustico/visivo automatizzato e un controllo di gestione remoto tramite infrarossi. L’obiettivo principale di questo prototipo è simulare un sistema di sicurezza industriale o domestico (es. per serre automatizzate o sale server), capace di prevenire danni strutturali o hardware dovuti al surriscaldamento. Il circuito analizza costantemente l’ambiente e reagisce autonomamente al superamento di una soglia critica preimpostata nel codice.

Componenti Utilizzati

Microcontrollore Arduino Uno R3

Sensore di Temperatura e Umidità DHT11

Display LCD 16×2 (con modulo I2C)

Buzzer Piezoelettrico (Segnalazione acustica)

LED di Segnalazione Rosso (Segnalazione visiva)

Ricevitore IR e Telecomando (Controllo remoto)

Breadboard e cavetti jumper per i collegamenti

Logica di funzionamento e test pratici

Il sensore DHT11 invia costantemente i dati digitali ad Arduino. Nel momento in cui la temperatura supera la soglia di sicurezza impostata nel codice (pari a 26 °C), il microcontrollore attiva immediatamente una routine di emergenza: il LED rosso comincia a lampeggiare visibilmente e il buzzer piezoelettrico emette un segnale acustico intermittente. Sul display LCD compare lo stato di allarme. Nel video a fianco è possibile osservare il test di superamento della soglia.

Per ottimizzare i consumi energetici del sistema e permettere una gestione flessibile, ho implementato un ricevitore IR. Tramite la decodifica dei segnali esadecimali inviati dal telecomando, l’utente può interagire con il dispositivo a distanza. Come mostrato nel filmato, premendo il tasto [Es: ON/OFF] sul telecomando è possibile spegnere la retroilluminazione del display LCD o resettare lo stato del sistema senza dover agire fisicamente sulla scheda.

Sviluppo del Circuito e Cablaggio

Nelle immagini sopra viene mostrato il prototipo reale cablato su breadboard durante la fase di debug hardware. È possibile notare la disposizione dei componenti per evitare interferenze sul segnale analogico e l’interfacciamento del display LCD tramite bus di comunicazione per ridurre il numero di pin occupati sulla scheda Arduino.

Il Software (Codice di Utilizzo)

#include <LiquidCrystal.h>
#include <DHT.h>
#include <IRremote.h>

// Definizione Pin
#define DHTPIN 7
#define DHTTYPE DHT11
#define IR_PIN 9
#define BUZZER_PIN 8
#define LED_PIN 10
#define LDR_PIN A0

// Inizializzazione componenti
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
DHT dht(DHTPIN, DHTTYPE);

// Variabili di stato
int modalitaDisplay = 0; // 0: Temp/Umidità, 1: Luce

void setup() {
lcd.begin(16, 2);
dht.begin();

// Avvia il ricevitore IR
IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK);

pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);

lcd.print("Sistema Avviato");
delay(2000);
lcd.clear();
}

void loop() {
// 1. Lettura Sensori
float t = dht.readTemperature();
float h = dht.readHumidity();
int luce = analogRead(LDR_PIN);

// 2. Controllo Allarme (Soglia 30 gradi)
if (t > 30) {
digitalWrite(LED_PIN, HIGH);
tone(BUZZER_PIN, 1000); // Suona l'allarme
} else {
digitalWrite(LED_PIN, LOW);
noTone(BUZZER_PIN); // Spegne l'allarme
}

// 3. Gestione Telecomando IR
if (IrReceiver.decode()) {
int codiceTasto = IrReceiver.decodedIRData.command;

// TASTO ON (Codice 3) -> Vai alla schermata LUCE
if (codiceTasto == 0x3) { 
  modalitaDisplay = 1; 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Schermata:");
  lcd.setCursor(0, 1);
  lcd.print("Sensore LUCE");
  delay(1000);
  lcd.clear();
}
// TASTO OFF -> Vai alla schermata TEMP/UMIDITA
// ATTENZIONE: Se il tasto OFF non funziona, devi cambiare lo 0x2
// con il VERO codice del tuo tasto 2!
else if (codiceTasto == 0x2) {
  modalitaDisplay = 0; 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Schermata:");
  lcd.setCursor(0, 1);
  lcd.print("TEMP & UMIDITA");
  delay(1000);
  lcd.clear();
}

IrReceiver.resume(); // Rimettiti in ascolto del prossimo tasto
}

// 4. Aggiornamento Display LCD
lcd.setCursor(0, 0);
if (modalitaDisplay == 0) {
// Schermata 0: Temperatura e Umidità
lcd.print("Temp: "); lcd.print(t); lcd.print("C    ");
lcd.setCursor(0, 1);
lcd.print("Umid: "); lcd.print(h); lcd.print("%    ");
} else {
// Schermata 1: Luce
lcd.print("Luce: "); lcd.print(luce); lcd.print("       ");
lcd.setCursor(0, 1);

// Ricorda: finché non colleghiamo la resistenza, 'luce' sarà sempre 0
if (luce < 300) {
  lcd.print("Stato: NOTTE   ");
} else {
  lcd.print("Stato: GIORNO  ");
}
}

delay(200); // Piccolo ritardo per stabilità
}

“Sbagliare il codice significa vedere un LED che non lampeggia. Sbagliare i collegamenti significa sentire l’odore di bruciato. È così che si impara davvero.”