Mitmachprojekt: Temperatur messen und versenden mit dem ESP8266

Das WLAN-Modul ESP8266 ist seit seinem Erscheinen Ende 2014 ein Favorit der Bastler. Es ist nicht nur äußerst günstig und einfach anzuwenden, der integrierte Microcontroller lässt sich auch mit einfachen Mitteln direkt programmieren. In unserer Anleitung zeigen wir, wie sich mit einem Sensor die Temperatur messen und der Wert an einen Internetserver übermitteln lässt. Mit dem fertigen Aufbau können Leser an unserem großen Projekt zur Messung der Bürotemperatur teilnehmen .
Internet-of-Things zum Sparpreis
Zuerst fielen die verschiedenen Varianten des ESP8266 nur durch ihren günstigen Preis auf: Wer direkt in China bestellte, bekam Anfang 2015 fünf Stück zum Preis von umgerechnet rund 10 Euro - inklusive Versand. Aber selbst heute bieten ihn Händler in Deutschland für nur 5 Euro an. Ursprünglich sah der Hersteller Espressif die Nutzung des ESP8266 als Zusatzbaustein vor, wofür er per serielle Verbindung mit einem Mikrocontroller verbunden wird. Über entsprechende AT-Befehle können Verbindungen mit einem WLAN-Netzwerk (nach 802.11b/g/n) aufgenommen und Daten übertragen werden.
Doch findige Bastler fanden schnell heraus, dass der ESP8266 einen vergleichsweise leistungsfähigen Mikrocontroller besitzt und ohne teures Equipment geflasht werden kann - der Einsatz ist also auch ohne weitere Hardware möglich. Es folgte eine Lua-Implementierung für das Modul; mittlerweile gibt es eine vollständige Unterstützung durch die Arduino-IDE. Interessanterweise ist Expressif einer der ersten chinesischen Hardware-Hersteller, der diese Aufmerksamkeit aus der Bastler-Community als positiv begreift. Er setzte sogar 1000 US-Dollar Belohnung für jeden gefundenen Firmware-Bug aus.
Doch es gibt auch Probleme: So ist der ESP8266 berüchtigt für seinen Strombedarf. Schon im regulären Betrieb kann er allein bis zu 100 Milliampere benötigen, bei schlechtem WLAN-Empfang sind es mehr als 250 mA. Außerdem neigt Espressif dazu, auch in kleineren SDK-Updates inkompatible API-Änderungen durchzuführen. Und die Dokumentation galt gerade anfangs als schlecht und unvollständig. Anfangs gab es zudem Zweifel, ob das Modul eine echte FCC-Zertifizierung hatte und überhaupt mehr als ein paar Monate verfügbar sein würde. Daher zögerten viele Unternehmen, den ESP8266 ernst zu nehmen, so dass er auch heute noch eher der Liebling der Bastler ist.







Die Qual der Wahl
Die ESP8266-Module gibt es mittlerweile in 16 Varianten, am populärsten sind ESP-01 und ESP-12. Die verbaute Technik ist praktisch gleich, die Unterschiede liegen in den Abmaßen und den Anschlussmöglichkeiten. Das ESP-01 ist das kleinste Modul mit 8 vormontierten Pins im 2,54mm-Raster, 2 der Pins sind als GPIO selbst verwendbar. Das ESP-12 besitzt 16 Pins im für Bastler unvorteilhaften 1-mm-Raster, allerdings können 8 Pins als GPIO und 1 Pin als ADC verwendet werden. Für unser Projekt reicht der ESP-01 aus.
Alternativ gibt es seit Ende 2015 von verschiedenen Herstellen auch fertige Boards im bastlerfreundlichen Layout mit fest verlötetem ESP12-Modul. Zusätzliche Elektronik auf dem Board selbst sorgt für die korrekte Stromversorgung und stellt einen USB-Anschluss zum Programmieren bereit. Allerdings kosten diese Boards oft zehnmal so viel wie ein einzelnes ESP-12-Modul.
Schließlich muss entschieden werden, ob das ESP8266 lediglich als simples WLAN-Terminal in Kombination mit einem Arduino/Genuino eingesetzt werden soll oder die Arbeit komplett allein erledigt. Wir stellen beide Varianten vor. Die Kombination mit dem Arduino empfiehlt sich eher für Einsteiger.
Die benötigten Bauteile
Die Liste der erforderlichen Bauelemente ist kurz, es gibt sie für wenig Geld bei allen Elektronikhändlern:
- ein Temperatursensor DS18B20
- ein 4,7-kOhm-Widerstand
- ein kleines Steckbrett
- ein Set Verbindungskabel und Klingeldraht
Wer den ESP mit einem Arduino nutzen will, benötigt natürlich auch diesen. Soll der ESP hingegen allein genutzt werden, ist noch ein USB-zu-Seriell-Adapter notwendig und irgendeine Form der Stromversorgung mit einer Spannung von 3,3 Volt. Wir benutzen dazu eine umfunktionierte USB-Buchse und einen LD33V-Spannungswandler.
ESP8266 mit dem Arduino nutzen
Zuerst wird der Schaltkreis zur Temperaturmessung aufgebaut und mit dem Arduino verbunden. Ablauf und Verkabelung wurden bereits ausführlich im Artikel Temperatur messen mit dem Arduino geschildert.
Steht diese Schaltung, kann der ESP8266 mit dem Steckbrett und dem Arduino verbunden werden. Leider hat das ESP-01 zwei Haken: Die parallel angeordneten Pins funktionieren nicht mit einem Steckbrett. Es muss also fliegend verkabelt werden. Da die Pins des ESP-01 nicht markiert sind, empfiehlt es sich, beim Verkabeln ein Bild mit den Pin-Bezeichnungen vor sich zu haben, wie es zum Beispiel hier zu finden ist(öffnet im neuen Fenster) .







Der GND-Pin des ESP wird mit der blauen oder schwarzen Leiste des Steckbretts verbunden, der VCC-Pin mit der roten Leiste. Auch der CH_PD-Pin muss mit der roten Leiste verbunden werden. Das mittlere Beinchen des Temperatursensors wird mit dem Pin GPIO02, der TX-Pin des ESP mit dem RX-Pin des Arduinos (Pin 0) verbunden, der RX-Pin am ESP mit dem TX (Pin 1) des Arduino. Wer später beim Programmieren Probleme hat, das Programm auf den Arduino aufzuspielen, sollte die RX- und TX-Kabel während des Flashvorgangs abstecken, danach wieder aufstecken und einen Reset durchführen.
Wer Bedenken hat, der ESP käme nicht mit dem Spannungspegel bei den RX/TX-Pins des Arduino zurecht, sei beruhigt. Im Dauertest gab es mit verschiedenen Modulen keine Probleme. Lediglich die Stromversorgung über den Arduino kann zu Problemen führen, wenn das Wlan schlecht erreichbar ist. Hier muss unter Umständen eine eigene Stromquelle zum Einsatz kommen, wie im zweiten Teil des Artikels beschrieben.
Arduino programmieren
Auch bei unserem Programm für den Arduino können wir auf den Code und die Erklärung dazu aus dem früheren Artikel zurückgreifen. Der Teil zur Temperaturmessung ist identisch, allein der zur Initialisierung des ESP-Moduls und zum Versenden der Daten unterscheidet sich. Den vollständigen Quellcode für unser Programm gibt es in Github. Hier werden wir die Kommunikation mit dem ESP besprechen.
Die Kommunikation zwischen dem Arduino und dem ESP-Modul wird über die serielle Schnittstelle abgewickelt. Das hat den praktischen Nebeneffekt, dass die Kommandos unseres Programms an den ESP im seriellen Monitor der Arduino-IDE sichtbar sind.
Der ESP erwartet AT-Kommandos, wie sie langjährige Leser noch von früheren Modems kennen. Eine Liste der Kommandos gibt es auf Github(öffnet im neuen Fenster) . In der initESP()-Funktion schicken wir AT-Kommandos, damit das ESP als reguläres WLAN-Gerät agiert (AT+CWMODE=1) und erlauben nur eine Verbindungen gleichzeitig (AT+CIPMUX=0). Schließlich starten wir die Verbindung mit einem WLAN-Netzwerk, dabei übergeben wir den Netzwerknamen und das Passwort (AT+CWJAP="SSID", "PASSWORT"). Letztere sind im Programm als Konstanten definiert.
Ein gemessener Temperaturwert wird mit der sendTemperature()-Funktion versendet. Sie ruft praktisch nur zwei AT-Kommandos auf. Das erste stellt eine TCP-Verbindung mit dem Server her:
Als Nächstes wird ein GET-Request nach HTTP1.0 in einem String zusammengebaut und ausgeführt (Zeile 67 bis 82). Dieser Part ist etwas komplizierter. Zuerst wird die erste Request-Zeile gebaut, die die URL enthält. Die URL besteht aus einem fixen Teil und kann über ein Formular auf unserer Projektseite erzeugt werden. Daran wird die Temperatur als URL-Parameter angehängt. An diese Request-Zeile wird eine zweite Zeile für die nochmalige Hostangabe angehängt und der Request-Body beendet.
Jetzt wird ein AT-Kommando mit der Länge des Request-Strings übergeben:
Serial.print("AT+CIPSEND="); Serial.println(cmd.length());Danach muss das Programm warten, bis der ESP mit einer Eingabeaufforderung reagiert, erst jetzt kann der eigentliche Request übergeben werden. Die Serverantwort wird zwar abgeholt, interessiert uns aber hier nicht weiter. Zum Schluss wird die Verbindung wieder geschlossen (AT+CIPCLOSE).
Nach dem Überspielen des Programms kann die ganze Konstruktion vom Computer abgesteckt werden und über eine eigene Stromversorgung versorgt werden, zum Beispiel mit Hilfe eines USB-Netzteils. Es wird jetzt alle 30 Minuten die Temperatur gemessen und gesendet.
Das hier beschriebene Schema, den Arduino über ein Wlan-Modul ans Netz anzubinden, funktioniert übrigens auch mit anderen Wlan-Modulen für den Arduino. Auch sie basieren zumeist auf einer Anbindung über die serielle Schnittstelle, lediglich die AT-Befehle variieren.
ESP allein benutzen
Um es vorwegzunehmen: Das Programm zum Messen und Senden der Temperatur für den ESP im Standalone-Betrieb ist erstaunlich kurz und simpel. Dafür ist der Schaltungsaufbau wegen der Stromversorgung komplizierter und der Flashvorgang erfordert Fummelei.
Deshalb beginnen wir mit der Programmerläuterung. Auch hier gibt es den vollständigen Quellcode für unser Programm auf Github. Zuerst muss aber über die Unterstützung für den ESP8266 in der Arduino IDE installiert werden. Dazu muss in den Einstellungen der IDE eine "zusätzliche Board-Verwalter-URL" hinzugefügt werden:
Dann kann über den Board-Verwalter das esp8266 -Paket gesucht und installiert werden. Neben dem Compiler stehen so auch einige zusätzliche Bibliotheken zur Verfügung. Davon benötigten wir die Basis-Bibliothek ESP8266WiFi.h und WiFiClient.h.







An der Temperaturmessung selbst ändert sich nichts Grundlegendes. Die GPIO-Pins des ESP sind entsprechend ihrer Nummerierung auch in der Arduino-IDE verfügbar, GPIO-02 wird in der IDE als 2 angesprochen. Die Onewire- und Dallas-Temperature-Bibliotheken, um die Temperatur abzufragen, funktionieren ebenfalls ohne Änderung.
Was sich ändert, sind die Verbindungsaufnahme zum Netzwerk und der Aufruf der URL. Die WLAN-Funktionen des ESP-Moduls sind im WiFi-Objekt gekapselt. Dessen API ist recht unkompliziert. In setup() wird die WLAN-Verbindung zuerst zurückgesetzt und eine neue Verbindung unter Angabe des Netzwerknamens und des Passworts gestartet. Danach wird gewartet, bis die Verbindung tatsächlich steht.
WiFi.disconnect(); WiFi.mode(WIFI_STA); WiFi.begin(SSID, PASSWORT); while (WiFi.status() != WL_CONNECTED) { delay(500); }Die Funktion sendTemperatur() funktioniert ebenfalls weitgehend wie im vorherigen Beispiel, nur werden statt AT-Kommandos API-Funktionen aufgerufen. Eine URL wird mit Hilfe des WiFiClient-Objektes abgerufen. Zuerst erfolgt die Verbindungsaufnahme mit dem Golem.de-Server mit client.connect(). War das erfolgreich, wird ein GET-Request mit der URL zusammengebaut und per client.println() verschickt. Da uns die Serverantwort nicht interessiert, wird die Serververbindung danach mit client.stop() geschlossen.
if (client.connect("www.golem.de", 80)) { String cmd = "GET "; cmd += URL; client.println(cmd); ... client.stop(); }Schaltung für die Programmierung aufbauen
Jetzt muss das Programm auf den ESP-01 übertragen werden. Dazu reichen prinzipiell ein USB-zu-Seriell-Adapter und ein Steckbrett - bei der Gelegenheit bauen wir aber auch die Stromversorgung mit auf. Viele USB-zu-Seriell-Adapter bieten zwar auch eine 3,3-V-Versorgung an, liefern aber für den ESP nicht immer ausreichend Strom.
ESP-Module benötigen eine Versorgungsspannung von 3,3 Volt, wofür wir einen LD33V-Spannungswandler verwenden. Die Ausgangsspannung stellt bei uns eine umfunktionierte USB-Buchse bereit, so können wir zur Stromversorgung auf ein USB-Netzteil zurückgreifen. Alternativ bietet sich eine Versorgung per Batterie oder über ein Netzteil mit Hohlstecker an. Es gilt lediglich zu beachten, dass bei einer Spannungsdifferenz von mehr als 3 Volt ein Kühlkörper am Spannungswandler angebracht werden sollte, da er sonst heiß wird.
Die USB-Buchse wurde auf eine Experimentier-Platine aufgelötet, dabei haben wir nur den stromführenden Pin und den Massepin mit der Platine verbunden, die beiden Datenleitungen hingegen abgetrennt. Über zwei weitere Pins auf der Platine wurde sie Steckbrett-kompatibel. Die Masse wird mit dem linken Bein des Spannungswandlers verbunden, wie auch mit der blauen Leiste des Steckbretts. Die Stromleitung von USB-Buchse verbinden wir mit dem rechten Bein des Wandlers, das mittlere Bein mit der roten Leiste des Steckbretts.
Jetzt kann der ESP angeschlossen werden. Der GND-Pin wird mit der blauen Masse-Leiste des Steckbretts verbunden, der VCC-Pin mit der roten Strom-Leiste, wie auch der CH_PD-Pin. Damit das ESP-Modul in den Flashmodus schaltet, muss GPIO-00 auf Masse gelegt und GPIO-02 mit Strom versorgt werden. Jetzt muss noch der TX-Pin des Moduls mit dem RX-Kontakt des USB-zu-Seriell-Adapters verbunden werden und der RX-Pin mit dem TX-Kontakt.







Nach der Vorbereitung wird die Schaltung mit Strom versorgt und der USB-zu-Seriell-Adapter an den Computer angeschlossen. In der Arduino-IDE wird als serieller Port der Adapter ausgewählt, im Board-Menü der "Generic ESP8266"-Eintrag. Nach Auswahl dieses Typs enthält das Werkzeug-Menü einige weitere Einträge, sie sind für uns aber nicht weiter interessant. Das Programm kann jetzt wie üblich kompiliert und übertragen werden.
Temperatursensor ergänzen
Für die eigentliche Arbeit ist die Verbindung mit dem USB-zu-Seriell-Adapter nicht notwendig. Auch muss die Verkabelung der GPIO-Pins gelöst werden. Stattdessen wird die Schaltung für die Temperaturmessung nach dem bekannten Muster aufgebaut. Das mittlere Bein des Temperatursensors wird mit Pin 2 des Moduls verbunden. Jetzt kann die gesamte Schaltung wieder mit Strom versorgt werden und läuft unabhängig.
Jetzt zum Freizeitforscher werden
Mit dem Schaltungsaufbau und dem regelmäßigen Skriptaufruf sind alle Zutaten beisammen, um an unserem großen Projekt Wie warm ist es in euren Büros? teilzunehmen. Wir hoffen, dass möglichst viele Bastler mitmachen - jetzt vielleicht auch du?
In dieser Serie sind bislang für folgende Plattformen Anleitungen erschienen: