Mädchenauge (Coreopsis)

Ferngesteuerte Pflanzen-Bewässerung mit dem Raspberry Pi

1. Einleitung

Oh, wie ich mich jeden Winter darauf freue im Frühling und Sommer auf meinem Balkon Pflanzen wachsen und gedeihen zu sehen.

Für so manche Gewächse habe ich in den letzten Jahren eine gewisse Schwäche entwickelt, wie zum Beispiel für Gemüse und Sonnenblumen.

Sonnenblumen, botanisch korrekt Helianthus annuus, sind an sich recht anspruchslose Pflanzen, die jedoch trockene Erde in heißen Sommern über längere Zeit nicht sehr gut vertragen.

Ein mit Smartphone-App gesteuerter Bewässerungs-Prototyp
Ein mit Smartphone-App gesteuerter Bewässerungs-Prototyp

Bisher bekam ich dieses Problem über meine liebenswürdige Vermieterin in den Griff, die gerne zum Gießen vorbei kam wenn ich mal für länger im Urlaub war.

Zusätzlich gab es noch eine sehr simple automatische Bewässerung auf meinem Balkon: ein kleiner Pumpenkreis gesteuert über eine Zeitschaltuhr, mit einem 10l-Eimer als Wasser-Reservoir.

Auf die Dauer waren das jedoch nur bessere Notlösungen.

Davon abgesehen dass Bekannte und Nachbarn nicht immer Zeit haben (und nicht täglich zum Gießen vorbeikommen wollen), konnte ich weder aus der Ferne feststellen wie es meinen Blumen erging und gegebenenfalls Gießmengen anpassen, noch eher ambitionierte Projekte, wie beispielsweise größere Gemüsebeete, in Angriff nehmen.

Die Quarantäne, Engpässe in Supermärkten und wahrnehmbar gesteigertes Interesse für “Home-Farming” bzw. “Home-Automation” Systeme brachten mich schließlich zur Idee eines automatischen oder teilautomatischen Bewässerungssystems für Zuhause.

Eine mögliche Realisierung eines solchen DIY Projekts beschreibe ich im folgenden Blog-Artikel.

2. Projekt Ferngesteuerte Pflanzen-Bewässerung

Startpunkt meiner Überlegung war ein Bewässerungssystem, das von weit entfernten Orten aus überwacht werden kann.

Ich wollte vom Hotelzimmer oder vom Campingplatz aus einen Blick auf meine Blumen werfen, Bodenfeuchten mit einem Sensor auslesen, und dann bei Bedarf die Bewässerung aktivieren oder gleich in ein automatisches Programm wechseln.

Architektur (schematisiert) der ferngesteuerten Bewässerung mit dem Raspberry Pi (RasPi)
Architektur (schematisiert) der ferngesteuerten Bewässerung mit dem Raspberry Pi (RasPi)

Dabei war von Anfang an das Ziel, nicht mehr wie 100 Euro auszugeben.

Für ein einigermaßen taugliches Gesamtsystem benötigte ich jedenfalls die folgende Hardware sowie mechanische Komponenten:

  • eine programmierbare Steuerung mit WLAN-Baustein
  • eine flexibel positionierbare Kamera
  • eine unempfindliche Pumpe (plus Wasser-Reservoir, Ventil, Adapter und Schläuche)
  • einen Schwimmerschalter (zum Schutz vor Trockenlauf der Pumpe)
  • zusätzliche (Selbstbau-) Elektronik incl. Gehäuse, Netzteil und Verkabelung
  • zwei (oder mehr) Bodenfeuchte-Sensoren

Dazu ist natürlich ein Internet-Router notwendig, der aber wohl mittlerweile in jedem Haushalt zu finden ist (FritzBox, Speedport, etc.).

Eine Art Sicherheitskonzept war ebenfalls wichtig, da ich mir nicht versehentlich den kompletten Balkon fluten wollte.

3. Der Raspberry Pi (RasPi)

Die programmierbare Steuerung ist die zentrale Komponente im Aufbau.

Grundsätzlich kann ein Projekt wie dieses mit diversen auf dem Markt verfügbaren Einplatinencomputern realisiert werden, die bei vielen Anbietern günstig zu haben sind.

Ich entschied mich für den Raspberry Pi 3, Modell B+ (im Weiteren RasPi genannt), nicht zuletzt wegen der guten Community Unterstützung die den Einstieg für einen Neuling enorm erleichtert (aktuell gibt es schon den RasPi 4, womit sich der Anschaffungspreis für den RasPi 3 im niedrigeren zweistelligen Euro-Bereich bewegt).

Raspberry Pi 3, Modell B+ (RasPi); am oberen Platinenrand die 40polige GPIO-Leiste, am unteren das Camera Serial Interface (CSI)
Raspberry Pi 3, Modell B+ (RasPi); am oberen Platinenrand die 40polige GPIO-Leiste, am unteren das Camera Serial Interface (CSI)

Der RasPi ist ein vollwertiger Rechner mit unixoidem Betriebssystem, der für alle erdenklichen Aufgaben einsetzbar ist.

Die entscheidende Eigenschaft des RasPi aus Projekt-Sicht sind seine leicht zugänglichen sogenannten GPIO (General Purpose Input/Output) Ports, also elektrische Ein- und Ausgänge für Steuerungs-und Regelungsaufgaben.

Die GPIO-Leiste besitzt physikalisch 40 Pins, mit einer für meine Zwecke weit ausreichender Zahl an Ports. In Summe verwende ich fünf Ports (Versorgung der Sensoren, Pumpenansteuerung und I2C-Bus), sowie einen Abgriff für +5V (für ein Relais und einen Wandlerbaustein, dazu später mehr):

  • GPIO 27 (Pin 13): Versorgung Bodenfeuchte-Sensor 1
  • GPIO 12 (Pin 32): Versorgung Bodenfeuchte-Sensor 2
  • GPIO 5 (Pin 29): Pumpenansteuerung
  • GPIO 2 (Pin 3): I2C-Bus (Datenleitung – SDA)
  • GPIO 3 (Pin 5): I2C-Bus (Taktsignal – SCL)
  • Pin 2: +5V (VBUS vom USB-Anschluss)
  • Pins für Masseanschluss

Die GPIO Ports sind im Prinzip gegeneinander austauschbar und die Wahl war mit Ausnahme der fest verdrahteten I2C-Anschlüsse willkürlich (Auswahl richtete sich vornehmlich nach maximal bequemer Erreichbarkeit durch Adapter/Buchsenleisten).

Man findet gleichfalls die erforderliche WLAN Funktionalität, eine Ethernet-Schnittstelle sowie eine Kameraschnittstelle (Camera Serial Interface) auf der Platine des RasPi.

Zudem wäre eine Messung der Außentemperatur mit einem DHT11- bzw. DHT22-Sensor, oder BMP280-Sensor (an I2C-Bus) unproblematisch und gegebenenfalls sinnvoll (z. B. Abschaltung des Systems unterhalb einer bestimmten Temperaturschwelle), auf was ich aus Kostengründen und schlechter Verfügbarkeit der Teile zum Zeitpunkt der Erstellung dieses Artikels jedoch vorerst verzichtet habe.

4. Entwicklung zusätzlicher Hardware

4.1 Vorüberlegungen

Der höchste Spannungspegel an den GPIO Ports beträgt 5V, und das Netzteil des RasPi liefert als Maximum 15 Watt.

Da ich eine relativ leistungsfähige Wasserpumpe mit 12V und 1,3A (gemessener Wert, ungefährer elektrischer Strom im Arbeitspunkt) verwenden wollte war die Idee die Pumpe irgendwie über das RasPi Netzteil (mit) zu betreiben keine Option.

Vor dem Hintergrund eine Kontrollrechnung: der Arbeitspunkt der eingesetzten Barwig Niedervolt-Tauchpumpe liegt bei Q = 12 liter/min und Δp = 0,6 bar. Die abgegebene hydraulische Leistung beträgt in diesem Punkt somit:

Phydr = (Q[l/min]*Δp[bar])/600 = (12*0,6)/600 = 0,012kW = 12W

Die aufgenommene elektrische Leistung berechnet sich mit bekannter Formel nach:

Pel = U[V]*I[A] = 12*1,3 = 15,6W

Die Differenz von Pel und Phydr ist erklärbar mit Messfehlern und Wirkungsgradverlust, wird hier aber nicht weiter thematisiert.

Man erkennt jedoch schnell anhand dieser Rechnungen, dass das RasPi Netzteil gewiss keine zusätzlichen etwa 16 Watt für eine Pumpe liefern kann.

Notwendig ist ein separates 12V-Netzteil sowie ein elektronischer Schalter zum Treiben (Einschalten) der Barwig Pumpe.

4.2 Schaltungs-Design

4.2.1 Elektronischer Schalter

Elektronische Verstärker bzw. Leistungsschalter mit Transistoren und Operationsverstärkern (OPs) können fertig als Bausatz gekauft, oder auch selbst entwickelt werden.

Ich entschied mich für den Selbstbau mit einem OP-IC (LM324) betrieben als sog. Schmitt-Komparator, also ein Vergleicher mit Hysterese. Die Hysterese verleiht dem Aufbau eine zusätzliche Robustheit, die Breite derselben ist aber nicht so kriegsentscheidend (mit den hier gewählten Widerstandswerten R7=10kOhm und R8=1kOhm ergibt sich ca. 1,1V).

Der LM324, der praktischerweise die gleiche Energiequelle wie die Tauchpumpe nutzt da die Versorgungsspannung nicht symmetrisch sein muss (“Single Supply OP Amp”), weist wie alle Operationsverstärker einen nahezu unendlich hohen Eingangswiderstand auf. Daher ist es problemlos möglich einen GPIO Output mit einem OP Eingang zu betreiben da die Eingangsströme nahezu Null Ampere betragen.

Pumpenansteuerung über OP und MOSFET (Anmerkung: Widerstandswerte R1-R6 verworfene Experimentiergrößen)
Pumpenansteuerung über OP und MOSFET (Anmerkung: Widerstandswerte R1-R6 verworfene Experimentiergrößen)

Schaltungsprinzip: ein Low-Pegel (0,0V) am GPIO port (hier port 5), welcher mit dem invertierenden Eingang des OPs (hier Pin 2) verdrahtet ist, aktiviert die Pumpe.

Der Ausgang des OPs schaltet bei Low-Pegel an diesem Eingang einen Feldeffekt-Transistor durch (der Ausgang führt nun 12V: genug um einen IRF530 n-Kanal MOSFET1 niederohmig zu schalten2), über dessen Drain-Source Strecke dann der eigentliche Pumpenstrom fließt.

Wechselt man auf High-Pegel (3,3V) am GPIO port, verbleibt die Pumpe im ausgeschalteten Zustand (Drain-Source Strecke hochohmig, da OP-Ausgang und damit Gate-Source Spannung nahe 0,0V).

1 es handelt sich hier um einen Anreicherungstyp (“enhancement mode”), also einen selbstsperrenden MOSFET der bei 0V am Gate keinen Strom leitet

2 auch wenn es vielleicht naheliegend erscheint: ein direktes Ansteuern der Pumpe mit diesen 12V ist nicht möglich da der OP-Ausgang nur Strom im Milliampere-Bereich bereitstellen kann; der IRF530 verträgt dauerhaft mehr als 10A

4.2.2 Simulation

Mit einem Tool wie MapleSim oder LTspice kann eine OP Schaltung wie aus Abschnitt 4.2.1 auch leicht simuliert und auf Designschwächen hin untersucht werden.

4.2.3 Hardware-Sicherheitskonzept

Neben den beschriebenen Bauteilen spendierte ich dem Aufbau, welche den RasPi und die Pumpeneinheit voneinander an sich schon entkoppelt, noch ein mit GPIO Pin 2 verbundenes 5V-Relais.

Wird das RasPi-Netzteil (versehentlich) abgesteckt oder gibt es anderweitig ein Spannungsproblem auf dem Rechner-Board, dann soll eine Trennung der IC-Versorgungsspannungsleitung erfolgen um einen unkontrollierten Lauf der Pumpe (Auswirkung von “undefinierten” Spannungspegeln an den GPIO Ports) möglichst zu verhindern.

Ein noch in Reihe geschalteter Schwimmerschalter (z. B. PNS-55/10W) trennt den IC ebenfalls von der Versorgungsspannung. Dieser ist somit genauso Bestandteil meines Sicherheitskonzepts, wenngleich er in erster Linie die Pumpe vor Trockenlauf schützt.

Natürlich deckt mein Sicherheitskonzept nicht jede erdenkliche Fehlfunktion ab. Zum Beispiel führt ein Kurzschluss am MOSFET zwangsläufig zum Lauf der Pumpe, dies wird nicht unterbunden.
Hier muss man für sein eigenes Projekt abwägen ob ein Restrisiko akzeptabel ist; ein Szenario mit hartem Außeneinsatz und viel feuchter Wärme stellt andere Anforderungen als z. B. der Zimmerbetrieb.

Prinzipiell könnte man den zweiten Relaisschalter nutzen um die Pumpe zu trennen. Hier befindet man sich allerdings schon nahe der Grenze des erlaubten Schaltstromes (2A max. Schaltstrom lt. Datenblatt), ein kurzer Peak im Strom birgt das Risiko von Beschädigungen am Relais.

4.3 Evolution der Platinen

Für gewöhnlich startet der Entwickler bei einem neuen Elektronikprojekt mit ad-hoc Aufbauten auf Steckboards oder Lochrasterplatinen. Gelangt er irgendwann zu einem lohnenden Schaltungskonzept wechselt er normalerweise rasch auf ein Printed Circuit Board (PCB) das einschlägige Hersteller für Cent-Beträge fertigen können.

Links und Mitte: provisorische Versuchsaufbauten (
Links und Mitte: provisorische Versuchsaufbauten (“Evaluation Boards”) auf Lochrasterplatinen. Rechts: bestücktes PCB (vorläufiges Layout; vorgehalten eine zweite Verstärkerschaltung die hier jedoch unbestückt bleibt)

Ein Tool für die Erstellung digitaler Schaltpläne und Boards ist beispielsweise Autodesk EAGLE.

Das PCB, in welches Bauelemente ohne Verdrahtung nur noch einzulöten sind, sind nicht nur ästhetisch anzusehen sondern bietet unter Anderem auch gute mechanische Eigenschaften und Beständigkeit gegen Umwelteinflüsse (auch sind Mess- und Testergebnisse grundsätzlich besser reproduzierbar).

Etwas nachteilig ist jedoch, dass die Bauelemente aufgrund Durchkontaktierungen mit gewöhnlichen Mitteln kaum mehr auslötbar sind (bei den hier nicht verwendeten SMD-Bauteilen ist das nicht der Fall).

5. Bodenfeuchte-Sensoren

5.1 Einführung

Auch die Bodenfeuchte-Sensorik könnte man mit wenig Zeitaufwand selbst entwickeln, was sich aufgrund geringer Preise für die erhältlichen Typen jedoch eher nicht lohnt.

Meine Entscheidung fiel nach kurzer Überlegung auf die resistiven Iduino ME110, Bodenfeuchte-Sensoren ursprünglich entwickelt für die Arduino Produktfamilie (in Abschnitt 10 findet sich das Datenblatt; der Arduino wäre im Übrigen eine im Prinzip gleichwertige Alternative zum RasPi gewesen).

Fabrikneuer Bodenfeuchte-Sensor Iduino ME110 incl. Verkabelung (in ESD-Schutzhülle)
Fabrikneuer Bodenfeuchte-Sensor Iduino ME110 incl. Verkabelung (in ESD-Schutzhülle)

Resistiv bedeutet, dass diese Sensoren den elektrischen Widerstand des feuchten Bodens messen.

Der Aufbau der ME110 ist einem Reverse Engineering problemlos zugänglich: neben den beiden metallbeschichteten Fühlern die man in die Erde steckt finden sich nur ein paar SMD-Bauteile auf der Platine.

Diese bilden eine einfache Verstärkerschaltung mit Bipolartransistor, in welcher die feuchte Erde Bestandteil des Basiswiderstandes ist (R1 dient dabei nur als Schutz bzw. Strombegrenzung).

Bodenfeuchte-Sensor: Schaltplan (schematisch)
Bodenfeuchte-Sensor Iduino ME110: Schaltplan (schematisch); Codierung der SMD-Widerstände R1/R2: 101 (d.h. 10*10^1 = 100 Ohm)

Insgesamt sind drei Anschlüsse an eine Stiftleiste geführt: Versorgungsspannung (+), Ausgangssignal (S) sowie Masse ().

5.2 Physikalisches Verhalten

5.2.1 Sensor im geschlossenen Regelkreis

5.2.1.1 Regelstrecke feuchte Erde

Will man später eine zuverlässige und robuste Bodenfeuchte-Regelung passend zur Pflanzenart entwickeln (also eine Automatik, keine einfache Steuerung) ist die Kenntnis der Physik des Sensors, wie auch die der Regelstrecke wichtig.

Häufig sind in der Praxis Regelstrecken so genannte PT1-Glieder (Verzögerungsglieder erster Ordnung).

Über eine Sprungantwort, dem Standard-Prüfsignal der Regelungstechnik, wird dieses Verhalten auch für die Regelstrecke feuchte Erde schnell ersichtlich.

Sprungantwort der Regelstrecke (Regelgröße ME110-Sensorwert), zu erkennen der charakteristische PT1-Glied Signalverlauf (blau)
Sprungantwort der Regelstrecke (Regelgröße ME110-Sensorwert), zu erkennen der charakteristische PT1-Glied Signalverlauf (blau)

Man gibt dazu einen Sprung auf die Regelstrecke (hier: Bewässern mit voll geöffnetem Ventil) und tastet gleichzeitig die Regelgröße (hier: Sensorwert bei durchnässter Erde) in ausreichend kurzen Zeitabständen ab.

Als Regler für eine PT1-Strecke grundsätzlich gut geeignet ist ein PI-Typ (Proportional-Integral), ggf. auch ein einfacherer P-Typ (s. a. Abschnitt 10.3 mit einem Einführungsvideo in die Regelungstechnik).

Da der RasPi an seinen GPIOs PWM-Funktionalität (Pulsweitenmodulation) bereitstellt bietet sich die Benutzung derselben als Stellgröße in einem geschlossenen Regelkreis an: die Leistung der Tauchpumpe ließe sich unproblematisch über eine (Hardware wie Software) PWM variieren.

5.2.1.2 Regelkreis für Sonnenblumen

Bei nicht so empfindlichen Pflanzen kann eine Regelung auch sehr rudimentär konzipiert sein: der Feuchtegrad des Bodens wird zyklisch in festgelegten Intervallen (etwa fünf Minuten oder auch länger) abgefragt.

Ist ein Schwellwert unterschritten wird für einige Sekunden “undosiert” (Pumpe volle Leistung, offenes Ventil) bewässert da eine geringe Überwässerung zunächst einmal unkritisch ist. Kontinuierlich erfolgen anschließend weitere zyklischen Abfragen.

Ein Plausibilitätscheck sollte bei einer solcherart gestalteten Regelung dafür sorgen, dass sich die Bewässerung nach einer festgelegten Anzahl an Bewässerungszyklen ohne Effekt (bei zum Beispiel: Sensor gezogen, Schwimmerschalter ausgelöst etc.) selbst deaktiviert.

Das geschilderte Regelprinzip ist einer sogenannten Zweipunktregelung nicht unähnlich.

5.2.2 Resistive Bodenfeuchte-Sensoren

Wie weiter oben gezeigt sind die Iduino ME110 Bodenfeuchte-Sensoren im Grunde simple Widerstands-Messgeräte.

Feuchte Erde hat einen geringeren ohmschen Widerstand wie trockene. Zur Messung wird ein elektrischer Strom durch die Erde geleitet, und aus dessen Höhe ein Ausgangssignal generiert (Ohmsches Gesetz: I = U/R).

Beginnende elektrolytische Zersetzung (roter Pfeil) an der Messfühler-Anode
Beginnende elektrolytische Zersetzung (roter Pfeil) an der Messfühler-Anode

Diese Methode hat eine Reihe entscheidender Nachteile:

  • elektrolytische Vorgänge zersetzen die Elektroden (genauer: eine Elektrode) und machen den Sensor nach einer bestimmten Zeit unbrauchbar
  • die entstehenden Reaktionsprodukte schädigen unter Umständen die Pflanzenwurzeln
  • unvermeidbare elektrische Verlustleistung während der Messung (Pel = U*I)

Auch typische Störgrößen wie Temperaturschwankungen können das Ausgangssignal bei diesem Sensortyp in unerwünschter Weise und teilweise drastisch verändern (auch ist ganz allgemein eine schwankende Versorgungsspannung natürlich ein Problem).

Und tatsächlich ergaben Langzeitmessungen im Außenbereich ein betragsmäßiges Delta von etwa 1% pro 1°C, also Differenzen von grob 10% Bodenfeuchtigkeitswert zwischen einer Tag- und einer Nachtmessung bei ansonsten gleichem Feuchte-Niveau.

24h-Messung an zwei ME110 ohne Bewässerungsvorgang; Tmax (6°C) bei x=1, Tmin (-6°C) bei x=21
24h-Messung an zwei ME110 ohne Bewässerungsvorgang; Tmax (+6°C) bei x=1, Tmin (-6°C) bei x=21

Es gibt nun zwei Möglichkeiten für den Entwickler:

Er steigt entweder um auf die in Entwicklerkreisen populären kapazitiven Sensoren (diese ermitteln die sich verändernde Permittivitätszahl des Bodens), oder er minimiert das Problem mit einer klugen Kombination aus Programmcode und Schaltungstechnik3.

Ich werde in Abschnitt 7 eine programmtechnische Lösung mit Python aufzeigen, mit Nutzung zweier zusätzlicher GPIO Ports.

Resistive Sensoren haben allerdings durchaus ihre Daseinsberechtigung. Die wesentlichen Vorteile sind:

  • geringste Preise sowie gute Verfügbarkeit
  • kurze Ansprechzeiten (d.h. schnelle Reaktionszeit)
  • aufgrund des simplen Aufbaus robust (kein Oszillator, IC u. dgl.)

3 der Vollständigkeit halber sei hier erwähnt, dass z.B. ein Schaltungs-Design mit einem Rechteckoszillator, der den Stromfluss am Sensor zyklisch umpolt, Abhilfe bzgl. der elektrolytischen Zersetzung schaffen kann

5.3 Verbindung zum Raspberry Pi

5.3.1 Analog-Digital-Wandler (ADC)

Der RasPi verfügt leider nicht über einen implementierten Analog-Digital-Wandler (auch AD-Umsetzer oder schlicht ADC genannt).

Daher kann er mit den Spannungs-Rohwerten an den Sensor-Ausgängen (im Bereich 0V – 1,7V, wird der ME110 Sensor mit 3,3V betrieben) zunächst wenig anfangen. GPIO Ports konfiguriert als Input verstehen nur die beiden Zustände High (logisch 1) oder Low (logisch 0).

Die Anschaffung von zusätzlicher Elektronik ist also notwendig.

Elektronik incl. ADC (kleine dunkelblaue Platine); Bastelaufbau mit zusätzlichem Abgriff für den ADC-Eingang A3 (elektrische Überwachung, helles gelbes Kabel); Sensor-Ausgangssignale an grün-weissen Kabeln
Elektronik incl. ADC (kleine dunkelblaue Platine); Bastelaufbau mit zusätzlichem Abgriff für den ADC-Eingang A3 (elektrische Überwachung, helles gelbes Kabel); Sensor-Ausgangssignale an grün-weißen Kabeln

Die Auswahl eines AD-Wandlers bereitet eigentlich wenig Schwierigkeiten, da der Anwendungsfall weder hohe Anforderungen an Wandlungs- oder Latenzzeit stellt noch eine sonderlich hohe Auflösung erfordert.

Ich entschied mich für einen (hier wohl etwas überdimensionierten) um sieben Euro teuren 16bit ADS1115 Wandler mit vier Analogeingängen (A0A3), der mittels I2C-Bus (Anschlüsse SDA und SCL) mit dem RasPi (GPIO 2 und GPIO 3) interagiert (in Abschnitt 10 finden sich die Datenblätter).

Da ich vorerst nur zwei Sensoren und somit die Eingänge A0 und A1 benutze, stehen die Eingänge A2 und A3 zum Einlesen anderer Messwerte als der Bodenfeuchte zur Verfügung (zum Beispiel könnte ein Shunt den Pumpenstrom erfassen).

Neben den Ein- und Ausgängen ist natürlich auch der Anschluss einer Versorgungsspannung inklusive Masse nötig (VDD und GND). Dies können die vom RasPi durchgeschliffenen 5V sein4.

Der ADDR-Eingang und der ALRT-Ausgang bleiben hier offen.

4 solange ein I2C-Slave die an den “Pull-Up”-Widerständen anliegenden 3,3V Pegel (vgl. RasPi-Schaltplan, Widerstände R23 und R24) sicher als logisch High erkennt kann man das schaltungstechnisch so machen (I2C-Slave Open-Drain-Ausgänge können die Busleitung nicht aktiv nach High schalten); man sollte in diesem Fall nur sicherstellen dass Slaves auf ihren Platinen nicht eigene Pull-Up-Widerstände mitbringen

5.3.2 Einrichtung des ADC im System

Im Folgenden nur ein kurzer Überblick der nicht jede und ggf. auch nicht mehr notwendige Vorarbeit mit einschließt, wie z. B. die Installation von “Adafruit-Blinka”.

Ausführliche Anleitungen zur Einrichtung eines AD-Wandlers auf dem RasPi sind in Abschnitt 10, wie auch leicht per Suchmaschine zu finden.

5.3.2.1 Vorgehen

Installation der ADC Bibliotheken per Kommandozeile (mit dem offiziellen Paketmanager pip3; Python-Bibliotheken haben die Form eines Pakets):

$ sudo pip3 install adafruit-circuitpython-ads1x15

Einbinden der ADC und I2C Module im Kopf des Scriptes:

Codeschnipsel #1

(…)
import board
import busio
import adafruit_ads1x15.ads1115 as ADS
from adafruit_ads1x15.analog_in import AnalogIn
# Create the I2C bus
i2c = busio.I2C(board.SCL, board.SDA)
# Create the ADC object using the I2C bus
ads = ADS.ADS1115(i2c)
(…)

Hinweis: Bibliotheken (auf die sämtliche Python-Programme zugreifen) befinden sich normalerweise in folgendem Verzeichnis:

/usr/local/lib/python3.7/dist-packages/

Man sollte nicht vergessen die I2C-Funktion via RasPi-Config zu aktivieren:

$ sudo raspi-config

Anzeige aller angeschlossenen I2C-Geräte über den folgenden Befehl:

$ i2cdetect -y 1

Der ADC hat ab Werk die I2C-Adresse 0x48 (Hinweis: Option [-y] deaktiviert den interaktiven Modus).

6. Fernsteuerung via App

6.1 WLAN

Das erste Glied der drahtlosen Kommunikationskette ist das WLAN.

Da ich einen Raspberry Pi 3, Modell B+ für mein Bewässerungssystem verwende musste ich mir um die Einrichtung des WLAN jedoch nicht allzu viele Gedanken machen.

Übersicht der aktiven Heimnetzwerk-Teilnehmer in den Router-Einstellungen (hier Speedport W724V)
Übersicht der aktiven Heimnetzwerk-Teilnehmer in den Router-Einstellungen (hier Speedport W724V)

Jeder RasPi ab Version 3 besitzt integriertes WLAN. Beim ersten Hochfahren sollte lediglich der Netzwerkschlüssel zur Hand sein, die weitere Einrichtung erfolgt automatisch.

Ich arbeite im Folgenden mit einer statischen lokalen IP-Adresse. Diese Adresse ist in folgender Textdatei auf dem RasPi fixiert:

/etc/dhcpcd.conf

Einträge (Auszug) in der Datei dhcpcd.conf
Einträge (Auszug) in der Datei dhcpcd.conf

DHCP-Einstellungen am Router sind daher an der Stelle bedeutungslos.

6.2 VPN

Zur Etablierung einer VPN-Verbindung sind zunächst einige Modifikationen am Router unumgänglich.

6.2.1 Router-Einstellungen

Es gibt die unterschiedlichsten Router auf dem Markt. Je nach Modell kann der Benutzer mehr oder weniger einfach Anpassungen in den Einstellungen vornehmen.

Da sich Einstellmöglichkeiten und Menüführung mitunter stark unterscheiden und die Thematik umfangreich ist werde ich im Folgenden nicht sehr tief ins Detail gehen (ich verwende bei mir zu Hause einen schon etwas in die Jahre gekommenen Speedport W724V).

Auf jeden Fall ist eine Portweiterleitung (port forwarding) auf dem Router einzurichten (genutzt wird UDP port 1194; würde man etwa einen Webserver auf dem RasPi betreiben wollen wäre auf Port 80, d. h. HTTP weiterzuleiten).

Allgemein sollte DHCP aktiv bleiben da sonst u. U. andere Netzwerkteilnehmer nicht mehr wie gewohnt funktionieren. Bei Verwendung einer statischen IP-Adresse gemäß Abschnitt 6.1 muss man sich mit diesem Punkt eigentlich nicht näher befassen.

Konfiguration der Portweiterleitung für das VPN (letztlich genutzt wird UDP port 1194)
Konfiguration der Portweiterleitung für das VPN (letztlich genutzt wird UDP port 1194)

Es gilt zu beachten, dass die meisten Router bzw. Anschlüsse selbst keine statische IP-Adresse nach außen haben (öffentliche WAN-IP, diese ist streng zu unterscheiden von lokalen bzw. privaten IP(v4)-Adressen im Heimnetzwerk).

Jede Neuzuweisung einer IP-Adresse durch den ISP (bei meinem Anschluss passiert das u. A. beim Aus- und wieder Einschalten des Gerätes) hat zur Folge dass der Nutzer Anpassungen im VPN-Zertifikat vornehmen muss.

Umgehen könnte man das mit einem (zumeist kostenpflichtigen) DDNS-Dienst. Ein solcher Dienst kann einen frei zu wählenden Domain-Namen sich dynamisch ändernden IP-Adressen zuordnen, die der Nutzer dann nicht mehr zu kennen braucht.

Konfigurationsbildschirm für das (optionale) DynDNS
Konfigurationsbildschirm für das (optionale) DynDNS

6.2.2 Softwareinstallation auf dem RasPi

Natürlich reichen Modifikationen am Router für sich alleine noch nicht aus.

Auch dem RasPi selbst muss man VPN beibringen. Wie man im System einen VPN-Server einrichtet, ist zum Beispiel hier gut und ausführlich beschrieben.

Nach erfolgreicher Installation kann der Nutzer über Shell-Kommandos5 ein Benutzerprofil anlegen und ein Zertifikat in Form einer .ovpn-Datei erzeugen (enthält u. A. den VPN-Schlüssel, die IP-Adresse des Routers und den UDP/TCP port), welches er anschließend auf sein Android Smartphone überträgt und in die VPN-App einliest.

5 eine Shell interpretiert Befehle via Kommandozeile, eine SSH-Shell ist eine Art “entfernter” Kommandozeilenzugriff über ein gesichertes Protokoll

6.3 Smartphone-Applikationen

Nach der oben beschriebenen Vorarbeit kann man nun zwei Smartphone-Applikationen installieren: eine App zum Aufbau der VPN-Verbindung, eine weitere für den System-Zugriff via SSH-Shell (ggf. zusätzliche Apps rein für Monitoring-Zwecke).

Ist die VPN-Verbindung etabliert ist es für den Anwender möglich über z. B. die App “RaspController” Python-Code auf der Shell auszuführen (siehe auch obiger screenshot):

$ cd /meinPfad/code
$ python3 meinProgramm.py

Das Python-Programm kann auch als Hintergrund-Prozess laufen6 (Ampersand & am Ende der Zeile):

$ cd /meinPfad/code
$ nohup python3 meinProgramm.py &

Am einfachsten ist es wohl aus solchen Befehlen ein Shell-Script zu kreieren, was dann nur noch die Eingabe des Shell-Script Namens auf der Kommandozeile erfordert7:

$ ./meinShellscript

Mit ./ wird das aktuelle Verzeichnis verwendet. In ein Shell-Script lassen sich leicht zusätzliche Software-Sicherheitsmechanismen, wie beispielsweise ein GPIO port Initialisierungs-Script, implementieren.

SSH-Shell (innerhalb der App "RaspController") und Ausführung eines Shell-Scripts, das selbst wiederum das python-Programm aufruft
SSH-Shell (innerhalb der App “RaspController”) und (zweimalige) Ausführung eines Shell-Scripts, das selbst wiederum das Python-Programm aufruft

einen über nohup geschützten Prozess beendet man mit dem Befehl kill <PID> (SIGTERM). Anzeige der Prozessliste mit allen PIDs über die Anweisung ps -e

gilt insbesondere dann wenn man die Umgebungsvariable PATH mit dem entsprechenden Verzeichnis erweitert

7. Python-Beispiele

Im Folgenden führe ich einige (wohl eher “quick&dirty”) Beispiele und Codeschnipsel auf, die für eigene Projekte generisch verwendbar sind.

Getestete Codesequenzen finden sich auch in meinem Github-Repository (wird fortlaufend erweitert).

Selbstverständlich kann man für die Programmentwicklung auch eine andere Sprache als das bei Anfängern beliebte Python nutzen.

7.1 Vorbedingungen

Der weiter unten wiedergegebene Code ist nur fehlerfrei ausführbar mit folgenden Modul-Importen (siehe auch Abschnitt 5):

Codeschnipsel #2

(…)
import RPi.GPIO as GPIO
import datetime
import time
(…)

7.2 Aktivieren der Pflanzen-Bewässerung

In diesem Codebeispiel wird GPIO 5 (Pin 29, verdrahtet mit dem invertierenden OP-Eingang) auf Low-Pegel gesetzt.

Während der Bewässerung erfolgt eine Ausgabe auf der Kommandozeile. Die Tastenkombination CTRL+C unterbricht die while-Schleife (Befehl KeyboardInterrupt).

Codeschnipsel #3

(…)
GPIO.setmode(GPIO.BCM)
GPIO.setup(5, GPIO.OUT)
(…)
s=0.0
wartezeit=1.0
(…)
print("Program will activate driver for", bewZeit, "seconds")
GPIO.output(5, GPIO.LOW)
print("Driver set (Pin 29 on 0.0V)")
try:
  while s<bewZeit:
    time.sleep(wartezeit)
    s+=wartezeit
    print("Time elapsed:", s, "sec")
except KeyboardInterrupt:
  print("Interrupted!")
GPIO.output(5, GPIO.HIGH)
print("Driver reset (Pin 29 on 3.3V)")
(…)

7.3 Auslesen der Bodenfeuchte-Sensoren

Die resistiven ME110 Sensoren hängen nicht unmittelbar an einer Spannungsquelle, die GPIO Ports schalten diese aktiv8. Einlesen der Sensorspannung durch den AD-Wandler und anschließende Umrechnung9 erfolgen synchron.

Diese “on-demand” Zuschaltung verhindert bzw. verlangsamt die korrosive Zersetzung der Sensor-Elektroden (Elektrolyse) aufgrund Dauerstroms durch die Erde.

Codeschnipsel #4

(…)
def moisture_percent (a):
  b = (a/1.7)*100
  return b
(…)
# Bodenfeuchte-Sensor 1
GPIO.setup(27, GPIO.OUT)
GPIO.output(27, GPIO.HIGH)
time.sleep(1)
chan0 = AnalogIn(ads, ADS.P0)
voltage0 = chan0.voltage
print("Moisture Sensor 1 reads (raw value): ","{:>2.4f}".format(voltage0), "V")
moistureLevel_1 = moisture_percent(voltage0)
print("Moisture Level 1: ","{:>3.2f}".format(moistureLevel_1), "%")
time.sleep(1)
GPIO.output(27, GPIO.LOW)
(…)
# Bodenfeuchte-Sensor 2
GPIO.setup(12, GPIO.OUT)
GPIO.output(12, GPIO.HIGH)
time.sleep(1)
chan1 = AnalogIn(ads, ADS.P1)
voltage1 = chan1.voltage
print("Moisture Sensor 2 reads (raw value): ","{:>2.4f}".format(voltage1), "V")
moistureLevel_2 = moisture_percent(voltage1)
print("Moisture Level 2: ","{:>3.2f}".format(moistureLevel_2), "%")
time.sleep(1)
GPIO.output(12, GPIO.LOW)
(…)

8 generell ist es nicht zu empfehlen, Komponenten direkt über die GPIO Ports zu versorgen (diese Aussage gilt grundsätzlich nicht für die zwei 5V-Anschlüsse, diese hängen an USB VBUS); da der Strom durch die Sensoren allerdings äußerst gering ist (wenige mA), ist die beschriebene technische Umsetzung nicht problematisch

9 verwendet man mehrere def-Blöcke, so wäre es guter Programmierstil diese in ein eigenes .py-File auszulagern und jenes über den import-Befehl einzubinden. Der Zugriff auf die Funktionen erfolgt dann über die übliche Punktnotation

7.4 Erzeugen eines logfiles

Praktisch für ein automatisches Bewässerungs-Programm das nichts auf der Kommandozeile ausgibt (zum Beispiel wenn das Programm als Hintergrundprozess ausgeführt wird).

Man könnte Daten, sobald sie umfangreicher und graphisch aufzubereiten sind, auch gleich mit entsprechenden Befehlen in ein Spreadsheet schreiben (“xlsxwriter”-Modul).

Codeschnipsel #5

(…)
file = open("logfile_0815.txt", "w")
file.write("--- Logfile Start ---\n\n")
(…)
file.write("Speicherzeit dieses Logfiles:\n")
file.write("{:%d.%m.%Y %H:%M:%S}".format(datetime.datetime.now()))
file.write("\n")
(…)
file.write("Eingangsspannung:\n")
file.write("{:>2.3f}".format(InputVoltage))
file.write("V")
file.write("\n")
(…)
file.write("Bodenfeuchte (Sensor 1):\n")
file.write(str(int(moistureLevel_1)))
file.write("%")
file.write("\n")
(…)
file.write("--- Logfile Ende ---")
file.close()

(…)

8. Prototypen

Erste Prototypen sind in den folgenden zwei kurzen Videosequenzen zu sehen.

Dort wird auch der, in diesem frühen Entwicklungsstadium noch rudimentäre, hydraulische Aufbau ersichtlich (dieser besteht aus einem Kugelhahn incl. Adapter, einem Kunststoff-Schlauchverbinder und etwa drei Metern Kunststoff-Schlauch).

8.1 Früher Prototyp ohne Sensoren

Als zusätzliche Elektronik verwende ich hier lediglich einen einfachen elektronischen EIN/AUS-Schalter (mit Operationsverstärker µA 741).

8.2 Fortgeschrittener Prototyp mit Sensor und Kamera

Dieser Aufbau ist bereits mit mehreren Sicherheitsmechanismen versehen (5V-Relais, Schwimmerschalter).

8.3 Weitere Prototypen

Ein aktueller Prototypen-Stand ist auf meiner Projektseite auf hackaday.io zu finden.

Da die Kommentarfunktion auf diesem Blog bis auf Weiteres deaktiviert ist, bitte ich auf jener Seite um Fragen und Kommentare.

9. Zusammenfassung und Ausblick

Im Artikel wurden einige Ideen zu einer ferngesteuerten Pflanzen-Bewässerung mit dem Raspberry Pi thematisiert und erfolgreich in die Praxis umgesetzt.

Es ist offensichtlich, dass die zahllosen Möglichkeiten die Hardware und insbesondere Software bieten nur zu einem geringen Maß ausgeschöpft sind.

Zum Beispiel ist die Verwendung von MQTT (“Message Queuing Telemetry Transport”, ein simples Protokoll zur Übertragung von Messdaten), Python-GUIs oder auch eigens entwickelten Smartphone-Apps denkbar, welche Kommandos auf der SSH-Shell ersetzen und die Bedienung insgesamt komfortabler machen.

Über eine API wären Wetterdaten verfügbar, und separate Sensorik könnte die lokale Temperatur oder auch Luftfeuchte erfassen.

Regelkreise für eine komplett automatisierte Bewässerung passend zur Pflanzenart kann der geneigte Programmierer von Grund auf entwickeln und schrittweise verbessern.

Elektronik-Design und das hydraulische Netzwerk sind von einem Verbesserungsprozess gleichfalls nicht ausgenommen (Ultraschall-Füllstandsmessung, Ventilumschaltung, Durchflussmessung etc.).

10. Weiterführende Informationen

10.1 Elementare Elektronik

10.1.1 Elektronik-Anbieter

Pollin Electronic

Conrad Elektronik

Reichelt Elektronik

10.1.2 PCB-Hersteller

JLCPCB PCB Prototypes

PCBWAY PCB Prototypes

10.1.3 Schaltplan und Board-Design

EAGLE Light, Version 9.6.2

MapleSim Testversion

10.1.4 Datenblätter

Raspberry Pi Schaltpläne

LM324 Operationsverstärker

IRF530 Feldeffekt-Transistor

Iduino ME110 Bodenfeuchte-Sensor

5V DIL Miniaturrelais

10.2 Konfiguration des Gesamtsystems

10.2.1 Raspberry Pi

Raspberry Pi 4 – Ersteinrichtung für Einsteiger

Raspberry Pi Documentation

10.2.2.1 Einrichtung und Datenblatt

Adafruit 4-Channel ADC Breakouts: Python

Datenblatt ADC

10.2.2.2 Technisches Prinzip

ADS1115 Delta-Sigma ADC

Delta-Sigma ADC (Wertetabelle)

10.2.3 Einrichtung des VPN

PiVPN installiert OpenVPN auf dem Raspberry Pi

Was ist Dynamisches DNS (DynDNS)

10.3 Sonstiges

Einführung in die Regelungstechnik (englisch)

hackaday.io Projekte des Autors (englisch)

10.4 Literatur

1. Shell Programmierung – Jürgen Wolf, Galileo Computing; ISBN 978-3-8362-1650-0 (3. Auflage)

2. Taschenbuch der Regelungstechnik – Lutz/Wendt, Verlag Harri Deutsch; ISBN 978-3-8171-1895-3 (9. Auflage)

3. Mikroprozessortechnik – Klaus Wüst, Vieweg+Teubner; ISBN 978-3-8348-0906-3 (4. Auflage)