ESP8266: utilizzo della modalità deep sleep e della memoria RTC per ridurne i consumi

Come incrementare la durata delle batterie da qualche ora a settimane.

Lo scenario è quello dell'utilizzo di un modulo di sviluppo basato su ESP8266, ad esempio Wemos D1 Mini, non collegato alla rete elettrica ma a delle batterie e non vogliamo che queste si scarichino troppo in fretta.

Al contrario invece, quando il modulo è alimentato normalmente, non ci preoccupiamo dei suoi consumi elettrici, per cui lo lasciamo sempre acceso con il wifi abilitato pronto ad interagire come client o server in qualsiasi momento. In queste condizioni i suoi 80 mA di consumo medi di corrente non sono una reale preoccupazione.

Se lo usassimo sempre attivo anche quando l'alimentazione è a batteria, questa si esaurirebbe nel giro di qualche ora. 

Per esempio una batteria stilo AA da 1,5V da 2000 mAh durerebbe al massimo 2000:80=25 ore, ovvero circa un giorno, senza contare i picchi nell'utilizzo del wifi che fanno scendere ulteriormente le ore di funzionamento. Troppo poco se pensiamo di lasciare il dispositivo funzionante senza un nostro continuo intervento.



Deep sleep

Gli sviluppatori del ESP8266 ci sono venuti incontro rilasciando delle modalità di funzionamento a basso consumo di energia. In questo modo si potrà "addormentare" il sistema nei momenti in cui non deve effettuare attività, ad esempio se ha terminato una lettura da un sensore e la prossima sarà dopo un intervallo determinato. 

Ci sono diverse possibilità di sleep mode, qui ci occupiamo della modalità Deep-Sleep ovvero quella che consente il maggior risparmio. L'ordine di grandezza della corrente assorbita durante il deep-sleep passa dai milliampere ai microampere, ovvero da 10^(-3) --> 10^(-6) ampere, ed è possibile così passare dalle ore alle settimane di autonomia, perchè le batterie si scaricheranno molto meno.

In parole povere, il dispositivo in modalità deep-sleep è come se fosse spento,  disattivando il wifi ovviamente, la CPU e altre attività dispendiose, conservando solamente la funzionalità interna di Real Time Clock (RTC), ovvero quella che gli consentirà di svegliarsi nel momento in cui sarà passato il timer impostato.

Il principio è semplice: visto che il PIN di RESET ha normalmente lo stato ALTO quando il dispositivo è acceso, il suo relativo collegamento al PIN D0, che è un PIN speciale, gli consente di ricevere lo stato BASSO allo scadere del tempo impostato. Questo provocherà un restart del microcontrollore che quindi si sveglierà e rieseguirà il codice.


Vediamo l'istruzione da dare:
ESP.deepSleep(sleep period, WiFi option); 

sleep period: è un valore in microsecondi ed è limitato dal massimo valore di un intero senza segno (corrispondente a 71 minuti).

WiFi option: se non si specifica, al riavvio si riattiva il WiFi. Usando invece il valore WAKE_RF_DISABLED, il WiFi non si attiva ed è possibile risparmiare in questo modo energia anche nel funzionamento normale.

Controindicazioni: il timing fornito da RTC non è precisissimo (ad esempio dipende dalla temperatura di funzionamento) per cui va bene in tutti gli scenari in cui non è fondamentale il rispetto di un orario preciso al minuto.

Ad esempio nella realizzazione dell'impianto automatico per l'innaffiatura a batteria, dopo ogni ora di deep sleep il modulo si riavvia senza Wi-Fi, legge le informazioni tramite PIN analogico e le storicizza nella stessa memoria messa a disposizione dal RTC con le modalità descritte di seguito.

Solo dopo 24 ore, tutti i valori letti durante la giornata vengono inviati al cloud. Quindi in questo modo il WiFi si attiva solo una volta al giorno.

In uno scenario di questo tipo potrebbe non essere fondamentale che l'innaffiatura parta esattamente ad un certo orario, l'importante è che circa 24 ore dopo ce ne sia un'altra di innaffiatura...

Memoria RTC

Gli sviluppatori del modulo ESP8266 hanno previsto che parte della memoria del sistema RTC sia disponibile per un accesso utente, rilasciando delle API specifiche per scriverci e leggerci.

La memoria RTC è di 768 bytes organizzati in blocchi di 4 byte. In una singola operazione è possibile leggere o scrivere multipli di 4 byte, specificando la posizione in memoria come blocco di partenza e la quantità di blocchi necessari alla scrittura o lettura:

  Blocchi totali = 768 / 4 = 192

  --> I primi 256 bytes sono riservati al funzionamento del sistema e non possono essere usati;
  --> I successivi 512 bytes, ovvero quelli a partire dal blocco 64, possono essere usati per memorizzare dati che soppravviveranno al deep sleep: 



Esempi di utilizzo delle API di scrittura/lettura memoria RTC:


system_rtc_mem_write(RTC_block, &Variable, Variable_size);
--> scrive a partire dal blocco RTC_block il valore attuale della variabile Variable, allocando il numero di bytes Variable_size (pari ad un multiplo di 4 bytes, es.: 4, 8, 12, ecc.). Se ad esempio volessimo allocare nel primo blocco disponibile della RTC (64) una variabile chiamata hours che ha una struttura composta da un data type di tipo int (4 bytes necessari) e il cui valore in quel momento sia 24, la sintassi sarebbe: system_rtc_mem_write(64, &hours4). 

In questo modo memorizzeremmo il valore 24 all'interno del ESP8266 e ce lo ritroveremmo ancora disponibile anche dopo un ciclo di deep sleep.  

system_rtc_mem_read(RTC_block, &Variable, Variable_size);
--> legge a partire dal blocco RTC_block per un numero di bytes Variable_size (sempre pari ad un multiplo 4) e lo immagazzina nella variabile Variable.  Se ad esempio volessimo leggere a partire dal primo disponibile della RTC (64) e per un numero di bytes pari a 4, il valore della memoria RTC e ripristinarlo nella variabile hours di prima, la sintassi sarebbe: system_rtc_mem_write(64, &hours4). 

Ci ritroveremmo quindi il valore 24 salvato con l'istruzione precedente all'interno della variabile hours, anche se nel frattempo è intervenuto un ciclo di deep sleep. 

Ulteriori dettagli su queste funzioni possono essere trovati qui.

Conclusioni

Riassumendo, abbiamo visto come sia semplice con qualche accorgimento incrementare la vita delle batterie in modo da poter utilizzare un modulo basato su ESP8266 senza la necessità di un collegamento alla rete elettrica di casa.
Fatemi sapere per eventuali commenti. 

Grazie per la lettura.

Commenti

Post più popolari