Risparmio energetico con NodeMCU – Modem Sleep

Nella realizzazione del software per la stazione meteo (che trovate QUI) mi sono dovuto preoccupare di ridurre al minimo il consumo del NodeMCU per far si che non scaricasse eccessivamente la batteria utilizzata nel mio esperimento, per fare ciò mi sono servito di una pratica funzione chiamata “Modem Sleep” che consente di disattivare temporaneamente il segnale rado della scheda WiFi e di calare drasticamente il consumo totale riducendolo a circa 20mA pur mantenendo attivi gli interrupt e lo scorrimento del codice, vediamo come fare:

NodeMCU (o meglio, la scheda ESP8266…) supporta tre differenti tipologie di risparmio energetico più o meno intense, la prima che osserveremo in questo articolo è il “Modem Sleep” che disattiva solo l’interfaccia radio mantenendo attiva la CPU, poi abbiamo la “Light Sleep” che disattiva il clock della CPU mantenendola ferma per un intervallo prefissato e poi il “Deep Sleep” che disattiva totalmente la CPU fino alla ricezione di un interrupt esterno su un apposito PIN. Entrambe le soluzioni con il maggiore risparmio non ci consentono però di ricevere dati in realtime dalla strumentazione della stazione meteo, opteremo quindi per la prima versione.

Il consumo osservato con il codice in esecuzione e l’interfaccia radio attiva è di circa 80mA con piccoli picchi dovuti alla trasmissione dei dati via MQTT, attivando il Modem Sleep invece scendiamo a 25mA, riattivando il WiFi solo quando realmente necessario.

Vediamo un piccolo codice di esempio:

#include "ESP8266WiFi.h"
#include "WiFiClient.h"

void setup() {
  Serial.begin(115200);
  
}

void loop() {
  WiFi.mode( WIFI_OFF );
  WiFi.forceSleepBegin();
  Serial.println("WiFi is down");
  delay(20000);

  WiFi.forceSleepWake();
  delay(1);
  // Bring up the WiFi connection
  WiFi.mode(WIFI_STA);
  WiFi.begin("XXX", "XXX");

  // Wait until the connection has been confirmed before continuing
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  // Debugging - Output the IP Address of the ESP8266
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  delay(2000);
}

Così facendo al avvio del NodeMCU disattiviamo il WiFi, dopo 20 secondi ci connettiamo, trasferiamo tutti i dati necessari per poi disattivarlo nuovamente. Integrato nel codice della stazione meteo sarà:

if ((now - iotTempUpdateTimestamp) > IOTTEMP_INTERVAL) {
   // Riaccensione WiFi
   risparmio = true;
   WiFi.forceSleepWake();
   delay(1);
   // Bring up the WiFi connection
   WiFi.mode(WIFI_STA);
   WiFi.begin(MySSID, MyWifiPassword);

   while (WiFi.status() != WL_CONNECTED) {
      delay(100);
   }

   aggiornaTemperatura();
   MQTT_connect();
   iotTempUpdateTimestamp = now;
   FeedTemperatura.publish(temperature);
   FeedUmidita.publish(humidity);
   mqtt.disconnect();
   delay(1000);
   MQTT_connect();
   FeedVento.publish(windavg);
   FeedRaffica.publish(windmax);
   windmax = 0.0;
   mqtt.disconnect();
} else {
   if (risparmio) {
   WiFi.mode(WIFI_OFF);
   WiFi.forceSleepBegin();
   risparmio = false;
}

Osservando lo stato della stazione con un PING vediamo che il WiFi rimane ora attivo per circa 3 secondi ogni 5 minuti (intervallo di aggiornamento dei dati su MQTT), riducendo notevolmente il consumo totale.

 

Per chi volesse approfondire l’argomento vi lascio due link di riferimento:

Post Disclaimer

Creative common license BY-NC_SA

Informazioni Importanti

Le informazioni contenute in questo articolo sono di carattere informativo e rispecchiano le opinioni personali del autore. Tutte le guide nel sito vengono proposte "as it is" puramente a scopo didattico. L'utente che accetta di seguirne i passaggi si assume ogni responsabilità in caso di guasto/malfunzionamento o altro problema come conseguenza della modifica.

Nei post di iu2frl.it posso includere collegamenti a rivenditori. Posso ricevere una piccola commissione dal rivenditore se effettui un acquisto dopo aver fatto clic su uno di questi link. I post non sono espressamente sponsorizzati da rivenditori, editori, promotori o produttori, se non diversamente specificato chiaramente e tutte le decisioni editoriali sono prese esclusivamente dagli autori dei singoli articoli.

Tutti i contenuti vengono condivisi con licenza CC BY-NC-SA 4.0: Questa licenza consente ad altri di remixare, adattare e sviluppare i contenuti in modo non commerciale, purché accreditino l'autore originale e concedano in licenza le loro nuove creazioni con gli stessi termini. Per maggiori informazioni visitare il sito Creative Commons.

Important Informations

The information contained in this article is of an informative nature and reflects the personal opinions of the author. All the guides/tutorial on the website are offered "as it is" for educational purposes only. The user who agrees to follow the steps assumes all responsibility in case of failure/malfunctioning or other problem as a result of the modification.

In some posts of iu2frl.it I can include links to resellers. I can get a small commission from the reseller if you make a purchase after clicking on one of these links. The posts are not expressly sponsored by resellers, publishers, promoters or producers, unless otherwise clearly specified and all editorial decisions are made solely by the authors of the individual articles.

All the contents are published as CC BY-NC-SA 4.0: This license lets others remix, adapt, and build upon your work non-commercially, as long as they credit you and license their new creations under the identical terms.. For more informations please visit Creative Commons website.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *