Skip to Content

Controlla le luci di Halloween con ESP32 a batteria

Controlla le luci di Halloween con ESP32 a batteria

In questo tutorial imparerai come far funzionare un ESP32 lite a batterie con modalità deep-sleep per controllare le luci di Halloween. E per renderlo davvero interessante, useremo questo per dare a un teschio di Halloween un paio di occhi rossi luminosi e spaventosi 😉

Come parte di questo progetto imparerai a conoscere la scheda di sviluppo Lolin32 lite, la modalità deep-sleep per preservare la batteria e come creare semplici effetti di illuminazione con i LED.

Divertiamoci un po’.

Componenti necessari

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.

Di seguito trovi i componenti necessari per costruire il progetto. Per questo progetto sto usando una vecchia scheda ESP32, ormai deprecata ma ancora reperibile a un prezzo molto basso. È quella elencata qui sotto. Esiste un modello successore con specifiche migliorate, che puoi trovare here. Non l’ho provata personalmente ma dovrebbe funzionare allo stesso modo.

Anche il teschio che ho usato è diverso da quello che ho elencato sotto. Penso che quello sotto abbia un aspetto migliore ma è un po’ più piccolo. Comunque, ho provato e la scheda e la batteria si adattano molto bene.

Infine, tutte le batterie LiPo 903052 che ho trovato hanno il connettore sbagliato. Quindi quelle suggerite sotto! Dovrai tagliare il connettore e sostituirlo con un connettore JST PH 2-pin da 2.0mm. Ma mi piace il formato di queste batterie perché hanno quasi le stesse dimensioni della scheda ESP32.

ESP32 lite Lolin32

ESP32 lite

Dupont wire set

Set di fili Dupont

Half_breadboard56a

Breadboard

USB data cable

Cavo dati USB

Kit resistori e LED

Batteria 1200mAh

Teschio

Collegamento dei componenti

Vogliamo costruire un teschio di Halloween con un paio di occhi rossi luminosi. Per gli occhi usiamo due LED rossi. Inoltre, vogliamo che quegli occhi lampeggino o mostrino qualche altro effetto. Ci serve quindi un microcontrollore.

L’immagine qui sotto mostra come collegare questi componenti.

Breadboard wiring of the ESP32 and the LEDs
Collegamento dei LED all’ESP32

Come vedi, è molto semplice. Colleghiamo il pin GND della scheda ESP32 con un filo blu ai catodi dei due LED (sono i pin più corti). Gli anodi (i pin più lunghi) dei LED sono collegati ai pin 16 e 17 tramite un resistore da 68Ω (fili viola e verde).

Non importa molto quale LED colleghi a quale pin sulla scheda. Assicurati solo di sapere quale LED sarà l’occhio destro e quale l’occhio sinistro.

Per ora usiamo la porta USB per la programmazione e l’alimentazione. Quindi non è necessario collegare la batteria.

Scrivere il software

In questa sezione ti mostrerò come implementare il software di controllo per i LED. Puntiamo al seguente effetto:

  • una fase di 5 secondi in cui gli occhi/LED si oscurano lentamente con un leggero sfarfallio casuale alla fine
  • seguita da un’altra fase di 5 secondi in cui i LED sono completamente spenti.

Vogliamo dare l’impressione che il teschio si svegli improvvisamente, ti fissi con occhi rossi e luminosi e poi lentamente si addormenti fino a dormire per un po’.

Se sei completamente nuovo nel mondo Arduino, dai un’occhiata al nostro tutorial How To Blink An LED Using Arduino prima. Altrimenti, dai una rapida occhiata al codice qui sotto. Spiegherò i dettagli nelle sezioni successive.

const int ledPin1 = 16;
const int ledPin2 = 17;

const int ts_ms = 10;               
const int dozingoff_ms = 5000;      
const uint64_t sleeping_ms = 5000;  

void set_brightness(int brightness) {
  analogWrite(ledPin1, brightness);
  analogWrite(ledPin2, brightness);
}

int effect(int t) {
  long flutter = random(0, 30);
  int brightness = 255 * (dozingoff_ms - t) / dozingoff_ms;
  return brightness < 150 ? brightness + flutter : brightness;
}

void dozingoff() {
  for (int t = 0; t < dozingoff_ms / ts_ms; t++) {
    delay(ts_ms);
    int brightness = effect(t * ts_ms);
    set_brightness(brightness);
  }
}

void sleeping() {
  esp_sleep_enable_timer_wakeup(sleeping_ms * 1000);
  esp_deep_sleep_start();
}

void setup() {
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
}

void loop() {
  dozingoff();
  sleeping();
}

Costanti

Iniziamo definendo alcune costanti. ledPin1 e ledPin2 sono ovviamente i pin a cui sono collegati i LED.

const int ledPin1 = 16;
const int ledPin2 = 17;

const int ts_ms = 10;               
const int dozingoff_ms = 5000;      
const uint64_t sleeping_ms = 5000;  

Dopodiché, abbiamo alcune costanti temporali. Le usiamo per regolare la durata delle fasi di addormentamento e di sonno. Questi tempi sono in millisecondi (ms), quindi 5000ms sono 5 secondi.

Puoi modificare queste costanti come preferisci per rendere le due fasi più corte o più lunghe. Rendi dozingoff_ms più grande se vuoi un addormentamento più lento. E rendi sleeping_ms più grande se vuoi una fase di sonno più lunga.

Parleremo del passo temporale ts_ms più avanti.

Funzioni di supporto

Successivamente implementiamo alcune funzioni di supporto utili per mantenere il codice ben strutturato e leggibile. Usiamo la funzione set_brightness() per impostare la luminosità dei due LED. Dove analogWrite() fa il lavoro vero e proprio.

void set_brightness(int brightness) {
  analogWrite(ledPin1, brightness);
  analogWrite(ledPin2, brightness);
}

Nota che avremo bisogno di un pin che supporti la modulazione a larghezza di impulso (PWM) perché analogWrite() funzioni. Per la scheda ESP32 che usiamo qui non è un problema. I pin 16 e 17 sono pin PWM e lo sono quasi tutti i pin su quella scheda. Dai un’occhiata al diagramma pinout sotto Pinout della scheda ESP32.

Il parametro brightness sarà un valore tra 0 e 255, dove 255 significa massima luminosità.

Per creare l’effetto di addormentamento, implementiamo una funzione chiamata effect(). Sorpresa, sorpresa. Prende un passo temporale t come parametro e nel tempo diminuisce la luminosità del LED da 255 a 0. Per renderlo più interessante, aggiungiamo uno sfarfallio casuale a metà dell’addormentamento. Questo darà l’impressione che il teschio lotti contro il sonno con palpebre tremolanti. Lo so, i teschi non hanno palpebre, comunque …

int effect(int t) {
  long flutter = random(0, 30);
  int brightness = 255 * (dozingoff_ms - t) / dozingoff_ms;
  return brightness < 150 ? brightness + flutter : brightness;
}

Spero che il diagramma seguente chiarisca come funziona nel dettaglio.

Diagram of the dozing-off and sleeping phases that regulate the LED brightness

Funzione di addormentamento

Useremo la funzione effect() nella funzione dozingoff() mostrata qui sotto. Questa funzione semplicemente itera sui passi temporali di lunghezza ts_ms, calcola la luminosità tramite la funzione effect() e poi imposta la luminosità del LED di conseguenza.

void dozingoff() {
  for (int t = 0; t < dozingoff_ms / ts_ms; t++) {
    delay(ts_ms);
    int brightness = effect(t * ts_ms);
    set_brightness(brightness);
  }
}

Puoi cambiare la lunghezza dei passi temporali, il che porterà a un effetto più fluido o più grossolano. Ho scelto 10ms, che funziona bene. Puoi risparmiare batteria rendendolo più lungo ma l’animazione non sarà così fluida.

Funzione di sonno

Per far dormire la testa, potremmo semplicemente impostare la luminosità dei LED a zero e poi aspettare la durata della fase di sonno. Il codice qui sotto fa esattamente questo.

void sleeping() {
  set_brightness(0);
  delay(sleeping_ms);
}

Tuttavia, sprecheremmo preziosa energia della batteria, poiché il microprocessore rimane acceso senza fare nulla durante la fase di sonno. Invece, mettiamo il microprocessore in modalità deep-sleep mode, dove consuma molta meno energia. Il codice qui sotto mostra come si fa.

void sleeping() {
  esp_sleep_enable_timer_wakeup(sleeping_ms * 1000);
  esp_deep_sleep_start();
}

Per prima cosa, specifichiamo come vogliamo svegliarci. Ci sono diversi modi per farlo ma qui impostiamo un timer tramite esp_sleep_enable_timer_wakeup (). Prende il tempo di sonno in microsecondi. Per questo dobbiamo moltiplicare sleeping_ms per 1000.

E nella seconda riga semplicemente avviamo la modalità deep sleep chiamando esp_deep_sleep_start(). Nota che questo significa che la funzione setup e loop verranno eseguite, poi la scheda si addormenta, si risveglia e ripete il ciclo, iniziando dalla funzione setup.

Funzione setup

La nostra setup è molto semplice. Impostiamo solo i pin che controllano i LED in modalità output. Fatto.

void setup() {
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
}

Funzione loop

E grazie alle nostre funzioni di supporto, la funzione loop è altrettanto semplice. Ci addormentiamo, poi dormiamo e basta.

void loop() {
  dozingoff();
  sleeping();
}

Tieni presente però che la funzione loop verrà eseguita solo una volta, poiché entriamo in modalità deep-sleep durante il sonno e poi riavviamo la scheda al risveglio.

Risparmio energetico

Vogliamo far funzionare il nostro teschio spaventoso a batterie. E la domanda ovvia è: per quanto tempo funzionerà e quanto aiuta la modalità deep-sleep.

Sto usando una batteria LiPo da 1200mAh . Ho misurato la corrente durante la fase di addormentamento (LED accesi) a 50mA. In deep-sleep la scheda consuma solo 0.054mA e se uso delay() invece, il consumo sale a 39mA . Ora facciamo i conti.

Prima convertiamo la capacità della batteria in Coulomb:

1200mA x 3600s = 4320000mC

Per la fase di addormentamento, quando la scheda è attiva per 5 secondi, consumiamo

50mA x 5s = 250mC

Durante i 5 secondi in modalità deep sleep, però, consumiamo solo

0.054mA x 5s = 0.27mC

In totale, consumiamo 250mC + 0.27mC = 250.27mC ogni 10 secondi.

Quindi otteniamo un tempo di funzionamento continuo di circa

10s * 4320000mC / 250.27mC ≈ 17263s ≈ 48 ore = 2 giorni

Se non usiamo la modalità deep-sleep quel tempo si dimezza. Se vuoi aumentare il tempo di funzionamento rendi la fase di sonno più lunga (o quella di addormentamento più corta). Oppure usa una batteria più grande, ovviamente.

Pinout della scheda ESP32

In questa sezione voglio evidenziare alcuni aspetti specifici della scheda Lolin32 lite che stiamo usando per questo progetto. Troverai il pinout qui sotto.

Questa scheda è particolarmente adatta per progetti a batteria, poiché ha un connettore per batteria e un circuito di ricarica con corrente massima di 500mA. Questo significa che puoi collegare una batteria LiPo alla scheda, farla funzionare a batteria e ricaricarla tramite la porta USB. Molto comodo!

Inoltre, le correnti in deep sleep sono piuttosto basse. La specifica dice 125mA con WiFi acceso e 45mA con WiFi spento, che è quello che ho misurato più o meno.

Senza batteria collegata, e la scheda alimentata via USB, vedrai un continuo sfarfallio del LED di ricarica. Questo è normale! Se colleghi una batteria lo sfarfallio si fermerà. Se la batteria è in carica il LED sarà blu fisso e si spegnerà quando sarà completamente carica.

Nota che la scheda funziona con un livello logico di 3.3V. Quindi non tutti i moduli per Arduino funzioneranno necessariamente con questa scheda, dato che Arduino funziona a 5V.

Infine, un avvertimento. Il connettore della batteria è un JST PH 2-pin da 2.0mm. Ma la maggior parte delle batterie con questo connettore ha polarità invertita! Guarda attentamente le marcature sulla scheda. Nella foto sopra il pin positivo è a sinistra. Assicurati che il filo rosso della batteria sia collegato al pin positivo. Ho dovuto tagliare e invertire il connettore sulla mia batteria.

Cablaggio del teschio di Halloween

Mentre la breadboard è ottima per testare il circuito, non entrerà nel teschio. Una volta confermato che tutto funziona, dovrai saldare i fili alla scheda e ai LED. Ecco come appare il mio cablaggio

Wiring of the ESP32 board
Inside of the Halloween skull and its LED eyes

Il teschio che ho comprato non aveva la parte superiore rimovibile. Quindi ho dovuto tagliare il fondo e praticare due fori per gli occhi. L’ho anche ridipinto e invecchiato un po’. Ma sono molto soddisfatto del prodotto finale

Halloween skull with exposed circuitry

Soprattutto dopo che tutto è stato ben nascosto:

Another Halloween skull with red glowing eyes

Conclusione

In questo articolo abbiamo esplorato come controllare le luci di Halloween usando un Lolin32 lite alimentato a batteria. Abbiamo iniziato elencando i componenti necessari, inclusa la scheda LoLin32 Lite, ottima scelta per progetti a batteria. Poi abbiamo discusso il processo di collegamento dei componenti e il cablaggio dei LED per il teschio di Halloween.

Successivamente abbiamo scritto il software per l’ESP32, programmando il controllo delle luci e l’ingresso in modalità deep sleep per risparmiare energia. Questo permette alle luci di funzionare per un lungo periodo senza alimentazione costante.

In generale, questo progetto offre un modo divertente e creativo per aggiungere un tocco spettrale alle tue decorazioni di Halloween. Usando l’ESP32 e pochi componenti semplici, puoi facilmente controllare le luci di Halloween e creare un’esperienza memorabile per i bambini che fanno dolcetto o scherzetto.

Naturalmente, si può fare molto di più. Aggiungere un sensore PIR o radar per accendere le luci solo quando viene rilevata una persona. Oppure aggiungere un modulo sonoro e più effetti luminosi, o controllare la testa via Wi-Fi. Le possibilità sono infinite.

Se hai domande o incontri problemi durante il progetto, consulta la sezione Domande Frequenti qui sotto per ulteriori indicazioni.


Domande Frequenti

Ecco alcune domande comuni sul controllo dei LED con ESP32 a batteria:

D: Posso usare qualsiasi scheda ESP32 per questo progetto?

R: Sì, puoi usare qualsiasi scheda ESP32 per questo progetto. Tuttavia, in questo post usiamo specificamente la scheda LoLin32 Lite, perché è facile da alimentare a batteria.

D: Quanto dura la batteria?

R: La durata della batteria dipende da vari fattori, come la capacità della batteria, il consumo delle luci e la durata della modalità sleep dell’ESP32. Si consiglia di usare una batteria ad alta capacità e ottimizzare il codice per minimizzare il consumo e prolungare la durata. Vedi i calcoli sopra.

Per modi più avanzati di risparmiare energia dai un’occhiata a questo eccellente post: ESP32: Tips to increase battery life.

D: Posso usare luci diverse invece del teschio di Halloween?

R: Assolutamente! Puoi usare qualsiasi tipo di luci preferisci. Il cablaggio e il codice possono variare a seconda delle luci scelte, ma il concetto generale rimane lo stesso. Un’idea carina sarebbe usare LED RGB per avere effetti di colore.

D: È possibile controllare più set di luci con un solo ESP32?

R: Sì, è possibile controllare più luci con un solo ESP32. Puoi collegare più luci in parallelo o usare un multiplexer per controllarle individualmente. Tuttavia, tieni presente che il consumo di energia aumenterà di conseguenza, influenzando la durata della batteria.

D: Posso modificare il codice per aggiungere più funzionalità?

R: Certamente! Il codice fornito in questo post è un esempio base per iniziare. Puoi modificarlo ed espanderlo per aggiungere più funzionalità, come diversi schemi di illuminazione, controllo remoto o integrazione con altri dispositivi smart home.

D: Posso alimentare l’ESP32 usando un cavo USB invece della batteria?

R: Sì, puoi alimentare l’ESP32 con un cavo USB invece della batteria. Tuttavia, lo scopo di questo progetto è renderlo portatile e senza fili usando una batteria. Se preferisci una configurazione cablata, puoi collegare l’ESP32 a una fonte di alimentazione via USB.

Link

Di seguito alcuni link utili con informazioni aggiuntive.