Monatelanger ESP8266 Batteriebetrieb mittels Deep-Sleep

Hat man einen Mikrocontroller wie den ESP8266 NodeMCU im Außenbetrieb, läuft dieser oftmals über portable Stromversorgung wie bspw. Akkus, Batterien oder Powerbanks. Daher ist es von enormer Bedeutung, dass der Stromverbrauch beim ESP8266 Batteriebetrieb möglichst gering gehalten wird.

Dafür hat der ESP8266 einen sog. „Deep Sleep“ Modus, in welcher der NodeMCU inaktiv ist und somit kaum Strom verbraucht – perfekt also für den Batteriebetrieb. Wie man diesen nutzt und welche Vorkehrungen dafür zu treffen sind, behandeln wir in diesem Tutorial.

 

Zubehör

Bei der mobilen Stromversorgung ist es natürlich besser ein Modul zu nehmen, welches optimiert ist. Falls du also nur einen bzw. zwei GPIO’s benötigst, ist ein ESP-01 besser als ein ESP-12 geeignet. Je nach Spannungsquelle (Batterie vs. Powerbank) sollte auch die Eingangsspannung beachtet werden, da bspw. das NodeMCU Development Board 5V benötigt.

Ich habe zum Test eine einfache LED genommen.

Daneben ist natürlich eine mobile Stromquelle erforderlich. Hierzu gibt es zwei Möglichkeiten:

  1. Powerbank (alternativ mit 10.000 mAH)
  2. 3.7V Li-ion Akku (Typ 18650)

Eine Powerbank hat den Vorteil, dass ggf. auch andere USB Geräte geladen werden können. Außerdem ist das NodeMCU Developer Board auch ohne weiteres damit zu betreiben.
Ein Lithium-Ionen Akku hingegen liefert nur 3.7V statt 5V, was aber für einen normalen ESP8266 (bspw. ESP-01) ausreicht. Allerdings ist zum Aufladen ein Ladegerät nötig, da diese Art von Akkus recht empfindlich ist. Wer ein Labornetzteil sein eigen nennt, kann die Li-ion Batterie auch gemäß dieser Anleitung aufladen.

Aufbau für den ESP8266 Batteriebetrieb

Der wichtigste Schritt, neben der Verkabelung der Sensoren, ist der Anschluss an die Stromquelle. Wer eine Powerbank nutzt, wird wohl kaum Schwierigkeiten haben, weshalb es anschließend nur kurz um die Verbindung einer Li-Ion Batterie geht (äquivalent für Li-po / Lithium-Polymer-Akkumulatoren).

Verkabelung des ESP-12 (links) und ESP-01 (rechts) mit einer LED und einer Spannungsquelle (Lipo / Li-ion Akku, alternativ per USB Powerbank).

Falls du ein 5V Modul verwendest, muss natürlich auch eine dementsprechende Spannung vorhanden sein.

Darüber hinaus muss der entsprechende Aufbau natürlich dem Ziel angepasst werden. So haben wir bspw. bereits einen Wetterstation Außenposten mit dem DHT22 Temperatur und Luftfeuchtigkeitssensor gebaut. Man könnte dieses Szenario nehmen und bspw. nur alle X Minuten eine Messung vornehmen und in der restlichen Zeit den ESP8266 schlafen lassen, sodass kaum Strom verbraucht wird.

 

Neben dem Anschluss der Sensoren etc. ist eine Verbindung von GPIO16 (D2) zu RST nötig, falls du den ESP8266 jeweils für eine gewisse Zeitspanne schlafen lassen möchtest. Die Alternative wäre die Pins nicht zu verbinden und ihn per Interrupt aufzuwecken, doch dazu später mehr. Hier der Schaltplan mit der beispielhaften Minischaltung einer LED:

Schaltbild

 

Software – Deep Sleep

Der „Deep Sleep“ Modus setzt den ESP8266 eine Weile in einen extrem stromsparenden Modus, in der nichts weiter ausgeführt wird. Nach der eingestellten Zeit wird ein Signal gesendet, womit der ESP neu startet – deshalb muss GPIO16 auch mit dem Reset verbunden werden, da sonst der Neustart nicht funktioniert:

This function can only be used in the condition that esp8266 PIN32(RST) and PIN8(XPD_DCDC aka GPIO16) are connected together. Using sleep(0) will set no wake up timer, connect a GPIO to pin RST, the chip will wake up by a falling-edge on pin RST.

Der Deep-Sleep Modus hat jedoch eine kleine Einschränkung: Und zwar ist die maximale Dauer auf ca. 71 Minuten begrenzt:

The maximum sleep time is 4294967295us, ~71 minutes.

Das sollte aber für die allermeisten Anwendungen reichen. Wer z.B. Temperatur o.ä. loggt, wird wahrscheinlich ein Zeitfenster unter einer Stunde nehmen.

 

Beginnen wir nun mit dem Aufspielen der Software über den ESPlorer. Wir werden zwei Dateien erstellen und übertragen, wovon die eine unsere „Logik“ enthält und die andere die „init.lua“ sein wird, welche beim Start aufgerufen wird.

Die erste Datei habe ich „dsleep.lua“ genannt und hat bei mir folgenden Inhalt:

Falls du einen Aufruf einer Webseite / API etc. machen willst, beachte dabei, dass der node.sleep() Befehl in das Callback dieser Funktion muss. Ansonsten würde der ESP8266 in den Schlafmodus gesetzt, bevor der Aufruf der Website stattgefunden hat.

Nach dem Speichern und Übertragen dieser Datei, kümmern wir uns die „init.lua“:

Hier musst du natürlich den Namen und das Passwort deines WLANs eintragen. Ich habe in meiner Anwendung vorausgesetzt, dass eine Internet- bzw. Netzwerkverbindung besteht, bevor das andere Skript mittels dofile() aufgerufen wird. Damit jedoch nicht dauerhaft versucht wird sich mit dem Wifi-Netzwerk zu verbinden (z.B. weil es nicht vorhanden ist oder die Daten falsch), habe ich eine Abbruchbedingung nach 10 Sekunden eingebaut. Sollte dies eintreten, wird der ESP8266 nach 60 Sekunden neu gestartet und ist in dieser Zeit im Stromsparmodus.

Mit diesem Beispiel wollte ich nur einmal zeigen, wie so eine Anwendung aussehen kann und darauf hinweisen, worauf geachtet werden muss. Du musst es natürlich nicht exakt so übernehmen, sondern solltest es entsprechend deinen Anforderungen anpassen.

Sobald die Datei übertragen wurde, wirst du sehen, wie die LED jede Minute zweimal kurz aufblinkt. Ich habe dieses Szenario nun schon viele Tage so mit meiner Powerbank, die ich auch im Roboter Projekt genutzt habe, getestet, ohne dass auch nur ein Balken abgenommen hat (bei minütlichem Aufwachen und Verbinden mit dem WLAN, was über 1400 Verbinden pro Tag entspricht). Bei längerem Schlafen kann man die Laufzeit entsprechend weiter erhöhen. Längere Sleep Zeiten ließen sich durch einen Counter ermöglichen: Wer bspw. alle 3 Stunden etwas ausführen möchte, der stellt einen 60 Minuten Timer und ließt bzw. schreibt den Wert in eine Datei. Wurde der Wert erreicht (3x60min), so kann die Aktion ausgeführt werden und der Counter wird zurückgesetzt. Ansonsten wird erneut eine Stunde geschlafen.

 

Möglichkeit 2: Interrupt

Falls du eine andere Anwendung hast, die bspw. nur dann Daten senden soll, sobald ein bestimmtes Ereignis auftritt (z.B. Aktivieren eines Bewegungsmelders, Durchlaufen einer Lichtschranke, etc.), so macht ein Aufwachen nach vorbestimmter Zeit natürlich keinen Sinn.

In diesem Fall nutzen wir:

node.dsleep(0)

Damit wird der Schlafmodus ausgelöst, jedoch wird er nicht mehr selbst erwachen (daher auch kein 71 Minuten Limit).

Dafür darf allerdings GPIO16 und RST nicht verbunden sein. Sobald das Ereignis ausgelöst wurde, senden wir ein kurzes LOW Signal („Falling Edge“) an den RST Pin. Dadurch startet der ESP8266 neu und wir können unsere Aktion ausführen (Serveraufruf, Daten an Raspberry Pi senden, etc.).

Sobald alles fertig ist, sollte der Mikrocontroller wieder in den „Deep Sleep“ Modus versetzt werden (us=0), um so auf den nächsten Interrupt zu warten und in der Zwischenzeit Strom zu sparen.

 

Je nach Auslastung und Anwendung ist es mit einer Li-ion Batterie, einem Li-Po Akku oder einer Powerbank möglich den ESP8266 NodeMCU über einen sehr langen Zeitraum mit Strom zu versorgen. Wer es schafft den Ladestatus auszulesen, könnte bei Bedarf sogar eine Email versenden, sobald die Kapazität zu gering wird. Wenn dich der ungefähre Zeitraum interessiert, kannst du mit einem Multimeter den Strom messen, der im Schlafmodus und während der aktiven Zeit gebraucht wird. Dadurch, das die Kapazität des Akkus / Powerbank bekannt ist, kannst du die ungefähre Dauer berechnen.

6 Kommentare

  1. Hey, ein sehr interessanter Beitrag. Danke dafür. Was ich noch vermisse, ist ein eingehen auf das Thema Tiefentladung bei LiPo’s. Sprich: wie wird verhindert, das der LiPo unter 3,3V fällt und dann „kaputt“ ist?

    Antworten
  2. Eine wirklich dumme Frage von mir, aber wo schließe ich denn eine Powerbank an den ESP8266 an? Da gibt es doch keinen Eingang für Mikro USB oder übersehe ich was?

    Antworten

Hinterlasse einen Kommentar

Deine Email Adresse wird nicht veröffentlicht.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Blog abonnieren

Abonniere Raspberry Pi Tutorials, um kein Tutorial mehr zu verpassen!