Deep Sleep

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:

Lista acquisti su Aliexpress:



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.

Deep Sleep

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.

Deep Sleep

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.

IFTTT

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.

Deep Sleep