🚨 Arduino • Laser • Fotoresistenza

Allarme laser con Arduino: barriera antifurto con fotoresistenza

Creiamo una semplice barriera laser: il fascio illumina una fotoresistenza e, quando viene interrotto, Arduino attiva un buzzer. Un pulsante permette di armare e disarmare il sistema.

DifficoltàPrincipiante / Intermedia
SensoreLDR su A0
AllarmeBuzzer su D3
In poche parole: quando il sistema è armato, Arduino accende il laser su D5 e controlla la luce ricevuta dalla fotoresistenza. Se il valore scende sotto la soglia impostata, significa che il fascio è stato interrotto e il buzzer suona.

Cosa imparerai

  • come costruire una barriera laser con Arduino;
  • come leggere una fotoresistenza su A0;
  • come usare una soglia per rilevare l’interruzione del fascio;
  • come armare e disarmare il sistema con un pulsante;
  • come usare tone() e noTone();
  • come evitare falsi cambi di stato del pulsante;
  • come calibrare la soglia in base alla luce ambiente.

Come funziona il progetto

Il laser viene puntato direttamente verso una fotoresistenza. Il sistema può essere acceso o spento con un pulsante; quando è attivo si accende il LED verde, mentre a sistema disattivato resta acceso il LED rosso. Se il fascio laser non raggiunge più la LDR, Arduino genera un allarme acustico tramite il buzzer.

Avvertenza sicurezza laser
Modulo laser per Arduino

Modulo laser utilizzato per creare la barriera ottica.

Sicurezza laser: non puntare mai il fascio verso occhi di persone o animali e non usare superfici riflettenti che possano deviare il raggio in modo imprevedibile. Utilizza soltanto piccoli moduli laser adatti a esperimenti didattici e segui le indicazioni del produttore.

Materiale necessario

🔌 Arduino Uno
🔴 Modulo laser
🌗 Fotoresistenza LDR
🔊 Buzzer
💚 1 LED verde
❤️ 1 LED rosso
🔘 1 pulsante
〰️ 3 resistenze da 220 Ω
〰️ 1 resistenza da 10 kΩ
🧩 Breadboard e jumper

🧰 Kit Arduino consigliato

Molti progetti del sito utilizzano LED, resistenze, sensori e breadboard. Un kit completo può essere comodo per iniziare.

👉 Guarda il kit Arduino consigliato

Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.

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

Schema del circuito

Schema Arduino allarme laser con fotoresistenza e buzzer

Schema di collegamento dell’allarme laser con Arduino, fotoresistenza, buzzer e pulsante.

Pin utilizzati

ElementoPin Arduino
BuzzerD3
LaserD5
PulsanteD7
LED verdeD8
LED rossoD9
FotoresistenzaA0

Simulazione Tinkercad

▶️ Apri la simulazione Tinkercad

La soglia della fotoresistenza

Il buzzer viene attivato quando la lettura della fotoresistenza scende sotto la soglia impostata:

Condizione originale
if (luce < 100) {
 tone(3, 500);
}

Il valore 100 è quindi la soglia che separa “laser presente” da “fascio interrotto”. Non è però un numero universale: dipende dalla LDR, dal partitore resistivo, dalla distanza del laser e dalla luce ambiente.

Prima di usare l’allarme: osserva il valore di analogRead(A0) con il laser centrato sulla LDR e poi con il fascio interrotto. Scegli una soglia sufficientemente lontana dai due valori.

Codice Arduino commentato e corretto

Per rendere il comportamento stabile, gestiamo il pulsante rilevando una sola pressione alla volta e fermiamo esplicitamente il buzzer quando il fascio laser torna sulla fotoresistenza.

Allarme laser Arduino – versione migliorata
// ==========================================================
// ALLARME LASER CON ARDUINO
// Laser + LDR + buzzer + pulsante + 2 LED
// ==========================================================

// Pin utilizzati dal progetto
const int buzzerPin = 3;
const int laserPin = 5;
const int pulsantePin = 7;
const int ledVerde = 8;
const int ledRosso = 9;
const int ldrPin = A0;

// Soglia di rilevamento:
// sotto 100 consideriamo il fascio interrotto.
const int sogliaLuce = 100;

// Stato generale dell'allarme.
// false = disarmato
// true = armato
bool sistemaArmato = false;

// Stato precedente del pulsante,
// utile per rilevare soltanto il fronte di pressione.
bool pulsantePrecedente = LOW;

// Tempo dell'ultima commutazione,
// usato per un semplice debounce.
unsigned long ultimoCambio = 0;

const unsigned long debounceMs = 40;

void setup() {

 // Uscite
 pinMode(buzzerPin, OUTPUT);
 pinMode(laserPin, OUTPUT);
 pinMode(ledVerde, OUTPUT);
 pinMode(ledRosso, OUTPUT);

 // Ingresso pulsante con resistenza esterna,
 // come previsto dal circuito.
 pinMode(pulsantePin, INPUT);

 // A0 è un ingresso analogico.
 pinMode(ldrPin, INPUT);

 // Monitor Seriale per calibrare la LDR
 Serial.begin(9600);

 // Stato iniziale:
 // sistema spento, LED rosso acceso.
 digitalWrite(laserPin, LOW);
 digitalWrite(ledVerde, LOW);
 digitalWrite(ledRosso, HIGH);
 noTone(buzzerPin);
}

void loop() {

 // --------------------------------------------------------
 // 1. GESTIONE DEL PULSANTE
 // --------------------------------------------------------
 bool pulsanteAttuale = digitalRead(pulsantePin);

 // Rileviamo soltanto il passaggio LOW -> HIGH.
 // In questo modo una singola pressione commuta
 // il sistema una sola volta.
 if (
 pulsanteAttuale == HIGH &&
 pulsantePrecedente == LOW &&
 millis() - ultimoCambio >= debounceMs
 ) {

 sistemaArmato = !sistemaArmato;

 ultimoCambio = millis();
 }

 pulsantePrecedente = pulsanteAttuale;

 // --------------------------------------------------------
 // 2. SISTEMA ARMATO
 // --------------------------------------------------------
 if (sistemaArmato) {

 // Indicazione visiva
 digitalWrite(ledRosso, LOW);
 digitalWrite(ledVerde, HIGH);

 // Accende il laser
 digitalWrite(laserPin, HIGH);

 // Legge la fotoresistenza
 int luce = analogRead(ldrPin);

 Serial.print("Luce: ");
 Serial.println(luce);

 // Se il valore scende sotto la soglia,
 // consideriamo il fascio interrotto.
 if (luce < sogliaLuce) {

 // Allarme sonoro a 500 Hz
 tone(buzzerPin, 500);
 }
 else {

 // Il fascio è tornato sulla LDR:
 // fermiamo esplicitamente il buzzer.
 noTone(buzzerPin);
 }
 }

 // --------------------------------------------------------
 // 3. SISTEMA DISARMATO
 // --------------------------------------------------------
 else {

 // Ferma sempre l'allarme
 noTone(buzzerPin);

 // Spegne il laser
 digitalWrite(laserPin, LOW);

 // LED rosso = sistema spento
 digitalWrite(ledVerde, LOW);
 digitalWrite(ledRosso, HIGH);
 }
}

Come funziona il pulsante

Per commutare lo stato del sistema possiamo usare una variabile che passa da 0 a 1 e viceversa:

Commutazione dello stato
if (val == HIGH) {
 stato = 1 - stato;
}

Se stato vale 0 diventa 1, e se vale 1 torna 0. Poiché Arduino esegue il loop() molto velocemente, è però necessario evitare che una sola pressione provochi più commutazioni.

Soluzione: nella versione nuova rileviamo soltanto il fronte LOW→HIGH e aggiungiamo un piccolo debounce temporale.

Come funziona l’allarme

StatoLaserLEDBuzzer
DisarmatoSpentoRossoSpento
Armato + fascio presenteAccesoVerdeSpento
Armato + fascio interrottoAccesoVerde500 Hz

Calibrazione pratica della LDR

Per rendere la barriera più affidabile conviene prima misurare i valori reali:

Sketch rapido di calibrazione
void setup() {
 Serial.begin(9600);
}

void loop() {

 int luce = analogRead(A0);

 Serial.println(luce);

 delay(100);
}
  1. punta il laser al centro della fotoresistenza;
  2. annota il valore stabile;
  3. interrompi il fascio con un oggetto;
  4. annota il nuovo valore;
  5. scegli una soglia intermedia con un buon margine.

Aggiungere isteresi

Se la lettura oscilla vicino alla soglia, il buzzer può accendersi e spegnersi rapidamente. Puoi usare due soglie diverse:

Esempio di isteresi
const int sogliaAllarme = 100;
const int sogliaRipristino = 130;

bool allarmeAttivo = false;

if (!allarmeAttivo && luce < sogliaAllarme) {
 allarmeAttivo = true;
}

if (allarmeAttivo && luce > sogliaRipristino) {
 allarmeAttivo = false;
}

Immagine del progetto originale

Arduino allarme laser barriera antifurto

Esempio del circuito completo per la barriera laser.

Scarica lo sketch

⬇️ Scarica lo sketch Arduino

Debug rapido

  • verifica che il laser sia sul pin D5;
  • controlla la LDR e il partitore collegati ad A0;
  • osserva i valori sul Monitor Seriale per calibrare la soglia;
  • verifica il buzzer sul pin D3;
  • controlla LED verde D8 e rosso D9;
  • se il sistema si arma e disarma più volte con una pressione, verifica il debounce del pulsante;
  • se il buzzer resta acceso dopo il ripristino del fascio, assicurati che venga eseguito noTone();
  • evita che luce ambiente o riflessi colpiscano direttamente la fotoresistenza.

Varianti del progetto

  • aggiungere un ritardo di ingresso prima di armare il sistema;
  • aggiungere un LED lampeggiante durante l’allarme;
  • rendere l’allarme “memorizzato” fino a reset manuale;
  • inviare una notifica tramite Wi-Fi o GSM;
  • aggiungere più barriere laser;
  • usare un display OLED per mostrare stato e valore LDR;
  • salvare gli eventi rilevati su memoria o scheda SD.

Cosa devi ricordare

  • Il laser è comandato dal pin D5.
  • La fotoresistenza viene letta su A0.
  • Il buzzer è sul pin D3.
  • Il pulsante è su D7, LED verde D8 e LED rosso D9.
  • La soglia di esempio dell’allarme è 100 e va calibrata sul circuito reale.
  • La soglia va calibrata sul circuito reale.
  • Il pulsante deve essere gestito in modo da evitare commutazioni multiple.
  • noTone() deve fermare il buzzer quando il fascio viene ripristinato.

Domande frequenti

Perché l’allarme suona anche se il laser colpisce la LDR?

La soglia potrebbe essere troppo alta oppure il fascio potrebbe non essere centrato bene. Leggi i valori reali sul Monitor Seriale e calibra sogliaLuce.

Perché premendo una volta il pulsante il sistema cambia stato più volte?

Un pulsante reale può rimbalzare elettricamente e restare HIGH per molti cicli del programma. Per questo nella versione migliorata usiamo rilevamento del fronte e debounce.

Posso usare un altro valore al posto di 100?

Sì, ed è spesso necessario. Il valore dipende da fotoresistenza, resistenza del partitore, laser, distanza e illuminazione ambientale.

È un sistema antifurto professionale?

No. È un progetto didattico utile per comprendere sensori ottici, soglie e gestione degli allarmi. Un impianto di sicurezza reale richiede sensori, alimentazione e logiche progettate specificamente per quell’uso.