![]() |
Ergänzende Seiten zum:
Auch wenn diese Seite unter der Rubrik „Programmieren“ zu finden ist, ist
Arduino eigentlich keine eigene Programmiersprache, sondern ein
Open‑Source‑Projekt. Es umfasst verschiedene Entwicklerboards und die
Arduino‑IDE (Programmiereditor und mehr). Als Programmiersprache dient eine
auf C/C++ basierende, vereinfachte Sprache. Bei Arduino werden Programme
übrigens als „Sketch“ (Skizze) bezeichnet.
Das allererste
Arduino‑Board entstand 2005 auf Basis eines Atmel ATmega8‑Controllers durch
Massimo Banzi und David Cuartielles in Italien. Das erste kommerzielle Board
war der „Arduino RS232“. Das heute bekannteste Board dürfte der Arduino Uno
sein. Aufgrund des Open‑Source‑Konzepts gibt es jedoch zahlreiche Hardware
von Drittanbietern. Diese ist zu 100 % kompatibel, darf aber nicht „Arduino“
im Namen tragen.
Eines dieser Entwicklerboards ist der „Wemos D1
mini“ auf Basis des ESP8266. Grundsätzlich lässt sich das hier Gezeigte aber
auch auf allen anderen ESP8266‑Boards oder „nackten“ ESP‑Modulen umsetzen.
Der ESP8266 der chinesischen Firma Espressif ist ein 32‑Bit‑Mikrocontroller
mit integriertem WLAN. Klein bei Stromaufnahme, Abmessungen und Preis, aber
groß in der Flexibilität – ein idealer Baustein für selbstgebaute IoT‑Geräte.
![]() |
Installation:
Ich als bekennender Liebhaber von Portable-Apps habe meine Arduino IDE unter Windows wie folgt installiert: Zunächst habe
ich mir die Version 1.8.16 auf der offiziellen
Arduino-Seite
unter Old Releases heruntergeladen. Dann das Setup in einer Virtuellen
Maschine (Win7) installiert und den kompletten Installationsordner (C:\Program
Files (x86)\Arduino) auf meinen "physischen" Rechner kopiert. Im Anschluss fügt man
noch den Ordner "portable" hinzu und voilà, fertig ist
die Portable-Arduino-IDE. Gestartet wird die IDE über die "Arduino.exe". Alle
App-Downloads und Einstellungen wandern den Ordner "portable" und können z.B.
per USB vom einen zum anderen Rechner mitgenommen werden.
Ich als
bekennender Liebhaber von Portable‑Apps habe meine Arduino‑IDE unter Windows wie
folgt installiert: Zunächst habe ich mir die Version 1.8.16 auf der offiziellen
Arduino-Seite unter „Old Releases“ heruntergeladen. Anschließend habe ich
das Setup in einer virtuellen Maschine (Windows 7) installiert und den
kompletten Installationsordner (C:\Program Files (x86)\Arduino) auf meinen
„physischen“ Rechner kopiert.
Im Anschluss fügt man noch den Ordner
„portable“ hinzu und voilà – fertig ist die portable Arduino‑IDE. Gestartet wird
die IDE über die „arduino.exe“. Alle App‑Downloads und Einstellungen landen im
Ordner „portable“ und können z.B. per USB von einem zum anderen Rechner
mitgenommen werden.
ESP8266 Board-Installation:
Die ESP8266‑Bibliothek ist nicht Bestandteil der Standardinstallation und muss
nachträglich installiert werden.. Dazu im
Hauptmenü:
![]() |
![]() |
USB-Treiber:
Zum Abschluss der
Installation muss noch der USB‑Treiber des Wemos‑Boards installiert werden.
Dabei handelt es sich um einen USB‑zu‑Seriell‑Treiber vom Typ CH340, der hier
direkt heruntergeladen werden kann.
CH340 Treiber (180 KB)
Board-Auswahl
Mit
der Installation des Board‑Pakets werden eine ganze Reihe ESP8266‑basierter
Boards in der Arduino‑IDE verfügbar. Um für den D1 mini das richtige Board
auszuwählen, geht man auf "Werkzeuge/Board/ESP8266 Boards" und wählt dort "LOLIN
(WEMOS) D1 mini (clone)" aus.
![]() |
COM-Port
Damit die Arduino‑IDE
mit dem USB‑Adapter und damit letztlich auch mit dem ESP kommunizieren kann,
muss der COM‑Port des Adapters angegeben werden. Hierzu ermittelt man zunächst
über den Windows‑Gerätemanager den dem Adapter zugewiesenen COM‑Port. In meinem
Fall ist das COM7.
![]() |
Nachdem die Installation abgeschlossen ist, kann man das Board per Micro‑USB‑Kabel an den PC anschließen und in der Arduino‑IDE einen ersten einfachen Beispiel‑ und Test‑Sketch hochladen und ausführen. Dieser Sketch tut nichts weiter, als die blaue Status‑LED des Boards blinken zu lassen. Dazu wählt man im Menü "Datei/Beispiele/01.Basics/Blink", und schon wird der Sketch in der IDE geöffnet. Durch einen Klick auf den Button "Hochladen" wird der Sketch kompiliert, auf den ESP8266 übertragen und anschließend gestartet.
![]() |
Hat alles geklappt, sollte die blaue LED nun mit einer Frequenz von etwa 1 Hz
blinken. Um die Blinkfrequenz zu ändern, sucht man im Code nach den beiden delay‑Aufrufen
und passt deren Werte nach Belieben an. Die Angabe erfolgt in Millisekunden.
Nach einem erneuten Klick auf den Button "Hochladen" wird der geänderte Sketch
an den Mikrocontroller übertragen und direkt wieder ausgeführt.
Bevor es nun richtig losgeht, noch ein paar Worte zum Code‑Aufbau und zum
Seriellen Monitor. Ein Arduino‑Sketch teilt sich grob in drei Bereiche auf. Ganz
oben (rot) werden die für das Programm benötigten Module (Libraries) eingebunden
sowie globale Variablen und Konstanten definiert.
Im Bereich void setup()
(blau) stehen alle initialisierenden Anweisungen, die nur einmal beim
Programmstart ausgeführt werden, z.B. das Starten von WLAN und Webserver sowie
das Initialisieren des Seriellen Monitors – dazu gleich mehr.
Im dritten
Abschnitt void loop() (grün) befindet sich der sich ständig wiederholende
Programmteil, also das Warten auf Ereignisse und die Reaktionen darauf. All das
wird im nächsten Abschnitt „WLAN“ noch deutlicher werden.
![]() |
Der Serielle Monitor ist ein sehr nützliches Werkzeug. Er dient als
Ausgabefenster des ansonsten anzeigelosen ESP8266. Zum einen kann man sich hier
den Programmfortschritt anzeigen lassen, zum anderen lässt er sich durch
gezielte Ausgaben als Debugging‑Hilfe einsetzen.
Wie bereits oben
erwähnt, muss er zunächst im Programmbereich void setup() initialisiert werden.
Das geschieht über die Zeile:
Serial.begin(9600);
Dabei steht 9600 für die Übertragungsrate in Baud. Das Monitorfenster selbst
wird über das Menü "Werkzeuge/Serieller Monitor" oder über die
Tastenkombination [Strg] + [Umschalt] + [M] geöffnet.
Wichtig ist, dass die im Code angegebene Baudrate auch im Monitorfenster
eingestellt wird, sonst wird man nicht viel Brauchbares sehen. Ich nutze hier
meist die Standardeinstellung 9600 Baud, viele Sketch‑Beispiele im Netz
verwenden jedoch höhere Werte, die entsprechend im Code und im Monitorfenster
abgeglichen werden müssen.
![]() |
Um eine Ausgabe im Seriellen Monitor zu platzieren, können die Befehle
print bzw. println verwendet werden. Dabei
sendet println am Ende der Ausgabe einen Zeilenumbruch, print hingegen nicht.
Beispiel: Serial.println("Hallo Welt");
gibt den Text "Hallo Welt" inklusive Zeilenumbruch im Seriellen Monitor aus.
Am Router im
Heimnetzwerk anmelden
Im folgenden Sketch baut der ESP8266
eine WLAN-Verbindung zum heimischen Netzwerk (Router) auf. Damit sich auch etwas
tut, erhält er zusätzlich einen einfachen Webserver, der auf die beiden URLs "/led_ein"
und "/led_aus" reagiert. Über diese beiden URLs lässt sich die blaue Status-LED
am ESP8266 ein- und ausschalten.
Der Webserver stellt eine einfache
Startseite mit zwei Links zu diesen beiden URLs bereit. Der zugehörige HTML-Code
wird direkt nach dem Laden der WLAN- und Webserver-Module in die Variable html
geschrieben.
Der komplette Sketch kann per Copy & Paste in die
Arduino-IDE übernommen werden; lediglich die WLAN-Zugangsdaten (ssid und pwd)
müssen zuvor angepasst werden. Der Code ist vollständig kommentiert, sodass die
einzelnen Aktionen gut nachverfolgt werden können.
Nachdem der Code kopiert und die beiden Variablen ssid und
pwd angepasst wurden, öffnet man den Seriellen Monitor mit [Strg] + [Umschalt] +
[M] und klickt anschließend auf "Hochladen" (bzw. verwendet die
Tastenkombination [Strg] + [U]).
Ist der Sketch
kompiliert und hochgeladen, startet der ESP8266 automatisch neu und baut eine
Verbindung zum Heimnetzwerk auf. Läuft alles wie geplant, wird im Seriellen
Monitor die vom Router vergebene IP-Adresse angezeigt. In meinem Fall ist dies
192.168.178.76 - bei dir wird es mit an Sicherheit grenzender Wahrscheinlichkeit
eine andere Adresse sein.
Diese IP-Adresse kopiert man nun in die
Adresszeile des Browsers und bestätigt mit der Eingabetaste. Betreibt man den
ESP ohne Seriellen Monitor, kann man ihn im Router unter dem Namen "Du suchst
mich" finden; dieser wurde im Code mit WiFi.hostname("Du suchst mich");
vergeben.
![]() |
Wenn alles geklappt hat sollte jetzt die Startseite im Browser angezeigt werden. Mit den
beiden Links "LED EIN" und "LED AUS" lässt sich die blaue Status LED ein-
und ausschalten. Man kann aber auch direkt die entsprechende URL eingeben, in
meinem Fall "192.168.178.76/led_ein" bzw. "192.168.178.76/led_aus".
Die Zeile "<meta
name="viewport" content="width=300px">" im HTML-Quellcode sorgt dafür, dass
auf dem Handy die Seite gezoomt angezeigt wird.
Statische IP-Adresse
verwenden
Im oben gezeigten Code wird dem D1 über DHCP vom
Router irgendeine freie IP-Adresse zugewiesen. Möchte man, dass sich der D1 am
Router mit einer festen IP-Adresse anmeldet, so ist der Code wie folgt zu
ergänzen.
Im Header, am besten direkt unter #include <ESP8266WiFi.h>, werden
die drei Variablen local_IP, gateway und subnet deklariert und entsprechend der
Router-Adresse befüllt. In meinem Fall besitzt der Router die Adresse
192.168.178.1, und ich hätte gerne die 192.168.178.15 für den D1 mini. Der
Router wird diese Adresse jedoch nur dann zulassen, wenn sie nicht bereits durch
ein anderes Gerät genutzt oder reserviert wird.
Vor der Zeile
WiFi.begin(ssid, pwd); werden die Variablen dann mittels WiFi.config()
übergeben. Eine fest vergebene IP-Adresse kann übrigens auch die Anmeldung
am Router beschleunigen.
Einen
Access-Point für WLAN-fähige Geräte bereitstellen
Der
folgende Sketch macht prinzipiell dasselbe wie der oben gezeigte. Allerdings
wählt sich der ESP8266 nicht ins Heimnetzwerk ein, sondern baut stattdessen
einen eigenen Access Point auf. Über diesen kann man z.B. mit dem Handy auf den
Webserver zugreifen und so die LED schalten.
Nachdem der Code kopiert und die beiden Variablen ssid und pwd angepasst wurden,
öffnet man den Seriellen Monitor mit [Strg] + [Umschalt] + [M]
und klickt anschließend auf "Hochladen" (bzw. verwendet die Tastenkombination
[Strg] + [U]).
Ist der Sketch kompiliert und
hochgeladen, startet der ESP8266 automatisch neu und baut einen Access Point mit
dem Namen (SSID) "ESP8266_AccessPoint" auf. Wählt man
sich nun mit dem Handy in dieses WLAN ein, kann über die IP-Adresse
192.168.1.1 die Startseite aufgerufen werden.
![]() |
Die HTML-Seite lässt sich natürlich auch mittels HTML-Formatierung und durch
hinzufügen von
Java-Script etwas ansprechender
gestalten.
HTML
Authentifikation (basic access authentication)
Möchte
man den Zugriff auf den ESP8266 bzw. dessen Webserver beschränken, bietet sich
eine einfache HTTP-Authentifizierung an. Dazu werden zunächst die Zugangsdaten
in Konstanten hinterlegt, z.B. für den Benutzernamen http_UserName =
"admin" und für das Passwort http_pwd = "1234".
Beim Aufruf der URL wird der Benutzer dann aufgefordert, sich mit diesen
festgelegten Zugangsdaten anzumelden.
Wie in den vorangegangenen Beispielen zu sehen, wird der HTML-Code zunächst in eine Variable vom Typ String geschrieben und anschließend dem Webserver übergeben. Dabei kann es bei den Anführungszeichen zu Konflikten kommen, da sie sowohl innerhalb des HTML-Codes als auch zur Definition von Zeichenketten im Arduino-Sketch verwendet werden. Um dies zu vermeiden, gibt es drei Möglichkeiten:
Für Methode 3 hatte ich mal für einen anderen
Zweck ein Tool geschrieben, dass die Maskierung mittels "\" automatisch vornimmt
und auch wieder umkehren kann. Ebenso wird jede Zeile in Anführungszeichen
gepackt, so, dass der HTML-Code direkt in den Sketch kopiert werden kann.
TE ESP HTML Convert (861 KB)
Wenn der HTML-Code umfangreicher wird, oder auch externe Dateien wie CSS,
JavaScripts oder Bilder angezogen werden müssen, so empfiehlt sich der
interne Flashspeicher als Ablageort.
Wie man den Flashspeicher einrichtet und
Dateien dahinein kopiert ist hier
beschrieben. Sehr interessant ist hier ebenfalls ein
FTP-Server für den Flashspeicher.
In den oben gezeigten Beispielen wird bei "Server.on" mittels "Server.send", der
HTML-Code der Variable "html" an den Browser gesendet. Hier wird nun bei einer
Browseranfrage (test.htm) die entsprechende HTML-Datei vom Flashspeicher an den
Browser gesendet. Gleiches gilt auch für Bilder und sonstige Dateien.
Als Beispiel kann hier ein sehr einfaches Projekt mit WiFi + WebServer,
inklusive der beiden Dateien "test.htm" und "bild.gif" heruntergeladen werden.
kompletter Quellcode inkl.
Dateien (3 KB)
Um Daten auf den das SPI (Serial Peripheral Interface) Flash File System ablegen zu können, muss der Flashspeicherbereich für das Dateisystem entsprechend formatiert werden. Dazu wählt man unter "Werkzeuge/Flash Size" eine passende Größe aus; beim Flashen des ESP wird dieser Bereich dann entsprechend formatiert.
![]() |
Hinweis: Wird beim erneuten Beschreiben des ESP die Größe nicht verändert, so
bleiben die im Dateisystem enthaltenen Dateien bestehen.
Um auf das
File-System zugreifen zu können benötigt man #include "FS.h" und muss
es im Setupbereich per SPIFFS.begin() starten. Hier mal ein kleines
Beispiel zum Erstellen, Schreiben und Lesen einer Datei:
ESP 8266 Sketch Data Upload
Um Dateien in das
Dateisystem (FS) laden zu können, benötigt man ein Plugin, z.B. "ESP8266FS"
(ESP8266 Sketch Data Upload). Das Plugin wird nicht über die
Bibliothekenverwaltung installiert, sondern muss manuell in das
Installationsverzeichnis der Arduino-IDE kopiert werden. Das Plugin besteht
aus einer einzelnen.jar-Datei, die in folgendes Verzeichnis kopiert werden
muss:
Arduino\tools\ESP8266FS\tool
Das am Ende bereitgestellte
Archiv enthält die beiden Unterordner "ESP8266FS\tool" bereits, und kann
daher im Verzeichnis "Arduino\tools" direkt mit "Hierher entpacken..."
entpackt werden.
Das Plugin erwartet im Sketch-Ordner den Unterordner "data"
indem sich alle Dateien befinden die ins File-System des ESP hochgeladen
werden sollen.
![]() |
Der Upload wird dann über "Werkzeuge/ESP8266 Sketch Data Upload" angestoßen.
![]() |
Um den Flash-Speicher bequem mit Daten befüllen und aktualisieren zu können
kann man dem ESP einen einfachen FTP-Server verpassen. Ich nutze hierzu "PubSubClient" von
Nick O'Leary. Dieser kann ganz normal über die Bibliotheken-Verwaltung
installiert werden (Werkzeuge/Bibliotheken verwalten...)
Das Einbinden in
den Sketch ist mit wenigen kurzen Zeilen Code erledigt
Anstelle von "user" und "password" darf selbstverständlich auch was
sichereres angegeben werden. Mein gerne verwendeter FileZillar (v3.68.1)
verbindet sich zwar problemlos mir dem ESP, bleibt dann aber um Upload mit
der Meldung "Status: Verbindung hergestellt, warte auf
Willkommensnachricht..." hängen und bricht dann mit "Fehler:
Zeitüberschreitung der Verbindung nach 20 Sekunden Inaktivität" ab.
Beim
Kramen in der Softwareschublade fand ich noch ein Relikt aus längst
vergangenen Tagen, den WS-FTP v3.00 aus dem Jahre 1996 der auch unter Win10
und sicherlich auch noch unter Win11 anstandslos seinen Dienst tut und den ESP
brav mit Daten versorgt - das is ja genau mein Ding, Software kann gar nicht
alt genug sein.
![]() |
Da man ihn heute wohl eher selten im Internet antreffen wird, stelle ich
ihn hier mal zum Download bereit.
WS_FTP32 3.00 (137 kB)
MQTT (Message Queuing Telemetry
Transport) ist ein schlankes Nachrichtenprotokoll, mit dem
Informationen innerhalb eines IoT-Netzwerks (Internet of
Things) ausgetauscht werden können. Dabei dient ein Server, der
hier Broker genannt wird, als Vermittler zwischen den einzelnen Geräten
(Clients). Ein Gerät, das Daten empfangen soll, "subscribed" (abonniert) beim
Broker ein bestimmtes Topic (Thema). Ein Gerät, das Daten senden soll, "published"
(veröffentlicht) Informationen zusammen mit einem Topic an den Broker. Dieser
leitet die Nachricht an alle Geräte weiter, die dieses Topic abonniert haben.
Ein Beispiel: Ein ESP8266 (Sensor) liest einen Fotowiderstand aus und
übergibt die Information "Tag/Nacht" (z.B. 0 = Nacht, 1 = Tag) mit einem Topic,
z.B. "Daemmerungsschalter", an den Broker. Der Broker leitet die Information an
alle Clients weiter, die das Topic "Daemmerungsschalter" abonniert haben. PC und
Handy können dann anzeigen, ob es Tag (1) oder Nacht (0) ist. Ein weiterer
ESP8266 (Aktor), der dieses Topic ebenfalls abonniert hat, schaltet bei Nacht
das Licht ein und am Tag wieder aus.
![]() |
Wie das Beispiel zeigt, kann der ESP8266 sowohl als Subscriber (Empfänger)
als auch als Publisher (Sender) arbeiten. Er kann aber auch beides gleichzeitig
sein - Gleiches gilt natürlich auch für den PC und mobile Endgeräte. Genug
Theorie, fangen wir an.
MQTT-Broker
Als Erstes benötigen wir einen Broker. Hier kann man entweder einen der
zahlreichen Broker-Dienste im Netz in Anspruch nehmen oder selbst einen im
Heimnetzwerk aufsetzen und betreiben. Vermutlich bin ich da einfach etwas
altmodisch, aber die Daten auf einen Internet-Server hochzuladen, um sie dann
fünf Meter weiter wieder herunterzuladen, fühlt sich irgendwie seltsam an.
Deshalb läuft bei mir ein Raspberry Pi Zero W2, der im Betrieb gerade einmal
etwa 1 Watt benötigt. Wie man die Himbeere aufsetzt und darauf den MQTT-Server Mosquito
installiert ist
hier zu finden. Wer keinen
Raspberry hat kann Mosquito auch
auf dem PC ausführen.
MQTT-Client
Um MQTT auf dem ESP8266 nutzen zu können benötigt man eine entsprechende Library, ich nutze hier
die "PubSubClient" von Nick O'Leary. Diese sollte sich eigentlich so
installieren lassen:
Bei mir hat die Suche jedoch nicht funktioniert, deshalb habe ich mir die
Library als Zip bei
Arduino.cc heruntergeladen und über "Sketch/Bibliothek
einbinden/ZIP-Bibliotheken hinzufügen..." manuell installiert.
Daten an den Broker senden
Der folgende Sketch baut zunächst eine Verbindung zum heimischen Netzwerk auf
und verbindet sich anschließend mit dem Broker. Danach beginnt der ESP8266 im
5-Sekunden-Takt die Nachricht "Nachricht xy" mit dem Topic "test1" an den Broker
zu senden, wobei "xy" ein Zähler ist, der sich bei jedem Senden um 1 erhöht. Das
Ganze dient als Demo bzw. als Grundgerüst für einen Sensoraufbau, bei dem
anstelle von "Nachricht xy" die Zustände der Eingangspins übertragen werden.
Die WLAN-Initialisierung habe ich hier in eine eigene Sub-Routine
ausgelagert, um den setup()-Bereich etwas übersichtlicher zu halten.
Retain Flag
Wird eine Nachricht
mit gesetztem Retain-Flag gesendet, so wird sie einem MQTT-Client unmittelbar
nach dessen Anmeldung zugestellt. Der Client muss also nicht warten, bis eine
neue Nachricht eintrifft. Das ist z.B. dann sinnvoll, wenn ein Temperatursensor
nur alle 15 Minuten einen Wert sendet, die Temperatur aber über eine
Websocket-Verbindung direkt nach dem Aufruf der HTML-Seite zur Verfügung
stehen soll. Hierzu wird bei client.publish() nach Topic und Nachricht noch der
Parameter true für das Retain-Flag übergeben (siehe Bemerkung im Beispielcode).
Die gesendeten Informationen kann man mit
TE MQTT Client am PC,
oder mit dem
IoT MQTT Panel auf dem Android Smartphone oder Tablet bestaunen.
Daten vom Broker empfangen
Der nächste Sketch zeigt ein Beispiel dafür, wie man MQTT-Nachrichten
empfängt und darauf reagiert. Genauer gesagt abonniert der ESP8266 das Topic
"test1". Sobald auf diesem Topic die Nachricht "ein" gesendet wird, schaltet er
die blaue Status-LED ein. Wird "aus" gesendet, schaltet er sie wieder aus. Bei
allen anderen Nachrichten wird der Inhalt lediglich im Seriellen Monitor
ausgegeben, ohne dass weitere Aktionen ausgeführt werden.
Zum Senden von Nachrichten mit dem Topic "test1" kann ebenfalls der
TE MQTT Client benutzt werden.
MQTT im Browser
In
diesem Zusammenhang kann das Senden und Empfangen von MQTT Nachrichten im
Browser ebenfalls interessant sein. Das
hatte ich bereits im Zusammenhang mit dem Tasmota Stromzähler-Adapter (hier
werkelt auch ein ESP6288 :-) beschrieben und ist
hier
zu finden.
Der Tiefschlafmodus kann genutzt werden, um den Strombedarf des ESP8266 zu
minimieren. Dabei erledigt der ESP seine Aufgaben und legt sich anschließend für
eine vordefinierte Zeit schlafen. Nach dem Aufwachen nimmt er seine Arbeit
wieder auf, erledigt diese und geht erneut in den Schlafmodus. Das Ganze eignet
sich z.B. für Intervallmessungen im Batteriebetrieb. Der D1 mini benötigt im
Betrieb (gemittelt inkl. WLAN) ca. 73 mA, im Deep-Sleep-Modus ca. 230 µA (beide
Werte gemessen am 3,3-V-Einspeisepin).
Hierzu eine Abschätzung der
Laufzeit im Batteriebetrieb:
Der D1 soll alle 15 Minuten einen Messwert
erfassen (z.B. Temperatur oder Spannung) und diesen per WLAN versenden. Für das
Erfassen und Senden benötigt er 5 Sekunden. Unter Berücksichtigung von Arbeits-
und Deep-Sleep-Phase ergibt sich eine gemittelte Stromaufnahme von ca. 0,634 mA.
Eine Batterie (3,3 V) mit 2500 mAh würde demnach etwa 3941,5 Stunden, also rund
164 Tage durchhalten.
Ein "nacktes" ESP-12E/F Modul benötigt im Deep-Sleep nur
18 μA (gemessen) und würde somit unter den gleichen Bedingungen auf 246 Tage
kommen. Gleiches gilt für das ESP-01(S) Modul.
Tipp:
Die Verwendung einer statischen IP-Adresse spart eventuell
etwas Zeit beim Anmelden am Router, was wiederum die Arbeitszeitphase etwas
verkürzt. Eine halbe Sekunde weniger Arbeitszeit bedeutet im obigen Beispiel
gleich mal 12 Tage mehr Laufzeit :-)
Um mit den Werten ein wenig spielen
zu können, hier mal ein
OnlineRechner
.
Code
Der Deep-Sleep-Modus
kann prinzipiell an jeder beliebigen Stelle im Programmcode gestartet werden. Im
folgenden Beispiel liegt der gesamte - natürlich hochkomplexe - Quellcode in
void setup(), während void loop() leer bleibt. Nach getaner Arbeit wird der D1
dann mit ESP.deepSleep() schlafen geschickt. Die Deep-Sleep-Zeit wird dabei in
Mikrosekunden angegeben.
Maximale Deep-Sleep-Zeit
Die maximale Deep-Sleep-Zeit
wird zunächst durch die Begrenzung des zu übergebenden 32-Bit-Integer-Werts
(-2.147.483.648 bis 2.147.483.647) eingeschränkt. Da ESP.deepSleep() jedoch nur
positive Werte nutzt, steht effektiv der Bereich 0 bis 2.147.483.647
Mikrosekunden zur Verfügung. Das entspricht einer maximalen Schlafdauer von
knapp 35 Minuten.
Verwendet man einen 32-Bit-Unsigned-Integer (0 bis
4.294.967.295), lässt sich dieser Wert ungefähr verdoppeln. Rechnerisch ergibt
sich damit eine maximale Deep-Sleep-Zeit von rund 71 Minuten.
Stellt man
auf einen 64-Bit-Integer um, wird die theoretisch mögliche Deep-Sleep-Zeit
deutlich größer. In der Praxis wird jedoch ein Wert von gut 200 Minuten erreicht
und nicht die rein rechnerisch möglichen 311 Minuten. Wer den exakten Wert für
seine Konfiguration wissen möchte, kann sich diesen mit ESP.deepSleepMax() im
Seriellen Monitor ausgeben lassen.
Hardware-Umbau
Lässt man
den Code nun laufen, fällt der D1 zwar in den Deep-Sleep-Modus, wacht daraus
aber nicht mehr von selbst auf. Damit er das tut, muss zunächst noch der Pin RST
mit D0 (GPIO16) verbunden werden.
![]() |
Nach Ablauf der vordefinierten Deep-Sleep-Zeit wird über D0 ein Reset
ausgeführt und der Code im "void setup()" wird erneut gestartet.
Beim
ESP-12E/F Modul muss die Brücke übrigens zwischen "RST" und "GPIO16" gelegt
werden. Beim
ESP-01(s) ist etwas diffizile
Lötarbeit notwendig.
Ist die physische Zugänglichkeit des ESP nicht oder nur erschwert
gegeben, können Updates auch per WLAN eingespielt werden. Dazu muss jedoch
OTA (Over The Air) auf
dem betreffenden ESP zuvor eingerichtet sein.
Zunächst muss ein Teil
des Flashspeichers für OTA zur Verfügung gestellt werden. Wie beim
Einrichten von SPIFFS geschieht dies über den Menüpunkt "Werkzeuge / Flash
Size: …". Dabei ist darauf zu achten, dass der OTA‑Bereich mindestens die
Größe der einzuspielenden .bin‑Datei hat, aber auch noch genügend Platz für
den Sketch und gegebenenfalls für SPIFFS lässt.
Dann muss natürlich
noch etwas gecodet werden, Im folgenden Plug-in-Codebeispiel
wird vorausgesetzt, dass WiFi und der Webserver bereits konfiguriert sind.
Zum Updaten wird der Sketch in Binärcode benötigt, diesen erhalten wir über den Menüpunkt "Sketch/Kompilierte Binärdatei exportieren" oder über [Strg] + [Alt] + [S].
![]() |
Im Sketch-Ordner wird nun eine.bin‑Datei erzeugt, die dann im Dateidialog der OTA‑Update‑Seite „verfüttert“ werden kann.
![]() |
![]()