Deep Sleep mit dem ESP32 bzw. LOLIN S2mini

Vor einiger Zeit hatte ich mal versucht einen kleinen Wettersensor auf Basis des ESP32 zu bauen. Als eigentlicher Sensor kam der BME280 zum Einsatz.

Leider hatte das Ganze gleich mehrere Probleme. Zum einen zeigte sich der Sensor BME280 als äußerst ungenau, wobei der Verdacht nahe lag, dass er zu sehr von der ESP-Platine beeinflusst würde. Zum zweiten zeigte sich der ESP32 aber auch als Energiefresser. Der verbaute Akku war immer schnell leer.

Es gibt da aber einen Sleep-Modus in verschiedenen Stufen, der genau das verhindern soll, – eventuell hilft er sogar beim erstgenannten Problem. Absprungbasis war ein Artikel im Netz:

ESP32 Deep Sleep Tutorial

Jetzt ist es aber leider so, dass nicht immer jeder Beitrag im Internet sofort so ohne Weiteres nachvollziehbar wäre. Das trifft auch sicherlich auf meine Beiträge zu. Aber ich habe mich der ganzen Sache Schritt für Schritt genähert. Hier der hoffentlich nachvollziehbare Weg …

Ich habe mir zunächst die Arduino IDE heruntergeladen und installiert. Damit allein lässt sich aber noch kein ESP32 programmieren. Dem Boardverwalter muss erst noch der Link zur richtigen Ressorce mitgegeben werden, damit er die notwendige Daten bekommt und damit dann auch das Board LOLIN S2mini (ggfls. auch WEMOS) in der IDE nutzen kann.

Hinweis zu meinen Produktlinks zu Amazon: Als Amazon-Partner verdiene ich an qualifizierten Verkäufen. Für den Käufer ändert sich der Preis dadurch nicht.

In den Einstellungen unter „Zusätzliche Boardverwalter-URLs:“ muss der folgende Link eingetragen werden:

https://espressif.github.io/arduino-esp32/package_esp32_index.json

Die Quelle dieser Information ist hier. Unter Werkzeuge im Menü muss jetzt noch das Board ausgewählt werden. Dazu sucht man im Boardverwalter einfach nach ESP und nimmt die Espressif-Variante.

Die weiteren Parameter aus dem obigen Bild sollten, – mal abgesehen vom Port identisch eingestellt werden.

Das S2mini-Board hat zwei UARTs. Einen zum Übertragen des Sketches und einen für den Betrieb. Relativ einfach bekommt man nach dem USB-Anschließen den Port zum Programmieren aktiviert:

  1. Am Board den „0“-Taster drücken und halten
  2. Jetzt den „RST“-Taster kurz drücken, bis der Rechner das Board erkannt hat, meist mit kurzem Ping
  3. Zuletzt den „0“-Taster wieder lösen

In der Arduono-IDE sollte jetzt der Port auswählbar sein und damit das Übertragen eines Sketches. Im Geräte-Manager sollte das so aussehen. Das Warnzeichen kann ignoriert werden:

Vielleicht hast Du es bemerkt. Ohne die obige Abfolge findet der PC das Board üblicherweise nicht. Ich musste da auch lange suchen um die Lösung zu finden. Der Treiber um den CH340-UART für den PC greifbar zu machen fehlt bei den meisten PCs. Der Treiber kann hier heruntergeladen werden. Spätestens wenn wir eine serielle Rückmeldung über USB vom Board im Betrieb sehen wollen, wird dieser Treiber benötigt.

Unglücklicherweise wird bei mir für das Programmieren der PORT 3 geöffnet und für den Betrieb der PORT 4. Das ist bei mir so und muss aber nicht zwingend bei allen anderen Rechnern auch so sein! Wäre nicht weiter schlimm, aber der Zeitraum, den man zum Umkonfigurieren braucht, ist zu lang, als das man das Beispiel aus dem ESP32 Deep Sleep Tutorial so nutzen könnte. Deshalb habe ich den vorgeschlagenen Code nur zu Teilen übernommen und in einen anderen Code (Blink) eingebettet:

//BUILD_IN LED am Pin 15
#define led 15

void setup() {
//definieren das der Pin der LED als Ausgang dient
pinMode(led, OUTPUT);

Serial.begin(115200); // Für die serielle Kommunikation

}

void loop() {

delay(10000); //eine Pause von 10s

digitalWrite(led, HIGH); //aktivieren der LED
Serial.println("AN");

delay(1000); //eine Pause von 1s

digitalWrite(led, LOW); //deaktivieren der LED
Serial.println("AUS");

delay(1000); //eine Pause von 1s

digitalWrite(led, HIGH); //aktivieren der LED

Serial.println("AN");
delay(10000); //eine Pause von 10s

Serial.println("Going to sleep...");
Serial.flush();
esp_sleep_enable_timer_wakeup(5 * 1000000); //Board soll schlafen und nach 5s aufwachen
esp_deep_sleep_start(); //Aktivierung Schlafzyklus


}

Durch die ganzen Delays und Blink-Phasen bleibt Zeit, damit man die IDE auf PORT 4 umschalten kann.

Das Kompilieren und Hochladen des Sketches wird beim ESP32 S2mini immer mit einer Fehlermeldung quittiert. Sie besagt, dass zwar der Sketch übertragen wurde, aber der Programmiermodus nicht beendet werden kann. 

Hier hilft es, entweder die „RST“-Taste zu drücken oder einfach das Board ab- und dann wieder anzustecken. Falls bei Euch auch unterschiedliche Ports genutzt werden, so wird es jetzt Zeit in der IDE den Port umzuschalten, sonst sieht es im Seriellen Monitor nämlich so aus:

 

Über das Werkzeugmenü ist das relativ schnell erledigt.

Neben einem freundlichen Leuchten der LED auf dem Board sieht man jetzt auch die serielle Übertragung der Nachrichten.

Sowohl die LED auf dem Board, als auch ein geöffneter Geräte-Manger in Windows lassen erkennen, was da abläuft:

  1. Das Board wird über USB angeschlossen -> der serielle Port ist im Gerätemanger aktiv und auch in der Arduino IDE im Seriellen Monitor wird kein Fehler angezeigt
  2. 10 Sekunden warten
  3. LED schaltet für eine Sekunde an mit serieller Meldung „AN“
  4. LED schaltet für eine Sekunde aus mit serieller Meldung „AN“
  5. LED schaltet für 10 Sekunden an mit serieller Meldung „AN“
  6. Meldung „Going to sleep“ wird gesendet, LED geht aus weil Board im Tiefschlaf, Geräte-Manager verliert PORT, Arduino IDE zeigt Fehlermeldung
  7. Nach 5 Sekunden geht es wieder von vorn los

Durch die Aktivierung des DeepSleep-Modus wird das Board nahezu vollständig abgeschaltet. Es läuft nur noch ein Timer. Es gibt noch andere Schlaufmodi, die sich beispielsweise nur auf das Abschalten des WIFI beschränken. Ebenso ist es möglich das Board über einen Interrupt, beispielsweise einen Tastendruck, zu wecken. Ausführliche Informationen zum Stromverbrauch in den verschiedenen Zuständen findet man in diesem Dokument. Nur soviel sei hier schon verraten: Verbrauch ein ESP32 typischerweise etwa 240mA, so sind es im DeepSleep nur noch 10 µA. Der relativ geringe Aufwand lohnt sich also.

Ob sich nun mein ursprüngliches Problem mit dem Wettersensor komplett dadurch lösen lässt, bleibt abzuwarten. Das Batterieproblem ist zumindest schonmal gelöst denn man kann ja das Board schlafen lassen und nur alle 5 Minuten kurz aufwecken zum Messen und Übertragen der Daten und dann sofort wieder schlafen lassen.

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments