Impariamo a programmare la ESP8266 affinché risparmi energia e vada in modalità Deep Sleep
Nella realizzazione di alcuni progetti sarà necessario affidarsi a batterie o fonti energetiche similari che vanno razionalizzate e gestite nel miglior modo. Affinché si utilizza solo a necessità e prolungare la carica, impareremo a programmare la funzionalità di Deep Sleep, ossia apprenderemo come “mandare a dormire” la nostra scheda e a farla svegliare solo a quando necessario. La scheda, durante il Deep Sleep, riduce le funzionalità al minimo, disattivando processore, WiFi e lasciando attivo solo il temporizzatore integrato, arrivando a consumare pochissimi µA. Vi informiamo che il Deep Sleep non è la sola modalità di risparmio energetico, ma esistono anche la Modem Sleep e la Light Sleep, meno efficienti ed utilizzate, che ci riserveremo di trattare in un secondo tempo.
Componenti
Come da titolo, per il Deep Sleep adopereremo una qualsiasi ESP8266, facendo però attenzione ai collegamenti da effettuare e che approfondiremo a breve. Ci concentreremo su due possibili scenari: il primo, in cui la dev-board va a dormire per un certo lasso di tempo, la seconda, in cui la ESP8266 va a dormire a tempo indeterminato, fin quando non accadrà un determinato evento che la farà svegliare. Per il primo caso sarà necessaria una ESP8266 ed un jumper, mentre nel secondo caso aggiungeremo un pulsante e la relativa resistenza.
Come sempre vi lasciamo in descrizione la lista del materiale che adopereremo:
Lista acquisti su Amazon:
- NodeMCU V3: https://amzn.to/3c2fUWR
- Wemos D1 Mini: https://amzn.to/3r7kQ14
- ESP-01: https://amzn.to/393myu5
- Jumper: https://amzn.to/2NAYAPk
- Pulsante: https://amzn.to/3lAbnhu
- Resistenza: https://amzn.to/3r6b9A2
Lista acquisti su Aliexpress:
- NodeMCU V3: http://s.click.aliexpress.com/e/_dWOiOZh
- Wemos D1: https://s.click.aliexpress.com/e/_d8ubrLJ
- ESP-01: https://s.click.aliexpress.com/e/_dTa1fed
- Resistenze: https://s.click.aliexpress.com/e/_dTVj0GV
- Jumper: https://s.click.aliexpress.com/e/_dYOtlu6
- Pulsante: https://s.click.aliexpress.com/e/_d80R6pr
Collegamenti
Analizziamo il primo caso di Deep Sleep, con il quale manderemo in Deep Sleep la ESP8266 per un certo lasso di tempo. Partiamo collegando il pin D0 del NodeMCU al pin RST (reset). Gli stessi collegamenti vanno effettuati per il WeMos D1 Mini.
Nel caso in cui volessimo adoperarlo alla ESP-01, la cosa si complica un po’. Sarà necessario saldare il pin GPIO16, molto piccolo, ad un cavo che va connesso al pin RST della ESP-01. Vi sconsigliamo di adoperarvici se non siete sufficiente pratici.
Passiamo ora ai collegamenti da effettuare per il secondo caso, ossia impostare il Deep Sleep e attendere un evento per destare la scheda. Adopereremo un NodeMCU, ma i medesimi collegamenti valgono anche per il Wemos D1 Mini. Collocheremo un pulsante, collegato al pin RST ed al GND e porremo una resistenza da 220 OHM dalla quale fare partire il collegamento al pin D0. Alla pressione del pulsante viene inviato un segnale che sveglierà la scheda.
Codice
Passiamo a stendere il codice [LINK] per il Deep Sleep temporizzato. Vi rammentiamo anche sarà necessario predisporre la ESP-01 come visto in precedenza a questo LINK. Inoltre è importante anche che la IDE di Arduino sia impostata alla programmazione delle ESP8266, cosa affrontata a questo LINK. Iniziamo definendo il tempo per il quale la scheda deve dormire, pertanto dichiariamo una variabile intera chiamata tempo e impostiamo il valore a 5 secondi, rammentando che si tratta di microsecondi e non millisecondi.
int tempo = 5e6;
Nel VOID SETUP avviamo il monitor seriale, facciamo accendere e spegnere il led integrato e poi mandiamo a dormire la scheda per 5 secondi, trascorsi i quali ripeterà l’azione descritta. Non tratteremo il VOID LOOP in quanto rimarrà vacante. Ricordiamo che per caricare il codice, sarà prima necessario scollegare il pin RST dal pin D0.
void setup() { Serial.begin(9600); Serial.println("Sveglio!"); pinMode(LED_BUILTIN,OUTPUT); digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000); digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000); ESP.deepSleep(tempo); }
Vediamo ora come destare la ESP8266 dal Deep Sleep grazie ad un pulsante [LINK]. Il codice è pressoché identico al primo. Non creeremo una variabile per determinare il tempo, poiché non sarà necessario temporizzare il processo. Per poter programmare il Deep Sleep con tempo indeterminato, basterà inserire 0 nella funzione ESP.deepSleep.
void setup() { Serial.begin(9600); Serial.println("Sveglio!"); pinMode(LED_BUILTIN,OUTPUT); digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000); digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000); ESP.deepSleep(0); // Indeterminato }
Una volta caricato lo sketch basterà premere il pulsante per attivare il codice. La ESP8266 tornerà a dormire fino alla prossima pressione. Misurando poi con un multimetro digitale possiamo notare il consumo reale in fase di Deep Sleep.