Stell dir vor, du baust einen wetterfesten Außensensor, der einmal täglich die Temperatur misst und die Daten an deinen Server sendet. Oder du entwickelst einen Bewegungssensor für dein Smart-Home-System, der nur aktiviert wird, wenn jemand den Raum betritt. Vielleicht planst du auch eine batteriebetriebene Wildtierkamera, die nur bei Bewegungserkennung Bilder aufnimmt. In all diesen Fällen sorgt Deep-Sleep dafür, dass der Stromverbrauch minimiert wird und deine Sensoren monatelang ohne Batteriewechsel laufen können.
Mit Deep-Sleep kannst du deinen ESP besonders energieeffizient betreiben und die Batterielaufzeit erheblich verlängern. Aber Achtung: Nicht alle Boards sind gleich effizient im Deep-Sleep-Modus.
Zum Kapitel springen Was ist Deep Sleep?
Deep-Sleep ist ein Zustand des Boards, in dem es einen sehr geringen Stromverbrauch aufweist. Grund dafür ist, dass so gut wie alle Funktionen des Boards außer Betrieb sind. Besser gesagt: Alle Funktionen bis auf die RTC (Real-Time Clock).
Hier mal eine Übersicht, welche Funktionen des Boards im Deep-Sleep Modus betroffen sind:
Funktion | Zustand |
---|---|
WLAN | aus |
System clock | aus |
CPU | aus |
RTC | an |
Wir erkennen, dass der Deep-Sleep-Modus tatsächlich ein Standby-Modus ist, in dem nur begrenzte Funktionen verfügbar sind. Dieser Modus ist jedoch entscheidend, um den Stromverbrauch zu minimieren und die Batterielaufzeit zu verlängern.
Zum Kapitel springen Stromverbrauch im Deep-Sleep
Laut verschiedenen Angaben im Netz beträgt der Stromverbrauch während dem Deep-Sleep zwischen 10 und 20 µA. Das entspricht gerade einmal 0,01 - 0,02 mA. Das ist der Wahnsinn! Im Datenblatt ist der Deep-Sleep mit 20 µA angegeben, und damit kann der ESP, je nach Aufgabe, monatelang mit einer einzigen Batterie betrieben werden.
Mehr dazu findest du im Datenblatt des ESP8266 0a-esp8266ex_datasheet_en.pdf im Kapitel Table 3-4. Power Consumption by Power Modes.
Allerdings ist hier Vorsicht geboten. Der Deep-Sleep ist nicht in allen Fällen gleich effizient. In Verbindung mit Entwicklerboards wie zum Beispiel dem D1 Mini kann es zu einem erhöhten Stromverbrauch kommen. Damit ist der Deep-Sleep bei diesen Boards unter Umständen nicht wirklich brauchbar. Entwicklerboards haben zusätzliche Bauteile wie unter anderem den Serial-Konverter, der zusätzlich Strom verbraucht und so die Akkulaufzeit erheblich verringert. In der Messung sind das bei einem ESP8266 D1 Mini etwa 0,001A (1000 µA). Eine Messung des Stromverbrauchs war mir mit dem ESP01-S im Deep-Sleep nicht möglich.
Produktempfehlungen und -suche in Verbindung mit dem Amazon Partnerprogramm:
¹ Angaben ohne Gewähr. Bei einem Kauf über den Link erhalten wir eine Provision.
Zum Kapitel springen Vergleich des Stromverbrauchs im Deep-Sleep
Gerät | Stromverbrauch im Deep-Sleep | Stromverbrauch in mA |
---|---|---|
ESP8266 (Datenblatt) | 20 µA | 0,02 mA |
ESP8266 D1 Mini | 1000 µA | 1,0 mA |
Zum Kapitel springen Beispielrechnung mit einem 300mAh Akku
Angenommen, wir verwenden einen 300mAh Akku. Um zu berechnen, wie lange der Akku hält, verwenden wir die folgende Formel: Batterielaufzeit (in Stunden) = Batteriekapazität (in mAh) / Stromverbrauch (in mA)
-
ESP8266 (Datenblatt):
Batterielaufzeit = 300mAh / 0,02mA = 15000 Stunden
Das sind etwa 625 Tage oder knapp 1,7 Jahre. -
ESP8266 D1 Mini:
Batterielaufzeit = 300mAh \ 0,02mA = 300 Stunden
Das sind etwa 12,5 Tage.
Diese einfache Rechnung zeigt, wie wichtig es ist, den Stromverbrauch genau zu kennen, um die Batterielaufzeit optimal zu nutzen. Natürlich sind diese Werte rein theoretisch und in der Praxis kann es definitiv zu anderen Werten kommen. Jedoch zeigt der Vergleich deutlich, dass Deep-Sleep nicht immer gleich effizient ist.
Zum Kapitel springen Möglichkeiten zum Aufwecken
Zum Aufwecken des ESP8266 während eines Deep-Sleeps gibt es zwei Möglichkeiten:
Produktempfehlungen und -suche in Verbindung mit dem Amazon Partnerprogramm:
¹ Angaben ohne Gewähr. Bei einem Kauf über den Link erhalten wir eine Provision.
-
Aufwecken per Knopfdruck
Eine Möglichkeit, den ESP aus dem Schlaf zu holen, ist der Knopfdruck. Hierbei gibt es keine Zeitbeschränkung. Das Aufwecken per Knopfdruck könnte zum Beispiel für Fernbedienungen jeglicher Art verwendet werden. -
Automatisch nach Ablauf einer bestimmten Zeit
Der ESP kann auch für eine bestimmte Zeit in den Deep-Sleep versetzt werden. Die maximal mögliche Dauer beträgt hierbei 71 Minuten. Diese Methode eignet sich unter anderem für Sensoren, die regelmäßig einen Wert liefern oder abfragen sollen.
Die Beschränkung auf 71 Minuten liegt an der Größe der Variable, die die Zeit im Deep-Sleep speichert. Der Wert wird in Mikrosekunden angegeben und die maximale Größe eines 32-Bit-Integers beträgt 4.294.967.295. Wenn man diesen Wert in Mikrosekunden umrechnet, erhält man etwa 71 Minuten.
Zum Kapitel springen Deep Sleep mit Aufwachen per Knopfdruck
Um den ESP auf unbestimmte Zeit in den Deep-Sleep zu schicken, wird lediglich eine Zeile Code benötigt.
ESP.deepSleep();
In einem Programm könnte das so aussehen:
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, LOW);
delay(5000);
ESP.deepSleep();
}
Sobald der ESP mit Strom versorgt wird, leuchtet die blaue LED für 5 Sekunden. Nach Ablauf des delay(5000);
schicken wir den ESP auf unbestimmte Dauer in den Deep-Sleep-Modus. Zum Aufwecken muss der Pin RST
kurz mit GND
verbunden werden.
Sobald RST nicht mehr mit GND verbunden ist, startet der ESP und führt den gespeicherten Programmcode aus. Die Zeile ESP.deepSleep();
schickt den ESP anschließend wieder schlafen, bis wir ihn erneut aufwecken.
Fertig ist der ESP, der auf Knopfdruck startet, das Programm ausführt, und danach wieder pennen geht.
Zum Kapitel springen Deep Sleep mit Aufwachen per Zeit
Um den ESP für eine bestimmte Zeit in den Deep-Sleep zu schicken, wird die selbe Zeile Code benötigt, diesmal aber mit Zeitangabe. Die Angabe der Zeit erfolgt in Mikrosekunden.
ESP.deepSleep(5000000);
Diese Zeile schickt den ESP für 5 Sekunden in den Deep-Sleep. In der Funktion können auch mathematische Bezeichnungen verwendet werden. Folgende Zeile schickt den ESP ebenfalls für 5 Sekunden in den Deep-Sleep.
ESP.deepSleep(5e6);
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, LOW);
delay(5000);
ESP.deepSleep(5e6);
}
Auch hier gilt: Der ESP führt das Programm aus und wird anschließend in den Deep-Sleep geschickt, diesmal aber nur für 5 Sekunden. Leider geht das Aufwecken nicht ohne Weiteres automatisch.
Damit sich der ESP nach Ablauf der 5 Sekunden selbst wecken kann, muss eine dauerhafte Verbindung zwischen RST
und GPIO16
hergestellt werden. Erst diese Verbindung automatisiert den Vorgang des Weckens.
Sobald die Verbindung steht, haben wir einen ESP, der alle 5 Sekunden das gespeicherte Programm ausführt und sich anschließend selbst wieder in den Deep-Sleep versetzt. Übrigens: Der ESP kann auch bei der letzteren Methode jederzeit durch die Verbindung von RST und GND manuell oder per Knopfdruck aufgeweckt werden.