René Schimmelpfennig

Webdeveloper, Entertainer, Querdenker & Eichhörnchen-Züchter 🐿️

Bewässerungsanlage – Erfolge mit dem WeMos D1 Board

Monatelang habe ich versucht mein Bewässerungsanlagen-Projekt mit dem ESP8266 zum Laufen zu bringen. Einige Versuche waren nur teilweise erfolgreich, andere verliefen grundsätzlich im Sande: Es war mir einfach nicht möglich vernünftig eine Kommunikation zwischen dem WiFi-Modul und dem Arduino aufzubauen.

Sparkfun WiFi Shield

Als nächsten Schritt entschied ich mich dazu ein WiFi Shield von Sparkfun zu bestellen. Auf diesem mussten nur die Header-Pins aufgelötet werden und im Internet finden sich eine Reihe von Demo-Anwendungen dafür. Nachteilig war die Höhe des Ganzen. Da das Board auf den Arduino aufgesteckt wird und darauf dann mein eigenes Shield mit den Sensoren noch platziert werden muss.

Mit dem Sparkfun Shield war es mir ohne Probleme möglich eine Verbindung mit meinem Netzwerk aufzubauen. Jedoch scheiterten all meine Unternehmungen Daten an einen Server zu senden. Verflucht!? Selbst das Demo-Projekt dazu funktionierte nicht richtig. Entweder ist das Shield defekt, Probleme mit der Firmware oder ich habe iwas übersehen.

Also musste das Projekt wieder ruhen und als Rettung liebäugelte ich schon mit dem Raspberry Pi. Einer der Vorteile: ich könnte dann den Code komplett in Python implementieren.

WeMos D1

Dann auf einer Party unterhielt ich mich zufällig mit jemanden, der sich auch mit Mikrocontrollern beschäftigt. Ich beschrieb ihn meine verzwickte Situation und er empfahl mir das WeMos D1 Board, welches bereits einen ESP8266 enthält und weitgehend zum Arduino kompatibel sein soll.

In China bestellt und bereits nach einer Woche im Briefkasten, für unter 10 €: So konnte ich endlich weitermachen: Löten brauchte man nix. Selbst die Headerpins waren schon an Ort und Stelle. Allerdings muss man seine Arduino IDE anpassen damit sie für dieses Board kompilieren kann. Danach hat man Zugriff auf spezielle Bibliotheken, die einem die Programmierung mit dem ESP8266 Chipsatz erleichtern: so ist bereits eine Http-Client Bibliothek vorhanden und es werden ein paar einfache Beispiele mitgeliefert.

Einer der Nachteile des Boards ist, dass es zwar weitgehend zum Arduino Uno kompatibel ist, im Gegensatz zu ihm aber nur über einen analogen Eingang verfügt, der wiederum nur 3,3 statt 5 Volt verträgt. Dadurch kann ich nicht mehr ohne weiteres um weitere Feuchtigkeitssensoren erweitern. Aber auch dafür kann man Lösungen entwerfen.

Eigene REST API

Zunächst baute ich mir eine REST API mit Asp.net Core, welche ich auf meinem Linux-Server laufen ließ. Über den Http-Client des Boards konnte die aktuelle Uhrzeit angefragt und so das RTC-Modul gestellt werden. Die API nahm auch die Sensor-Daten mittels Http POST an und schrieb sie in eine MongoDB Datenbank.

MQTT und NTP

Kurz darauf setzte ich einen MQTT Server auf (Mosquitto) und stellte die Firmware der Bewässerungsanlage auf dieses Protokoll um. Es ist im IoT Umfeld sehr gebräuchlich und bietet einige Vorteile: So kann ich nun eine Push-Nachricht an das Board schicken, um unverzüglich eine Bewässerung einzuleiten. Der Code ist dadurch auch viel schlanker geworden.

Nachteil: Die Sensorwerte werden durch den MQTT-Server nicht automatisch persistiert und man muss selbst dafür sorgen, dass diese persistiert werden. Ich entschied mich einen Client in Python zu entwickeln der diese Funktion übernimmt. Dazu weiter unten mehr.

Allerdings holt sich das Board über diese API auch die Uhrzeit. Für diese Aufgabe konnte ich auch auf einen Standard zurückgreifen: NTP, das ist ein Protokoll um Zeiten über das Internet synchronisieren zu können. Ich fügte der Shield-Firmware eine schlanke NTP Bibliothek hinzu und somit war die eigene REST API obsolet geworden.

DS3231 – ein neues RTC Modul

Da durch die verschiedenen Umbauten mein RTC Modul beschädigt wurde und nicht mehr zuverlässig funktionierte ersetzte ich es kurzerhand durch eins mit dem moderneren DS3231 Chipsatz. Welcher unter anderem auch Alarme bietet und so in Zukunft unsere Board zu einer bestimmten Zeit aus dem Standby-Modus holen kann.

Interaktion der Komponenten

Für meine Bewässerungsanlage agieren unterschiedliche Systeme wie folgt miteinander:

NTP Server

Externer öffentlicher Server, über dem das Shield die aktuelle Uhrzeit für das RTC-Modul holt.

Shield

An ihm hängen die Sensoren: Es misst damit Temperatur, Luftdruck und Feuchtigkeit des Bodens.

Die Daten werden regelmäßig über MQTT an den Server geschickt. Das Shield kann auf eine eingehende Push-Benachrichtigung reagieren und dann den Bewässerungsvorgang auslösen.

MQTT-Client (Python)

Er läuft auf dem Server und fängt die Nachrichten ab, die über das MQTT-Protokoll eintreffen und speichert diese in einer MariaDB Datenbank ab, da der MQTT-Broker diese Funktion nicht selbst zur Verfügung stellt.

Zudem entscheidet der Client wann eine Bewässerung ausgelöst werden soll und sendet, ebenfalls über MQTT, eine Nachricht an das Shield mit der Zeit, wielange die Pumpe aktiviert werden soll.

Schaltplan und Quelltexte

So schaut das Ganze momentan aus:

Den Support für den LCD Bildschirm habe ich aus der Firmware wieder entfernt, da man nun die Sensorwerte auch einfach mit einer kleinen Android-App vom MQTT Server abfangen kann. Die vier Header-Pins habe ich aber auf dem Board belassen. Vllt kommen sie später noch einmal zum Einsatz.

Schaltplan Shield

Quelltexte

Shield Firmware (Arduino C++)

Den vollständigen Quelltext der Firmware habe ich auf Github veröffentlicht. Er lässt sich mit den bereits angesprochenen Anpassungen mit der aktuellen Version der Arduino IDE kompilieren. Ihr müsst über den Library-Manager folgende Module nachinstallieren:

  • PubSubClient by Nick O’Leary (Version 2.6.0)
  • NTPClient (Version 3.1.0)
  • Rtc by Makuna (Version 2.0.1)
  • DHT sensor library by Adafruit (Version 1.2.3)
  • ArduinoJson (Version 5.9.0)

MQTT-Client (Python)

Der MQTT-Client empfängt die Signale vom Shield und speichert die Sensorwerte in einer MariaDB-Datenbank zwischen. Zudem sendet es, beim Unterschreiten einer bestimmten Feuchtigkeit des Bodens, das Signal zum Bewässern aus.

ToDo Liste

Folgende Punkte sind noch offen:

  • Im MQTT-Client (Python) implementieren, dass beim Unterschreiten einer gewissen Feuchtigkeit Bewässerung ausgelöst wird.
  • Wenn das Board das Signal zum Bewässern bekommt, steuert es einen Transistor an, welcher den Stromkreis zur Pumpe schließt (auf dem Schaltbild durch einen Motor dargestellt). Leider reicht die Stromstärke, die das Board zur Verfügung stellt nicht aus damit die Pumpe läuft. Hier müsste parallel Strom aus der Powerbank bezogen werden.
  • Unter einigen Umständen stellt sich die Uhrzeit auf „85/165/2009 37:165:“. Wahrscheinlich ein Bug in der Bibliothek.
  • Frontend zum Anzeigen der Sensordaten in Diagrammform.

Weiter Beitrag

Zurück Beitrag

© 2018 René Schimmelpfennig

Thema von Anders Norén