In questo tutorial impareremo come costruire una luce notturna a batteria attivata dal movimento utilizzando un ESP32 lite e un sensore PIR (infrarosso passivo). Questo progetto è perfetto per aggiungere un tocco di automazione alla tua casa o al tuo spazio di lavoro, offrendo una soluzione di illuminazione comoda ed efficiente dal punto di vista energetico.
Utilizzando un sensore PIR, la nostra luce notturna si accenderà solo quando rileverà un movimento nelle vicinanze, assicurandosi di rimanere spenta quando non serve. Questa funzione non solo salva la batteria, ma aggiunge anche un livello di sicurezza avvisandoti di qualsiasi movimento nell’area. Inoltre, sfrutteremo la modalità deep-sleep dell’ESP32 per risparmiare ancora più energia.
Per garantire che la luce notturna sia attiva solo di notte, aggiungeremo anche una fotoresistenza o LDR per rilevare le condizioni di illuminazione ambientale.
In questo tutorial costruiremo due luci notturne: una molto semplice e una leggermente più avanzata. Quest’ultima sarà integrata in un teschio, rendendola un ottimo regalo o oggetto dimostrativo.
Per realizzare questo progetto, avremo bisogno di alcuni componenti essenziali, che discuteremo nella sezione successiva. Non preoccuparti se sei nuovo ad Arduino o all’elettronica – questo tutorial è adatto ai principianti e ti guideremo passo dopo passo.
Allora, iniziamo!
Componenti necessari
Di seguito trovi i componenti necessari per costruire il progetto. Per questo progetto sto usando una vecchia scheda ESP32, ormai obsoleta ma ancora reperibile a un prezzo molto basso. È quella elencata qui sotto. Esiste un modello successore con specifiche migliorate, che puoi trovare here.
Infine, tutte le batterie LiPo 903052 che ho trovato hanno il connettore sbagliato. Dovrai tagliare il connettore e sostituirlo con un connettore JST PH 2-pin da 2.0mm. Però mi piace il formato di queste batterie perché hanno quasi le stesse dimensioni della scheda ESP32.

ESP32 lite

Cavo dati USB

Set di fili Dupont

Breadboard

Kit resistori & LED

Sensore di movimento

Set di fotoresistenze

Batteria 1200mAh

Teschio

Arduino IDE
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Sensori di luce e PIR
Per costruire una luce notturna attivata dal movimento, dobbiamo prima capire i due componenti chiave: il sensore di luce e il sensore di movimento PIR (infrarosso passivo).
Sensore di luce
Un sensore di luce, noto anche come fotoresistenza o LDR (Light Dependent Resistor), rileva il livello di luce ambientale circostante. Funziona cambiando la sua resistenza in base all’intensità della luce che lo colpisce. Quando è esposto a luce intensa, la resistenza diminuisce, mentre al buio la resistenza aumenta.

Per la nostra luce notturna, il sensore di luce determinerà se la luce deve accendersi o spegnersi in base alle condizioni di luce circostanti. Quando il livello di luce ambientale scende sotto una certa soglia, indicando oscurità, il sensore di luce abiliterà l’uscita del sensore PIR permettendo di attivare la luce notturna.
Sensore PIR
Il sensore PIR è un sensore di rilevamento movimento che individua variazioni nella radiazione infrarossa emessa dagli oggetti nel suo campo visivo. È composto da un sensore piroelettrico che genera una tensione quando è esposto a radiazione infrarossa. Il sensore PIR è comunemente usato in sistemi di sicurezza, illuminazione automatica e altre applicazioni che richiedono il rilevamento del movimento.
Troverai che esistono tre moduli comuni di rilevamento movimento PIR. Il grande HC-SR501, il medio HC-SR505 e il piccolo AM312 che stiamo usando qui. Tutti funzionerebbero, ma dato che vogliamo integrare la luce notturna in un teschio, scegliamo il più piccolo. L’AM312 sembra anche avere il consumo energetico più basso (8uA), anche se non l’ho misurato personalmente.

Per maggiori dettagli sul sensore HC-SR501 o sui sensori di movimento in generale, vedi il nostro tutorial HC-SR501 PIR Motion Sensor Arduino Tutorial (3 Examples).
Quando il sensore PIR rileva un movimento nel suo raggio d’azione, invia un segnale al microcontrollore, indicando che è stato rilevato un movimento. Nel nostro progetto di luce notturna, il sensore PIR sarà usato per attivare la luce quando viene rilevato un movimento e spegnerla dopo un periodo prestabilito.
Nella sezione successiva discuteremo il circuito base che useremo per rilevare il movimento di notte.
Schema del circuito base
La soluzione più semplice per rilevare il movimento di notte sarebbe collegare il sensore di movimento (PIR) a un pin di input dell’ESP32 e il sensore di luce (LDR) a un altro pin. Se rileviamo un segnale HIGH dal sensore PIR, potremmo controllare il livello di luce leggendo il sensore LDR e quindi accendere o spegnere la luce.
Questo funzionerebbe bene ma ha lo svantaggio che dobbiamo svegliare l’ESP32 dalla modalità deep-sleep ogni volta che viene rilevato un movimento (indipendentemente dalla luce ambientale). Sprecheremmo batteria, dato che non ha senso reagire al movimento se è buio, visto che vogliamo una luce notturna.
Una soluzione è inviare il segnale alto dal sensore di movimento all’ESP32 solo se è buio. Possiamo ottenere questo usando il seguente circuito.

Il sensore PIR invia il segnale dal pin DATA al pin 4 dell’ESP32. Ma aggiungiamo l’LDR come resistore di pull-down che abbassa il segnale del sensore di movimento a LOW quando è luminoso. Poiché la resistenza dell’LDR è molto alta al buio, il segnale PIR passa. Ma quando è luminoso la resistenza dell’LDR è bassa e l’uscita DATA viene praticamente deviata a massa (GND) e il pin 4 dell’ESP32 legge un segnale LOW.
Se vuoi maggiori dettagli su come rilevare la luce usando un LDR, dai un’occhiata al nostro tutorial How to detect light using an Arduino.
Nella sezione seguente ti mostrerò come usare questo circuito per costruire una luce notturna semplice.
Costruire una luce notturna semplice
In questa sezione costruiamo una luce notturna semplice che accende un LED se viene rilevato un movimento al buio.
Circuito per una luce notturna semplice
Di seguito trovi il circuito per questa luce notturna. È composto dal sensore di movimento AM312 (PIR), dalla fotoresistenza (LDR) per misurare la luce ambientale e da un LED con un resistore di limitazione corrente.
Colleghiamo l’alimentazione per il sensore di movimento e la sua uscita al Pin 4 dell’ESP32. Poi colleghiamo l’LDR all’uscita del PIR e a massa. Infine aggiungiamo il LED, controllato tramite il Pin 16 dell’ESP32.

Puoi trovare la tabella dettagliata dei collegamenti qui.
| Da | Pin | Colore filo | A | Pin |
| ESP32 | 3.3V | Rosso | Breadboard | Binario positivo |
| ESP32 | GND | Blu | Breadboard | Binario negativo |
| PIR | GND | Blu | Breadboard | Binario negativo |
| PIR | VIN | Rosso | Breadboard | Binario positivo |
| PIR | Out/Signal | Giallo | Breadboard | LDR |
| Breadboard | LDR | Giallo | ESP32 | 4 |
| ESP32 | 16 | Arancione | Resistore | Qualsiasi |
| Resistore | Qualsiasi | – | LED | Anodo (pin lungo) |
| LED | Catodo (pin corto) | Blu | Breadboard | Binario negativo |
Ora, il codice.
Codice per una luce notturna semplice
La buona notizia è che devi scrivere pochissimo codice per controllare la luce notturna. Vedi sotto.
Per prima cosa definiamo due costanti per i pin a cui sono collegati il sensore di movimento (PIR_PIN) e il LED (LED_PIN). Nella funzione setup() impostiamo il PIR_PIN in modalità input, perché leggiamo da esso. E il LED_PIN lo impostiamo in modalità output, perché scriviamo su di esso.
#define PIR_PIN GPIO_NUM_4
#define LED_PIN GPIO_NUM_16
void setup() {
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
esp_sleep_enable_ext0_wakeup(PIR_PIN, 1);
digitalWrite(LED_PIN1, HIGH);
delay(5000);
esp_deep_sleep_start();
}
Nella funzione loop() vogliamo mettere l’ESP32 in modalità deep-sleep, svegliarlo quando viene rilevato un movimento e poi accendere il LED per un breve periodo. A questo scopo, specifichiamo prima quale pin abilita il risveglio tramite esp_sleep_enable_ext0_wakeup(PIR_PIN, 1). Se il PIR_PIN diventa alto (=1) svegliamo l’ESP32.
Nota che non tutti i pin possono essere usati come sorgente di risveglio. Il risveglio è supportato solo per i seguenti pin: 0, 2, 4, 12-15, 25-27, 32-39.
Ogni volta che ci svegliamo, accendiamo il LED tramite digitalWrite, lo lasciamo acceso per 5 secondi (5000ms) usando delay, e poi torniamo in deep sleep chiamando esp_deep_sleep_start().
Come puoi vedere, il codice è molto semplice. Usare il deep-sleep farà risparmiare tantissima batteria e ci permetterà di far funzionare la luce notturna molto più a lungo.
Ora hai una luce notturna molto semplice. Nella sezione successiva aumenteremo la sua luminosità e aggiungeremo un effetto di attenuazione per renderla più interessante.
Costruire una luce notturna più luminosa con attenuazione
In questa sezione aggiungiamo un secondo LED per rendere la luce notturna più luminosa e riduciamo lentamente la luminosità nel tempo. Questo dà un avviso che la luce sta per spegnersi.
Circuito per una luce notturna più luminosa con attenuazione
Il circuito è essenzialmente lo stesso di prima. Aggiungiamo solo un secondo LED controllato tramite il Pin 17 dell’ESP32. Scegliamo di aggiungere il secondo LED a un’uscita diversa per evitare di sovraccaricare il pin. L’ESP32 fornisce volentieri una corrente di 20mA sui suoi pin di uscita, che va bene per un singolo LED. Ma collegare più LED a un solo pin causerebbe una corrente troppo alta! Quindi usiamo un altro pin o un transistor per controllare più LED. Poiché abbiamo molti pin liberi, optiamo per la soluzione più semplice e usiamo un pin aggiuntivo.

Di seguito trovi la tabella completa dei collegamenti
| Da | Pin | Colore filo | A | Pin |
| ESP32 | 3.3V | Rosso | Breadboard | Binario positivo |
| ESP32 | GND | Blu | Breadboard | Binario negativo |
| PIR | GND | Blu | Breadboard | Binario negativo |
| PIR | VIN | Rosso | Breadboard | Binario positivo |
| PIR | Out/Signal | Giallo | Breadboard | LDR |
| Breadboard | LDR | Giallo | ESP32 | 4 |
| ESP32 | 16 | Arancione | Resistore | Qualsiasi |
| Resistore | Qualsiasi | – | LED1 | Anodo (pin lungo) |
| LED1 | Catodo (pin corto) | Blu | Breadboard | Binario negativo |
| ESP32 | 17 | Verde | Resistore | Qualsiasi |
| Resistore | Qualsiasi | – | LED2 | Anodo (pin lungo) |
| LED2 | Catodo (pin corto) | Blu | Breadboard | Binario negativo |
Il codice per questa luce notturna è una leggera estensione del codice precedente. Lo discuteremo nella sezione successiva.
Codice per una luce notturna più luminosa con attenuazione
Per prima cosa aggiungiamo un’altra costante per il secondo LED (LED_PIN2). Poi aggiungiamo una nuova funzione fade() per attenuare i LED nel tempo. Per fare il fade riduciamo il brightness dal massimo di 255 a un valore basso di 50 in un ciclo. In ogni passo controlliamo la luminosità dei LED tramite analogWrite e poi aspettiamo 100ms usando delay(). Quindi per 255-50 = 205 passi e con un ritardo di 100ms, ci vorranno 20,5 secondi prima che i LED si spengano.
Per altri effetti di illuminazione possibili, dai un’occhiata al nostro tutorial su come Control Halloween Lights using ESP32 on Battery, dove aggiungiamo un effetto di sfarfallio.
#define PIR_PIN GPIO_NUM_4
#define LED_PIN1 GPIO_NUM_16
#define LED_PIN2 GPIO_NUM_17
void fade() {
for(int brightness=255; brightness>50; brightness--) {
analogWrite(LED_PIN1, brightness);
analogWrite(LED_PIN2, brightness);
delay(100);
}
}
void setup() {
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN1, OUTPUT);
pinMode(LED_PIN2, OUTPUT);
}
void loop() {
esp_sleep_enable_ext0_wakeup(PIR_PIN, 1);
fade();
esp_deep_sleep_start();
}
Nella funzione setup() non succede nulla di nuovo. Dobbiamo solo impostare la modalità pin per il LED aggiuntivo. Allo stesso modo, la funzione loop() rimane sostanzialmente invariata. Dopo aver specificato la sorgente di risveglio chiamiamo fade() per attenuare i LED e poi avviamo il deep sleep.
Estensioni
Ci sono tutti i tipi di estensioni che potresti aggiungere a questa implementazione base. Per esempio, potremmo aggiungere un effetto di sfarfallio alla fine del periodo di attenuazione, come fanno alcune luci notturne commerciali. Potremmo usare LED RGB per un effetto colore. Oppure potremmo usare il sensore di movimento come sistema di allarme. Se viene rilevato un movimento, attiviamo il WiFi dell’ESP32 e inviamo una email. Un buzzer di allarme sarebbe facile da integrare.
Possibilità infinite. Per esempio, nella sezione successiva ti mostro come integrare questa luce notturna in un teschio dall’aspetto fantastico.
Caricare il codice tramite Arduino IDE
Se usi la stessa scheda ESP32 che ho elencato nei componenti necessari, seleziona la WEMOS LOLIN32 Lite board e la porta COM corretta. Poi premi il pulsante di upload (->)

Un teschio come luce notturna
Ora abbiamo il circuito per costruire una luce notturna attivata dal movimento e mettere tutto in una scatola con batteria funzionerebbe benissimo. Ma volevo qualcosa di un po’ più interessante. Quindi ho comprato questo mini teschio anatomico elencato tra i componenti necessari. Ha una parte superiore rimovibile e può facilmente contenere tutta l’elettronica.
Qui sotto puoi vedere una foto del teschio aperto e del circuito con la batteria. Ho solo dovuto allargare un po’ le orbite e il naso per far entrare i LED e il sensore di movimento.

Nota che ho anche ridipinto il teschio e aggiunto qualche effetto di invecchiamento. Il prodotto finale è fantastico! Puoi vedere il sensore di movimento nel naso (i LED mancano ancora in questa foto).

Infine, ho esteso un po’ il codice per la funzione fade(). Ho estratto l’impostazione della luminosità per i due LED e aggiunto un ciclo che fa lampeggiare gli occhi tre volte alla fine del periodo di attenuazione. Un altro avviso che la luce sta per spegnersi.
void set_leds(int brightness, int wait_ms) {
analogWrite(LED_PIN1, brightness);
analogWrite(LED_PIN2, brightness);
delay(wait_ms);
}
void fade() {
for(int brightness=255; brightness>50; brightness--) {
set_leds(brightness, 100);
}
for(int i=0; i<3; i++) {
set_leds(0, 500);
set_leds(50, 500);
}
}
Spero ti sia piaciuto questo progetto e ti divertirai a costruire la tua luce notturna.
Conclusione
In questo tutorial abbiamo imparato come costruire una luce notturna attivata dal movimento usando Arduino, sensori PIR e LDR. Combinando la potenza di questi componenti, possiamo creare una soluzione di illuminazione comoda ed efficiente per le nostre case.
Abbiamo iniziato comprendendo i principi di funzionamento sia del sensore di luce (LDR) che del sensore PIR. Il sensore di luce ci aiuta a rilevare il livello di luce ambientale, mentre il sensore PIR rileva il movimento nel suo raggio. Combinando questi due sensori, possiamo creare un sistema che attiva la luce notturna solo quando è buio e viene rilevato un movimento.
Poi abbiamo seguito passo passo il processo di costruzione di una luce notturna semplice. Abbiamo collegato i sensori e il modulo relè ad Arduino, e programmato il controllo della luce in base alle letture dei sensori. Questa luce notturna semplice è perfetta per illuminare piccole aree come corridoi o bagni.
Per chi vuole una luce notturna più versatile, abbiamo anche esplorato la costruzione di una luce notturna più luminosa con attenuazione. L’effetto di attenuazione ci permette di regolare il livello di illuminazione secondo le nostre preferenze.
Infine, abbiamo integrato la luce notturna in un teschio dall’aspetto fantastico.
In conclusione, costruire una luce notturna attivata dal movimento è un progetto divertente e pratico che può migliorare la sicurezza e la comodità della tua casa.
Domande frequenti
Ecco alcune domande comuni sulla costruzione di una luce notturna attivata dal movimento:
D: Come funziona una luce notturna attivata dal movimento?
R: Una luce notturna attivata dal movimento usa una combinazione di un sensore di luce (LDR) e un sensore PIR (infrarosso passivo) per rilevare il movimento nell’area circostante. Quando viene rilevato un movimento e il sensore di luce rileva bassi livelli di luce, la luce si accende.
D: Quali sono i vantaggi di usare una luce notturna attivata dal movimento?
R: Il vantaggio principale è l’efficienza energetica. Si accende solo quando viene rilevato un movimento, risparmiando energia rispetto a una luce notturna tradizionale che rimane accesa tutta la notte. Inoltre, offre comodità perché illumina automaticamente l’area quando qualcuno vi entra.
D: Posso regolare la sensibilità del sensore di movimento?
R: Molti sensori di movimento hanno impostazioni di sensibilità regolabili. Di solito puoi trovare un potenziometro o un jumper sul modulo sensore che permette di regolare la sensibilità. Tuttavia, l’AM312 non offre questa possibilità. Se ti serve, scegli il più grande HC-SR501.
D: A che distanza può rilevare il movimento il sensore?
R: La portata del rilevamento dipende dal modulo sensore specifico che usi. Generalmente, la maggior parte dei sensori PIR ha una portata di circa 5-7 metri. L’AM312 usato qui ha una portata più corta di soli 3-5 metri.
D: Posso usare più sensori di movimento per una copertura migliore?
R: Sì, se vuoi coprire un’area più ampia, puoi usare più sensori di movimento posizionati strategicamente nello spazio. Questo permette una copertura migliore e assicura che la luce notturna si accenda ogni volta che viene rilevato un movimento da qualsiasi direzione.
D: Posso personalizzare la luminosità della luce notturna?
R: Sì, puoi personalizzare la luminosità della luce notturna modificando il codice per controllare il livello di luminosità.
D: Posso usare questo progetto con un Arduino o un’altra scheda ESP32?
R: Assolutamente! Questo progetto è compatibile con Arduino, ESP32 e schede microcontrollore simili. Tuttavia, se vuoi far funzionare la luce notturna a batteria, cerca una scheda a basso consumo energetico.
D: Ho davvero bisogno di un microcontrollore?
R: No, se usi il sensore di movimento più avanzato HC-SR501 sarà sufficiente per una luce notturna semplice. L’HC-SR501 supporta un LDR per rilevare i livelli di luce e ha tempi di attivazione regolabili. Aggiungi una batteria e hai una luce notturna funzionante. Tuttavia, l’HC-SR501 non ha effetto di attenuazione e non può essere usato come sistema di allarme senza elettronica aggiuntiva.
Se hai altre domande o hai bisogno di ulteriore assistenza, sentiti libero di chiedere nella sezione commenti qui sotto.
Link
- Sensors for Arduino and other MCUs – A complete overview
- Arduino UNO And Light Sensor Project
- HC-SR501 PIR Motion Sensor Arduino Tutorial (3 Examples)
- Motion Detection with ESP32 & PIR Sensor
- ESP32 – Motion Sensor – LED
- ESP32 Arduino Tutorial: PIR motion sensor
- ESP32 with PIR Motion Sensor using Interrupts and Timers
- Deep Sleep — Arduino-ESP32 2.0.6 documentation
- ESP32 External Wake Up from Deep Sleep
- In-Depth: ESP32 Deep Sleep & Wakeup Sources
- ESP32 WeMos LOLIN32 Lite high resolution pinout and specs

