Donnerstag, 26. März 2015

ESP8266 - 1: Fensterwächter

Wie in einem früheren Beitrag schon beschrieben kann für die ESP8266 Module aus China die Entwicklungsumgebung für NodeMcu aufgesetzt werden. In diesem Beitrag werden wir das erste Projekt erstellen und den Controller programmieren.

Morgens mache ich das Schlafzimmerfenster immer auf, um zu lüften. Wenn ich dann vor dem ersten Kaffee schon auf dem Weg zur Arbeit bin, kann es passieren, dass das Fenster weiterhin offen ist. Mist. Also brauch ich etwas, dass mir sagt, dass das Fenster noch geöffnet ist. Ein Fensterwächter.

Mit Hilfe von einigen Komponenten, dem ESP-01 Modul, einem Mikroschalter und einer Batterie kann genau das erreicht werden.

Das ganze soll neben dem Fenster am Fensterrahmen befestigt werden. Dazu werde ich ein 3D gedrucktes Gehäuse verwenden, in dem alles untergebracht ist. Wenn das Fenster geöffnet wird, wird der Mikroschalter nicht mehr betätigt und schließt den Stromkreis zum Controller. Dieser startet und geht sofort für 10 Minuten in den Tiefschlaf. Wenn er daraus erwacht, ohne dass die Batteriespannung zwischendurch getrennt wurde, verbindet es sich mit dem WLAN Accesspoint und sendet eine Email, die dann auch meinem Mobiltelefon angezeigt wird.

Hardware

Wie schon beschrieben benötigen wir mehrere Komponenten für den Aufbau des Fensterwächters. Das ESP8266 Modul ESP-01 hat 8 Pins mit dem es die wichtigsten Signale nach Außen führt. Wie zu erkennen sind lediglich zwei GPIOs herausgeführt. Für unsere Zwecke benötigen wir aber genau keine. Für das Flashen der NodeMcu Software allerdings werden genau diese beiden Pins benötigt. Weiterhin ist der CH_PD Pin herausgeführt, der sorgt dafür, dass das Modul abgeschaltet ist, wenn er nicht auf VCC liegt. Für Experimentierzwecke habe ich den Pin über einen 100Ohm Widerstand mit VCC verbunden. Zu beachten ist, dass auf dem ESP-01 Modul der Pin zum Aufwecken des Controllers (GPIO 16) nicht mit dem RST Pin verbunden ist.
ESP-01 Pinbelegung
Das Modul kommt mit einer Firmware ausgestattet, die über die Serielle Schnittstelle angesprochen werden kann. Um diesen Betriebsmodus zu verwenden benötigt man dann noch einen zweiten Controller, der mit dem Modul kommuniziert. Wir wollen allerdings nur den einen Controller einsetzen, müssen also die darauf befindliche Firmware ändern. Das kann ganz einfach mit dem NodeMcu Flasher passieren. Dazu verbinden wir die Pins GPIO0 mit GND und GPIO2 mit VCC. Dadurch befindet sich der Chip nache einem Reset in einem Zustand indem der Bootloader über die serielle Schnittstelle eine neue Firmware in den Speicher des Moduls schreiben kann. Der Flasher übernimmt alles was dafür notwendig ist.

Mit dem ESPlorer kann jetzt die Lua Software auf dem Modul geschrieben werden. Das Erste was wir tun ist eine 'init.lua' erstellen, die wird beim Start des Controllers ausgeführt.
Der grundlegende Programmablauf ist oben schon aufgeführt:

  • Power up
  • Deep Sleep für 10 Minuten
  • Wake up
  • Verbinde mit WLAN Router
  • Sende Email
  • Deep Sleep bis Power down
Die API von NodeMcu gibt Informationen über die benötigten Funktionen:
Es fehlt lediglich der Programmteil zum senden der Email-Warnung.

So weit zur Theorie. Ein Problem zeigt sich bei der Umsetzung des Email Versandes. Da der ESP sich nicht als SMTP Server behaupten kann, Eine Möglichkeit ist es die Kommunikation mit einem SMTP Server manuell zu programmieren, einfacher ist es jedoch einen bereits existierenden Service, wie zum Beispiel PushingBox.com zu nutzen. Dort kann man über eine HTTP API eine Notification, oder eine Email abschicken. Das Ganze ist dann auch von dem PC aus konfigurierbar und lässt auf dem ESP genügend Platz für andere Funktionen.

Gestartet wird immer in der 'init.lua'. Egal ob aus dem Power down, oder dem Tiefschlaf. Das führt dazu, dass nicht genau erkannt werden kann, aus welchem Vorzustand der Chip kommt. Es wird also nach dem Aufwachen ein Timer gestartet und der Chip befindet sich im idle Modus. Welche Folgen das für den Stromverbrauch und die daraus resultierende Batterielaufzeit hat, wird sich noch herausstellen.
Nachdem die 10 Minuten, oder (600000 ms) abgelaufen sind, wird die Datei 'fenster.lua' aufgerufen und interpretiert. Als erstes muss das WiFi-Modul gestartet werden. Dann wird die Verbindung mit dem Accesspoint hergestellt.
Sobald die Verbindung zum Accesspoint besteht und das Modul eine IP-Adresse erhalten hat, soll die Funktion pollPushingBox() aufgerufen werden. Dazu verwenden wir einen neuen Timer:
Die pollPushingBox() Funktion baut eine TCP Verbindung mit dem PushingBox Service auf und sendet einen API Request um einen Alarm auszulösen.
Nachdem der Server geantwortet hat, geht das Modul in den unendlichen Tiefschlaf. Erst ein Wegfallen der Batteriespannung (durch Schließen des Fensters) wird der Chip resettet und bei erneutem Öffnen beginnt der Code wieder in der ersten Zeile der init.lua.

Der Code zeigt, wie einfach mit NudeMcu und Lua ein ESP2866 für einfache Zwecke verwendet werden kann.