Tag für Tag die Pflanzen im heimischen Gewächshaus per Hand gießen? Das muss nicht sein! 😉

Im Folgenden beschreibe ich den Selbstbau eines automatischen Bewässerungssystems auf Basis eines Arduino Pro Mini, kapazitiven Bodenfeuchtigkeitssensoren und Magnetventilen. Als Stromversorgung dienen Li-Ion Akkus und eine kleine Solarzelle, wodurch das System ohne externe Stromversorgung völlig autark laufen kann.

Das Bewässerungssystem misst eigenständig in regelmäßigen Abständen die Bodenfeuchtigkeit und bewässert bei Bedarf den Boden durch das Öffnen von Magnetventilen. Es sind ein bis vier getrennt gesteuerte Kanäle möglich. Zusätzlich können über einen DHT22 oder DHT11 Sensor die Temperatur und Luftfeuchtigkeit gemessen werden.

Über 433 MHz Funk kann das System aus der Ferne konfiguriert und gesteuert werden. Ebenso werden Statusinformationen und Messwerte gesendet. Hierfür kommt das Protokoll RadioHead zum Einsatz.

 

Wichtigste Bauteile

  • Ein Arduino Pro Mini 5 V, 16 MHz
    Alternativ kann auch ein anderer Arduino verwendet werden, wobei der Pro Mini jedoch den geringsten Stromverbrauch hat.
  • Ein bis vier kapazitive Bodenfeuchtigkeitssensoren
  • Ein bis vier 12 V Magnetventile
  • Li-Ion/LiPo Akku(s)
    Zum Beispiel drei Akkus vom Typ 18650 mit je 2600 mAh.
  • Li-Ion/LiPo Laderegler TP4056 mit integriertem Schutz vor Tiefentladung
  • 5 V Solarzelle
  • Zwei einstellbare DC-Boost-Konverter (StepUp)
    Eingestellt auf 5 V für die Steuerung beziehungsweise 12 V für die Magnetventile.
  • 433 MHz Funksender und -empfänger
    Empfänger vom Typ 3400RF sollten vorzugsweise verwendet werdet werden, da diese eine deutlich höhere Reichweite als die XY-MK-5V ermöglichen.
  • Gehäuse, Transistoren, Taster, Widerstände, Steckverbinder

Die Gesamtkosten der Bauteile belaufen sich auf etwa 50 bis 60 Euro.

 

Aufbau der Hardware

Die Hardware wird nach folgendem Schema aufgebaut:

 

Fertig zusammengebaut und in ein kleines Gehäuse gesteckt könnte es dann so aussehen:

 

Bodenspieße zur Bewässerung

Damit das Wasser nicht nur oberflächlich auf der Erde verteilt wird, sondern direkt an die Wurzeln der Pflanzen gelangt, habe ich ein 3D-Modell für Bodenspieße entworfen und mit einem 3D-Drucker ausgedruckt.

Oben wird auf beiden Seiten ein 1/2” Schlauch angeschlossen. Durch die Hohlräume wird das Wasser bis ca. 10 cm Tiefe direkt in Boden geleitet.

Die Vorlagen für den 3D-Druck habe ich auch auf Thingiverse veröffentlicht: Watering Spikes

 

Software

Heruntergeladen werden kann die Software für den Mikrocontroller (Arduino Pro Mini) sowie die Konfiguration des fertigen Systems direkt aus dem cryHost GitLab Repository als .zip oder .tar.gz Archiv.

Mögliche Anpassungen an die eigene Hardware etc. können in der Datei src/config.h vorgenommen werden.

Einige Variablen können zur Laufzeit über Funk gelesen und angepasst werden. Siehe hierzu den Abschnitt “Konfiguration” weiter unten. Änderungen an diesen einstellbaren Variablen werden im EEPROM des Mikrocontrollers sicher gespeichert und bei einem Neustart wieder geladen.

 

Mit PlatformIO

Die Software für den Mikrocontroller basiert auf PlatformIO. PlatformIO ist ein Open Source Ecosystem für IoT-Anwendungen mit integrierter Verwaltung von verschiedensten Boards und Libraries. Als IDE kommen Atom oder Visual Studio Code zum Einsatz.

Beim Build und/oder Upload kümmert sich PlatformIO automatisch um alle benötigten Abhängigkeiten.

 

Mit ArduinoIDE

Als Alternative zu PlatformIO kann auch die ArduinoIDE zum Programmieren des Mikrocontrollers genutzt werden.

Hierbei müssen jedoch die folgenden Bibliotheken per Hand zuvor in der ArduinoIDE installiert werden:

In der ArduinoIDE muss dann die Datei src/src.ino geöffnet werden.

 

Blink-Codes

Über die LED des Arduinos werden Fehler und Informationen über eine Blinkfolge von kurzen und langen Impulsen dargestellt. Die Bedeutungen der Blink-Codes können der folgenden Tabelle entnommen werden.

Blink-CodeBedeutung
kurz, kurz, kurzEEPROM-Reset erfolgreich, Standardeinstellungen geladen
lang, kurz, kurzFehler bei Initialisierung des 433 MHz Funk
lang, kurz, langFehler beim Senden einer RadioHead-Nachricht (kein ACK empfangen)
lang, lang, kurzFehler beim Abfragen des DHT-Sensors
sehr kurz, sehr kurzRadioHead-Nachricht empfangen

 

Interpretation der Messwerte

Die Bodenfeuchtigkeit und die Akkuspannung werden über den 10-Bit Analog-Digital-Converter (ADC) des Mikrocontrollers gelesen. Dabei ergeben sich Messwerte zwischen 0 (0 V) und 1023 (5 V).

Bei den Bodenfeuchtigkeitssensoren bedeutet ein höherer Messwert einen trockeneren Boden. Bei einem sehr trockenen Boden ergeben sich Werte von etwa 500, bei nassem Boden etwa 300.

Die aktuelle Batteriespannung kann aus dem ADC-Wert mittels U = adc * 5 / 1023 berechnet werden.

Die Software des Mikrocontrollers berechnet intern direkt einen prozentualen Akkustatus. Dabei gilt (bei Standardconfig) U <= 2,5 V ⇒ 0% und U >= 4,2 V ⇒ 100%.

 

Konfiguration

Die gesamte Konfiguration des fertigen Systems ist über die 433 MHz Funkverbindung möglich.

Das Softwarepaket enthält im Verzeichnis control eine kleine Anwendung auf Basis von Node.js, über die die gesamten Einstellungen komfortabel über einen Webbrowser vorgenommen werden können.

Vor dem ersten Start müssen hierfür die benötigten Node.js Module (node_modules) installiert werden, wobei eine Verbindung zum Internet benötigt wird:

Anschließend kann die Anwendung auch ohne Internetverbindung gestartet werden:

Nun einfach im Browser die Adresse http://localhost:3000/ aufrufen, Port auswählen und verbinden.

Control-App zur Konfiguration

Jeder der vier verfügbaren Kanäle kann einzeln aktiviert oder deaktiviert werden. Zudem können pro Kanal der Trigger-Wert und die Bewässerungszeit einzeln eingestellt werden. Standardmäßig ist nur der Kanal 0 mit einem Trigger-Wert von 512 und einer Zeit von 5 Sekunden aktiviert.

Weiterhin können die Intervalle zum Prüfen der Bodenfeuchtigkeit (Standard 5 Minuten) und Abfragen des DHT-Sensors (Standard eine Minute) einzeln angepasst werden.

Geänderte Einstellungen können in den EEPROM des Mikrocontrollers gespeichert werden, wodurch sie auch bei einem Neustart wieder geladen werden.

Zum Zurücksetzen der gespeicherten Einstellungen muss der EEPROM-Reset-Taster beim Start des Controllers gedrückt gehalten werden, bis die LED drei Mal kurz blinkt.

Optimale Einstellungen

Die optimalen Einstellungen sind von mehreren Faktoren abhängig und sollten einfach ausprobiert werden.

Bei mir haben sich ein Trigger-Wert von 350 und eine Bewässerungsdauer von 8 Sekunden als gut herausgestellt.

 

RadioHead Datenpakete

Die folgenden Datenpakete werden vom Bewässerungssystem gesendet beziehungsweise empfangen. Das jeweils erste Byte eines Datenpakets kennzeichnet dabei die Art.

0x00 Startmeldung

Dieses Datenpaket wird einmalig beim Start des Mikrocontrollers übertragen.

Es besteht aus nur einem Byte mit dem Wert 0x00.

0x02 Batteriestatus

Dieses Datenpaket besteht aus 4 Byte, beginnend mit dem Code 0x02, gefolgt vom Batteriestatus in Prozent (0 bis 100) und zwei Byte mit dem reinen ADC-Wert (0 bis 1023).

Beispiel: 0x02 0x4E 0x0F 0x03

Dies entspricht 78%, einem ADC-Wert von 15 + (3*256) = 783 und umgerechnet 783 * 5V / 1023 = 3,82V Batteriespannung.

0x10 Sensorwerte

Das Datenpaket für die Sensorwerte beinhaltet 9 Byte, beginnend mit dem Code 0x10. Anschließend folgen die jeweils zwei Byte großen Sensorwerte für Sensor 0 bis 3, wobei es sich um die reinen ADC-Werte handelt. Bei deaktivierten Kanälen sind die beiden Bytes auf null gesetzt.

Das Datenpaket wird nur gesendet, wenn in der Konfiguration das Senden der ADC-Werte aktiviert ist.

Beispiel: 0x10 0x51 0x01 0xC7 0x02 0x00 0x00 0x00 0x00

Für Kanal 0 wurde 0x51 0x01 übertragen, was in dezimaler Darstellung 81 und 3 entspricht. Umgerechnet ergibt dies 81 + (1*256) = 337 als ADC-Wert und 337 * 5V / 1023 = 1,647V als Spannung am Ausgang des Sensors.

0x20 Temperatur und Luftfeuchtigkeit

Dieses Datenpaket wird nach jeder Messung der Temperatur und Luftfeuchtigkeit übertragen. Es besteht aus 9 Byte: 0x20, gefolgt von 4 Byte Temperatur und 4 Byte Luftfeuchtigkeit, jeweils als Float Zahl im Little-Endian Format.

0x20 t t t t h h h h

Beispiel: 0x20 0xcd 0xcc 0xd0 0x41 0xcd 0xcc 0x4e 0x42

Dies entspricht 26,1°C und 51,7% Luftfeuchtigkeit.

0x21 Kanal ein / 0x22 Kanal aus

Bei jedem Ein- und Ausschalten (öffnen bzw. schließen des Ventils) wird für den entsprechenden Kanal dieses Datenpaket bestehend aus zwei Byte gesendet.

Beispiel: 0x21 0x00 Kanal 0 eingeschaltet; 0x22 0x01 Kanal 1 ausgeschaltet

0x50 Einstellungen

Dieses Datenpaket beinhaltet die aktuell auf dem System gesetzten Einstellungen. Es besteht aus insgesamt 22 Byte, beginnend mit 0x50.

Das zweite Byte beinhaltet die aktivierten Kanäle in den Bits 0 bis 3 sowie in Bit 7 die Einstellung, ob die Sensor-Werte gesendet werden sollen.

Die Bytes drei bis zehn beinhalten die Trigger-Werte der Kanäle 0 bis 3 mit jeweils zwei Byte.

Die Bytes 11 bis 18 beinhalten die Bewässerungszeit der Kanäle 0 bis 3 mit jeweils zwei Byte.

In Byte 19 und 20 ist das Intervall zum Prüfen der Bodenfeuchtigkeit enthalten.

Die letzten beiden Bytes 21 und 22 beinhalten das Intervall zur Abfrage des DHT-Sensors.

Beispiel: 0x50 0x83 0x5E 0x01 0x5E 0x01 0x00 0x02 0x00 0x02 0x05 0x00 0x05 0x00 0x05 0x00 0x05 0x00 0x2C 0x01 0x3C 0x00

0x51 Einstellungen lesen

Damit das Bewässerungssystem seine aktuellen Einstellungen sendet, muss ihm dieses Datenpaket von nur einem Byte mit dem Code 0x51 geschickt werden. Das System sendet daraufhin seine aktuellen Einstellungen.

0x52 Einstellungen setzen

Über dieses Datenpaket mit einer Länge von 22 Byte werden neue Einstellungen an das Bewässerungssystem gesendet. Der Aufbau des Datenpaketes ist identisch mit 0x50 Einstellungen, jedoch beginnt es mit dem Code 0x52.

Die neuen Einstellungen werden auf dem System sofort aktiv, jedoch noch nicht EEPROM gespeichert. Somit sind beispielsweise nach einem Reset wieder die alten Einstellungen aktiv.

Beispiel: 0x52 0x83 0x5E 0x01 0x5E 0x01 0x00 0x02 0x00 0x02 0x05 0x00 0x05 0x00 0x05 0x00 0x05 0x00 0x2C 0x01 0x3C 0x00

0x53 Einstellungen in den EEPROM speichern

Um die aktuellen Einstellungen des Bewässerungssystems in den EEPROM zu speichern, sodass diese auch nach einem Reset erhalten bleiben, muss dem System dieses Datenpaket von nur einem Byte mit dem Code 0x53 geschickt werden. Das System schreibt daraufhin seine aktuellen Einstellungen in seinen EEPROM.

0x60 Jetzt Prüfen

Durch ein Senden dieses Datenpaketes mit dem einen Byte 0x60 kann man das Bewässerungssystem dazu veranlassen sofort die Sensoren abzufragen und gegebenenfalls die nötigen Ventile zu öffnen. Dabei beginnt die Wartezeit bis zur nächsten automatischen Prüfung erneut zu zählen.

0x61 Kanal einschalten / 0x62 Kanal ausschalten

Durch Senden dieser jeweils zwei Byte großen Datenpakete kann man das Bewässerungssystem dazu veranlassen unabhängig von der Automatik einen Kanal einzuschalten (Ventil öffnen) beziehungsweise auszuschalten (Ventil schließen). Wird ein Kanal eingeschaltet, dann wird er automatisch nach seiner eingestellten Zeit auch wieder ausgeschaltet.

Beispiel: 0x61 0x00 Kanal 0 einschalten; 0x62 0x03 Kanal 3 ausschalten

0x63 Pause / 0x64 Fortsetzen

Zur Vermeidung von beispielsweise Ruhestörungen durch eine in der Nacht anspringende Pumpe, kann die Automatik des Bewässerungssystems über diese beiden jeweils ein Byte großen Datenpakete in einen Pause-Modus versetzt werden. Während der Pause werden die Bodenfeuchtigkeitssensoren nicht abgefragt. Sonstige Funktionen, wie beispielsweise die Temperaturmessung oder manuelle Bedienung bleiben weiterhin aktiv.

Beispiel: 0x63 Pause aktivieren; 0x64 Pause deaktivieren

0xF0 Version abrufen

Zum Abfragen der Softwareversion des Bewässerungssystems kann dem System dieses Datenpaket mit dem einen Byte 0xF0 gesendet werden. Das System sendet daraufhin seine Softwareversion.

0xF1 Version

Dieses Datenpaket beinhaltet die Softwareversion des Bewässerungssystems. Es besteht aus vier Byte, wobei das erste Byte der Code 0xF1 ist. Die Bytes zwei bis vier entsprechen in der Reihenfolge Major-, Minor- und Patch-Version.

Beispiel: 0xF1 0x01 0x00 0x02

Dies entspricht der Version 1.0.2 auf dem Bewässerungssystem.

0xF2 Ping

Über dieses Datenpaket kann ein Ping an das Bewässerungssystem gesendet werden. Es besteht aus mindestens einem Byte, beginnend mit dem Code 0xF2.

Auf einen Ping antwortet das System mit einem Pong.

Optional können dem Ping bis zu 21 Byte zusätzliche Daten mitgegeben werden. Diese Daten werden eins zu eins dem Pong angehängt.

Beispiel: 0xF2 0x13 0x37

0xF3 Pong

Dieses Datenpaket ist die Antwort auf einen Ping. Es besteht aus mindestens einem Byte, beginnend mit dem Code 0xF3.

Ein Pong hat immer dieselbe Länge wie der auslösende Ping. Die zusätzlichen Daten sind ebenfalls mit dem Ping identisch. Damit kann geprüft werden, ob zu einem Ping der richtige Pong empfangen wurde.

Beispiel: 0xF3 0x13 0x37

 

Das fertig installierte Bewässerungssystem

Das fertige Bewässerungssystem läuft nun völlig autark (bis auf die Wasserzuleitung) bei uns Zuhause im kleinen Gewächshaus im Garten.

Nach der anfänglichen Testphase, in der noch die passenden Trigger-Werte ausgetestet werden mussten sind und die Tomaten- und Paprikapflanzen immer bestens versorgt 🙂

 

Einbindung in Pimatic

In die Heimautomatisierung Pimatic kann das Bewässerungssystem recht einfach über mein Plugin pimatic-radiohead eingebunden werden. Als Hardware wird auf der Empfängerseite (Pimatic) lediglich ein Arduino Nano mit 433 MHz Funkempfänger benötigt, der als Funk-Seriell-Gateway dient.

Beispiel für ein entsprechendes RadioHeadCustomSensor-Device in der config.json von Pimatic:

 

Lizenz

Lizenziert unter GPL Version 2

Copyright (c) 2018 Peter Müller