Netzwerk-Anbindung mit ESP8266

1 Einrichtung

Im Unterricht setzen wir das NodeMCU 1.0 (ESP12E Module)-Board mit einem ESP8266-Chip ein (Pin-Belegung, API, Technical Reference).

Fügen Sie über 'Datei - Voreinstellungen: Zusätzliche Boardverwalter-URLs' die URL http://arduino.esp8266.com/stable/package_esp8266com_index.json hinzu. Anschließend kann das ESP8266 über 'Werkzeuge - Board - Boardverwalter' installiert werden. Geben Sie im Suchfeld 'NodeMCU' ein, wählen Sie 'esp8266 by ESP8266 Community' und klicken Sie auf 'installieren'. Folgen Sie der Anleitung. Wählen Sie anschließend unter Werkzeuge - Board den 'NodeMCU 1.0' aus.

Installieren Sie den Treiber für den CP2102-Chip[1]. Kontrollieren Sie anschließend im Windows-Gerätemanager, ob dieser korrekt installiert und welcher virtuelle COM-Port zugeordnet wurde.

Unter Linux müssen Sie für Ihren Benutzer ggf. Schreibberechtigungen für den Seriellen Port eintragen:
sudo usermod -a -G dialout <username> oder sudo chmod a+rw /dev/ttyUSB0

Der ESP8266-Chip lässt sich mit ähnlichen Befehlen wie der ATmega328 programmieren, siehe: Mikrocontroller-Programmierung. Nachdem das 'NodeMCU 1.0 (ESP12E Module)'-Board über 'Werkzeuge - Board' ausgewählt wurde, stehen unter 'Datei - Beispiele' zahlreiche vorgefertigte Programme zur Verfügung. Kontrollieren Sie in der Statuszeile der Arduino-IDE, ob das richtige Board und der richtige COM-Port gewählt wurde.

Testen Sie die korrekte Installation und Einstellungen Ihrer Arduino-IDE indem Sie ein Programm erstellen, das die eingebaute LED (Pin D4) blinken lässt.

Für viele Sensoren müssen zusätzliche Bibliotheken über Werkzeuge - Bibliotheken verwalten hinzugefügt werden. Diese werden lokal in Ihrem Dokumenten-Ordner unter Arduino/libraries gespeichert. Protokollieren Sie den Namen der Bibliothek exakt im Kommentarbereich des Sketch.

2 Netzwerk-Verbindung

Nach Bearbeitung dieses Kapitels können Sie ...

  • ... den ESP mit einem WiFi-Netz verbinden.
  • ... einen beliebigen WiFi-Client mit dem ESP verbinden.
  • ... einen Aktor über einen Button auf einer HTML-Seite schalten.
  • ... einen Messwert auf einer HTML-Seite darstellen.

Für die Verbindung gibt es die beiden Möglichkeiten:

  • Verbinden Sie das NodeMCU-Board als WiFi-client (WiFi.mode(WIFI_STA);) mit dem GSD-edu-WLAN.
  • Betreiben Sie das NodeMCU-Board als AccessPoint (WiFi.mode(WIFI_AP);) und verbinden Sie Ihr Smartphone damit.

Wenn man auf dem Chip einen WebServer betreibt, lassen sich Sensordaten einfach darstellen und Aktoren steuern. Hierzu muss der WebServer eine HTML-Seite an den Client senden.

Arbeitsauftrag:

  1. Öffnen Sie das Beispiel 'Datei - Beispiele - ESP8266WebServer - HelloServer'.
    Fügen Sie auf der Webseite einen Button hinzu mit dem die LED_BUILTIN geschaltet werden kann.
    Kommentieren Sie den Quellcode und speichern Sie diesen unter dem Namen '2-2-1-WebSchalter' ab.
    (Lösungsansatz: http://esp8266-server.de/)
  2. Schließen Sie an einem beliebigen Eingang einen Taster über einen PullUp-Widerstand an[2]. Ändern Sie das Programm so ab, dass die LED sowohl über die Webseite als auch mit dem Taster geschaltet werden kann.
    Kommentieren Sie den Quellcode und speichern Sie diesen unter dem Namen '2-2-2-WebSchalter' ab.
    (Sie können das Programm noch erweitern, dass das Drücken des Tasters dabei nicht nur die LED schaltet, sondern auch die Darstellung des Buttons auf der Webseite ändert.)
  3. Öffnen Sie das Beispiel 'Datei - Beispiele - ESP8266WebServer - HelloServer'.
    Verbinden Sie ein Potentiometer mit dem analogen Eingang A0 und stellen Sie den eingestellten Wert auf der Webseite dar. Wenn sich der Wert verändert, muss die Webseite manuell aktualisiert werden.
    Kommentieren Sie den Quellcode und speichern Sie diesen unter dem Namen '2-2-3-WebPoti' ab.
  4. Erweitern Sie das Programm so, dass sich der Wert in regelmäßigen Abständen automatisch aktualisiert. Dabei soll nicht die komplette Webseite neu geladen werden, sondern nur das Feld, das den Wert enthält.
    Kommentieren Sie den Quellcode und speichern Sie diesen unter dem Namen '2-2-4-WebPoti' ab.

3 Energiespar-Modus und Zeit mit RTC und NTP-Server

Nach Bearbeitung dieses Kapitels können Sie ...

  • ... einen Sketch verändern, um die Leistungsaufnahme des ESPs zu minimieren.
  • ... die Laufzeit mit einer vorgegebenen Batterie- oder Akkukapazität abschätzen.

3.1 Deep Sleep

Oft werden mit dem Arduino Messungen in großen Zeitabständen durchgeführt und es steht keine dauernde Spannungsversorgung zur Verfügung (z.B. Akku oder Batterie). In diesem Fall muss nach der Messung der Deep-Sleep-Modus aktiviert werden[3]. Hierzu müssen die Pins D0 und RST verbunden werden, damit der Prozessor wieder 'aufgeweckt' werden kann. Wenn die Verbindung gesteckt ist, kann es zu Problemen beim Flashen kommen. In diesem Fall vor dem Flashen die Verbindung kurz trennen. Der Deep-Sleep-Modus wird durch ESP.deepSleep(10e6); für 10 Sekunden aktiviert. Da der ESP intern für die Dauer in Mikrosekunden eine unsigned 32bit Variable nutzt, kann diese maximal ca. 71 Minuten lang sein. Alle Befehle, die der ESP ausführen soll, müssen in der setup()-Methode stehen, die loop()-Methode bleibt leer.

Es ist auch möglich, den ESP durch einen externen Interrupt (kurzes LOW-Signal an RST) wieder einzuschalten. In diesem Fall darf die Verbindung zwischen den Pins D0 und RST nicht gesteckt werden. Der Deep-Sleep-Modus wird durch ESP.deepSleep(0); aktiviert.

3.2 RTC (Real Time Clock)

Bei Messungen ist oft die genaue Zeit entscheidend. Diese kann über die interne RTC, die auch für den DeepSleep-Modus zuständig ist, oder ein RTC-Modul, wie z.B. das DS3231, ermittelt werden. Nachteil dieser Module ist neben einem erhöhten Aufwand an Bauteilen, dass die enthaltene Uhr über Tasten und eine Anzeige oder ein Web-Interface zunächst gestellt werden muss. Beide Varianten haben keine hohe Genauigkeit.

3.3 NTP (Network Time Protocol)

Alternativ kann man die genaue Uhrzeit von einem NTP-Zeitserver beziehen (Video, Library mit Beispiel), z.B. de.pool.ntp.org. Die Kommunikation mit einem NTP-Server findet mit dem UDP-Protokoll statt. Nachdem eine Anfrage an den NTP-Dienst gestellt wurde, erhält man als Antwort die Anzahl von Sekunden seit dem 1.1.1970, die dann in Datum und Uhrzeit umgerechnet werden kann. So lässt sich z.B. auch die Uhrzeit anzeigen [4].

Arbeitsauftrag:

  1. Schreiben Sie ein Programm, dass im Abstand von 3 Sekunden die interne LED (D4) dreimal blinken lässt und danach den DeepSleep-Modus aktiviert.
    Kommentieren Sie den Quellcode und speichern Sie diesen unter dem Namen '2-3-1-DeepSleep' ab.
  2. Verändern Sie Aufbau und Programm so, dass der ESP durch einen Taster wieder aktiviert wird und die LED dreimal blinkt.
    Kommentieren Sie den Quellcode und speichern Sie diesen unter dem Namen '2-3-2-DeepSleep' ab.
  3. Verändern Sie das Programm so, dass das Blinken zu festgelegten, präzisen Zeiten durchgeführt werden. Realisieren Sie hierbei durch Wahl des richtigen Modus eine minimale Leistungsaufnahme.
    Kommentieren Sie den Quellcode und speichern Sie diesen unter dem Namen '2-3-3-NTP' ab.
  4. Bestimmen Sie mit Hilfe eines Multimeters die Leistungsaufnahme des ESPs während des Blinkens und im DeepSleep-Modus. Protokollieren Sie die Werte. Erstellen Sie eine EXCEL-Tabelle mit der abhängig von dieser Leistungsaufnahme, der DeepSleep-Zeit und einer Batterie- oder Akkukapazität die Laufzeit abgeschätzt werden kann.

4 Cloud-Dienst

Nach Bearbeitung dieses Kapitels können Sie ...

  • ... analoge Messwerte zu einer IoT-Plattform übertragen.
  • ... verschiedene IoT-Plattformen nennen und deren Vor- und Nachteile abwägen.
  • ... eine IoT-Plattform hinsichtlich der Eignung für ein Projekt auswählen.

Am Beispiel des Dienstes ThingSpeak. An diesen Dienst lassen sich von einem beliebigen IoT-Device Daten senden. Hierzu muss ein Channel angelegt werden und dessen Key im Sketch eingetragen werden. Die Daten lassen sich dann visualisieren und analysieren[5]. Sign In - Channels - My Channels - New Channel - (Namen und Field Label eingeben) - Save Channel. Der API-Key des Channels muss in den Sketch eingebunden werden, damit sich der ESP12 vebinden kann.

Dieser Beispiel-Channel zeigt eine Temperatur an.

Nutzen Sie zur Übertagung der Daten nicht das Schüler-WiFi, da diese Dienste gesperrt sind.

Fügen Sie über die Bibliotheksverwaltung 'ThingSpeak' hinzu. Protokollieren Sie den exakten Namen der Bibliothek. Öffnen Sie anschließend Datei - Beispiele - ThingSpeak - ESP8266 - program board directly - WriteSingleField.

Weitere, vergleichbare Plattformen (achten Sie bei der Anmeldung darauf, dass Sie jeweils die kostenlose Variante wählen):

Arbeitsauftrag:

  1. Schließen Sie eine Poti am analogen Eingang A0 des ESP an. Stellen Sie den zeitlichen Verlauf des Potiwertes grafisch dar.
    1. Realisieren die Darstellung mit dem Dienst ThingSpeak.
      Kommentieren Sie den Quelltext und speichern Sie diesen unter dem Namen '2-4-1-ThingSpeak' ab.
    2. Realisieren Sie die Visualisierung ebenfalls mit dem Dienst Ubidots.
      Kommentieren Sie den Quelltext und speichern Sie diesen unter dem Namen '2-4-2-Ubidots' ab.
    3. Stellen Sie die Dienste hinsichtlich der Leistungsfähigkeit, Dokumentation/Tutorials und Handhabbarkeit vergleichend gegenüber.
  2. Ergänzen Sie das Programm für eine Plattform Ihrer Wahl um den DeepSleep-Modus. Für Testzwecke sollen kurze Zeitabstände gewählt werden. Das Programm soll nach erfolgreichem Test stündlich Temperaturmesswerte übertragen.
    Kommentieren Sie den Quelltext und begründen Sie Ihre Entscheidung für die gewählte Plattform. Speichern Sie diesen unter dem Namen '2-4-5-Temp' ab.

5 Kommunikation über MQTT

Nach Bearbeitung dieses Kapitels können Sie ...

  • ... einen MQTT-Broker installieren.
  • ... Nachrichten, die den Broker erreichen mit entsprechenden Programmen auslesen und interpretieren.
  • ... mit einem ESP Sensordaten an einen MQTT-Broker senden.
  • ... mit einem ESP Daten von einem Broker empfangen und in Abhängigkeit Aktoren schalten.

Das Message Queue Telemetry Transport-Protokoll ist ereignis- und nachrichtenorientiert, überträgt die Nachrichten asynchron und kommt mit sehr geringen Ressourcen sowohl auf der Client-Seite als auch bei der Bandbreits aus. Der MQTT-Client legt eine beliebige Nachricht in einem von ihm festgelegten Pfad (Topic) auf einem MQTT-Broker ab (publish). Dieser schickt die eintreffenden Nachrichten an einen anderen Client, der sich für diese Nachrichten eingetragen hat (subscribe), dazu ist es nicht notwendig, dass Sender und Empfänger gleichzeitig erreichbar sind. Beim Empfangen ist der Einsatz von Wildcards (+ - Single-Level/# - Mulit-Level) möglich.

Die MQTT-Übersicht verdeutlicht die Zusammenhänge.

Das Protokoll kennt drei verschiedene Qualitätsstufen (QoS) bei der Datenübermittlung.

  • QoS0: Meist einmal
  • QoS1: Mindestens einmal
  • QoS2: Garantiert einmal

Falls der Client nicht dauernd erreichbar ist und die zuletzt eingegangene Nachricht zugestellt werden soll, muss das Retain-Flag für diese Nachricht gesetzt werden. Der Inhalt der Nachricht (Payload) wird bei neu ankommenden Nachrichten solange ersetzt, bis er an einen Client ausgeliefert werden kann.

Ein Client kann zusätzlich einen letzten Willen an den Broker schicken, der dann an die empfangenden Clients ausgeliefert wird, wenn die Verbindung abbricht.

(siehe: [6], [7], [8])

MQTT-Broker (z.B. Mosquitto) stehen zur Verfügung für

  • PC[9] - nach der Installation aufrufen mit "C:\Program Files\mosquitto\mosquitto" -v, dadurch ist in der Eingabeaufforderung sichtbar, welche Daten versendet werden.
  • Raspberry Pi[10] (auf dem Raspberry Pi 01 ist ein MQTT-Broker installiert (GSD-edu-IP: 10.7.140.68))
  • Außerdem gibt es eine Vielzahl frei zugänglicher Broker im Netz[11].

Mit Hilfe eines MQTT-Clients können die Daten auf dem Broker gelesen und verändert werden.

  • PC [12], [13]
  • Smartphone[14].
  • Um das Programm für den ESP zu erstellen, fügen Sie über die Bibliotheksverwaltung 'PubSubClient by Nick O'Leary' hinzu (https://pubsubclient.knolleary.net/).
    Öffnen Sie Datei - Beispiele - PubSubClient - mqtt_esp8266.

Wichtig: Die hier behandelten Themen geben nur einen kleinen Einblick in die Verwendung des Protokolls im Test- und Lehrbetrieb. Für den Echtbetrieb müssen unbedingt Sicherheitsmaßnahmen getroffen werden! Z.B. Verschlüsselung mit TLS/SSL, Authentifizierung, Authorisierung, etc.


Arbeitsauftrag:

  1. Senden Sie Temperatur- oder Potiwerte in regelmäßigen Abständen an einen MQTT-Broker. Prüfen Sie regelmäßig, ob die Verbindung zum Broker noch besteht und Sie stellen diese ggf. wieder her. Kontrollieren Sie die eingehenden Nachrichten mit einem MQTT-Client.
    Nutzen Sie dazu diese Library und öffnen Sie das Beispiel Datei - Beispiele - PubSubClient - mqtt_esp8266.
    Kommentieren Sie den Quelltext und speichern Sie diesen unter dem Namen 'ESP2MQTT_01' ab.
  2. Geben Sie eingehende Nachrichten in einem festgelegten Topic im Seriellen Monitor aus.
    Schalten Sie bei erreichen eines Schwellwerts eine LED ein und bei unterschreiten des Schwellwerts wieder aus.
    Kommentieren Sie den Quelltext und speichern Sie diesen unter dem Namen 'MQTT2ESP_01' ab.
  3. Schließen Sie an einem beliebigen Pin des ESPs einen Taster an (PullUp-Widerstand nicht vergessen oder internen PullUp verwenden) und schalten Sie damit eine LED an einem anderen Pin ein und aus. Alternativ können Sie die eingebaute LED verwenden.
    Schicken Sie den Zustand der LED an einen MQTT-Broker und beobachten Sie das Topic mit einem MQTT-Client.
    Kommentieren Sie den Quelltext und speichern Sie diesen unter dem Namen 'ESP2MQTT_02' ab.
  4. Rufen Sie mit einem anderen ESP den Zustand der LED vom MQTT-Broker ab und schalten Sie eine angeschlossene oder die eingebaute LED entsprechend.
    Kommentieren Sie den Quelltext und speichern Sie diesen unter dem Namen 'MQTT2ESP_02' ab.

Links:

Literatur*:

  1. Walter Trojan: Das MQTT-Praxisbuch. Elektor-Verlag, Aachen 2017, ISBN: 978-3-89576-324-3


6 Erweiterungen

6.1 WLAN-AutoConnect

In den bisherigen Programmen wurden die WiFi-Zugangsdaten fest im Programm eingestellt. Das ist ungünstig, wenn ein fertiger ESP weitergegeben werden soll und flexibel mit einem beliebigen WLAN verbunden werden soll. Der WiFiManager leistet genau das. Wenn der ESP8266 noch nicht mit einem WLAN verbunden wurde oder kein bekanntes WLAN findet, startet er im AP-Modus. Nachdem man sich mit diesem AP verbunden hat und im Browser die Seite http://192.168.4.1 geöffnet hat, kann man das WLAN auswählen oder eingeben mit dem sich der ESP8266 verbinden soll. Die eingegebenen Daten werden auf dem ESP im Flash gespeichert.

Hierzu muss der 'WiFiManager by tzapu' über die Bibliotheksverwaltung hinzugefügt werden. Öffnen Sie anschließend Datei - Beispiele - WiFiManager - AutoConnect. Die Einbindung in bestehende Programme ist sehr einfach und wird hier gut erklärt.

Arbeitsauftrag:

  1. Ergänzen Sie die Programme '2-2-2-WebSchalter' und '2-4-1-ThingSpeak' um den AutoConnect.

6.2 FileSystemUploader

Mit dem ESP8266FS - FileSystemUploader[15] können beliebige Daten in den 4MB großen Speicher des Boards hochgeladen werden. Achten Sie darauf, dass für das Programm genügend Platz zur Verfügung steht. Installieren Sie das Plugin in Ihrer Arduino-IDE und nutzen Sie das 'data'-Verzeichnis, das in Ihrem Projekt-Verzeichnis angelegt werden muss, zur Speicherung Ihrer Webseite. Der Inhalt dieses Ordners wird beim Übertragen des Sketches auf den ESP automatisch mit übertragen.

Als Einstieg kann diese Seite genutzt werden.

Arbeitsauftrag:

  1. Schreiben Sie ein Programm, das die OnBoard-LED (LED_BUILTIN) mit Buttons auf einer HTML-Seite ein- und ausschalten kann.
    1. Verbinden Sie das NodeMCU-Board mit dem 'GSD-edu'-WLAN. Die aktuelle IP-Adresse und der Zustand der LED sollen im Seriellen Monitor ausgegeben werden.
    2. Testen Sie die Verbindung auch, wenn das NodeMCU als Access-Point konfiguriert ist.
  2. Schließen Sie einen Temperatursensor[16] an und zeigen Sie den Wert dezimal auf einer HTML-Seite an.
    Aktualisieren Sie nur das Feld mit dem Temperaturwert in regelmäßigen Abständen, nicht die vollständige Webseite.

7 Links



[*] Bei der angegebenen weiterführenden Literatur handelt es sich nicht um Schulbücher. Der Erwerb ist für den Unterricht nicht erforderlich und nicht vorgeschrieben. Die Bücher geben die Möglichkeit, sich tiefer in ein Teilgebiet ein zu arbeiten.