Mädchenauge (Coreopsis)

Practical Engineering 1: Ferngesteuerte Pflanzen-Bewässerung mit dem RasPi (deutsch)

1. Einleitung

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

Für so manches Gewächs habe ich in den letzten Jahren eine besondere 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 überhaupt nicht gut vertragen.

Ein über das Smartphone gesteuerter Prototyp zur Pflanzen-Bewässerung
Ein über das Smartphone 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 hatte ich noch eine simple automatische Bewässerung auf meinem Balkon installiert: 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 der ferngesteuerten Bewässerung mit dem Raspberry Pi (RasPi)
Architektur 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 sehr 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 voll lauffähiger Rechner mit Linux-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 zum Beispiel 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).

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

Zudem wäre eine Messung der Außentemperatur über die GPIO ports (DHT11-Sensor) oder den I2C-Bus (BMP280-Sensor) unproblematisch und ggf. sinnvoll (z. B. Abschaltung des Systems unterhalb einer bestimmten Temperaturschwelle), auf was ich aus Kosten- und Zeitgründen jedoch vorerst verzichtet habe.

4. Entwicklung der Hardware

4.1 Vorüberlegungen

Die höchste Spannung an den GPIO ports beträgt 5V, und das Netzteil des RasPi liefert als Maximum 15W.

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 meiner 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 = 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 16W für eine Pumpe bereitstellen kann.

Man benötigt ein separates Netzteil (für die barwig Pumpe eines mit 12V), sowie einen elektronischen Schalter zum Treiben (Einschalten) der Pumpe.

4.2 Schaltungs-Design

4.2.1 Elektronischer Schalter

Elektronische Verstärker bzw. EIN/AUS-Schalter mit Transistoren oder 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 gewisse (zusätzliche) Robustheit, die Breite derselben ist aber nicht so kriegsentscheidend (mit den hier gewählten Widerstandswerten R7=10kOhm und R8=1kOhm ergibt sich 1,1V).

Der LM324, der seine Versorgungsspannung über das gleiche Netzteil wie die Tauchpumpe bezieht, weist (wie alle OPs) als charakteristische Eigenschaft einen nahezu unendlich hohen Eingangswiderstand auf. Daher ist der Betrieb an einem GPIO Pin vollkommen unproblematisch.

Das mit EAGLE erstellte vorläufige PCB Layout
Das mit EAGLE erstellte vorläufige PCB Layout; Klemmleiste: Anschluss 1, 5 – Masse; Anschluss 2 – Pumpe (zum MOSFET Drain-Anschluss); Anschluss 3 – 12V (zum Relais); Anschluss 4 – GPIO 5 (zum invertierenden OP-Eingang); Anschluss 6 – 5V (zur Relaisspule); vorgehalten eine zweite Verstärkerschaltung die hier jedoch unbestückt bleibt

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.

Pumpenansteuerung über OP und MOSFET
Pumpenansteuerung über OP und MOSFET (Anmerkung: Widerstandswerte R1-R6 dienten nur als experimentelle Größen in meinen Versuchsaufbauten)

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

In Summe ist die Platine somit besagte Komparatorschaltung (welche die RasPi Spannung invertiert auf ein höheres Niveau umsetzt) mit angebundenem Pumpen EIN/AUS-Schalter.

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 Hardware-Sicherheitskonzept

Neben den beschriebenen Bauteilen spendierte ich der Schaltung, 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 in Reihe geschalteter Schwimmerschalter (z. B. PNS-55/10W) trennt den IC ebenfalls von der Versorgungsspannung. Dieser ist somit genauso Bestandteil meines Sicherheitskonzepts, obgleich 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 abwägen ob ein Restrisiko akzeptabel, oder das Konzept zu verbessern ist (z. B. Szenario mit hartem Außeneinsatz und viel feuchter Wärme u. dgl.).

4.3 Evolution der Platinen

Wie bei jedem Elektronik-Projekt startet der Entwickler für gewöhnlich mit experimentellen ad-hoc Aufbauten auf Steckboards oder Lochrasterplatinen.

Links und Mitte: provisorische Versuchsaufbauten (
Links und Mitte: provisorische Versuchsaufbauten (“Evaluation Boards”) auf Lochrasterplatinen. Rechts: bestücktes PCB aus China (vorläufiges Layout)

Steht irgendwann eine Art finales Design fest, werden via Software, zum Beispiel EAGLE, ein Schaltplan bzw. geometrische Daten erzeugt (CAM- bzw. so genannte Gerber-Files), welche einschlägige Hersteller leicht elektronisch verarbeiten und in einen standardisierten Herstellungsprozess für Printed Circuit Boards (PCB) überführen können.

Ein solches PCB, in welches die Bauelemente ohne Verdrahtung nur noch einzulöten sind, ist nicht nur schöner anzusehen, sondern bietet unter Anderem auch bessere mechanische Eigenschaften, größere Beständigkeit gegen Umwelteinflüsse sowie leichtere Möglichkeiten der Fehlersuche (für kritischere Anwendungen können auch Masseverbindungen sehr viel besser gestaltet werden).

Nachteilig ist jedoch, dass die Bauelemente aufgrund Durchkontaktierungen (Pads) 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 ohne größere Schwierigkeiten selbst entwickelt werden, was sich aufgrund geringer Preise für die gängigen Typen jedoch meist eher nicht lohnt.

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

Bodenfeuchte-Sensor Iduino ME110 incl. Verkabelung (in ESD-Schutzhülle)
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 in die Erde gesteckt werden finden sich nur einige wenige 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.

Für eine PT1-Strecke als Regler grundsätzlich gut geeignet ist ein PI-Typ, ggf. auch ein einfacherer P-Typ (s. a. Kapitel 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:

  • die Elektroden (genauer: eine Elektrode) werden elektrolytisch nach und nach zersetzt und machen den Sensor unbrauchbar
  • die entstehenden Reaktionsprodukte schädigen unter Umständen die Pflanzenwurzeln
  • unvermeidbare elektrische Verlustleistung während der Messung (Pel = U*I)

Auch Störgrößen wie starke Temperaturschwankungen können das Ausgangssignal in unerwünschter Weise verändern (tatsächlich ergaben Langzeitmessungen ein Delta von etwa +1% pro +1°C, also Differenzen von grob 10% Bodenfeuchtigkeitswert zwischen einer Tag- und einer Nachtmessung).

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 durchdachten Kombination aus Programmcode und Schaltungstechnik3.

Ich werde in Kapitel 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 A(nalog)D(igital)-Wandler (auch AD-Umsetzer oder schlicht ADC genannt).

Daher kann er mit den “rohen” Spannungswerten 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, größer Spannungsschwelle U1 mit Maximum 3,3V) oder Low (logisch 0, kleiner Spannungsschwelle U0 mit Minimum 0,0V).

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

Bei der Auswahl eines AD-Wandlers ist man jedoch relativ frei, da die Anwendung weder zeitliche Kritikalität aufweist noch eine sonderlich hohe Auflösung erfordert.

Ich entschied mich schlussendlich für einen (für den Anwendungsfall 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 Kapitel 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 prinzipiell zum Einlesen anderer Messwerte als der Bodenfeuchte zur Verfügung (zum Beispiel könnte der Pumpenstrom über einen Shunt erfasst werden).

Neben den Ein-und Ausgängen ist natürlich auch der Anschluss der ADC Versorgungsspannung bzw. Masse nötig (VDD und GND). Dazu wählte ich den vom RasPi durchgeschliffenen 5V-Pegel4.

Der ADDR-Eingang und der ALRT-Ausgang (mit ersterem Pin kann die I2C-Adresse des Bausteins manipuliert werden, die genaue Funktion des letzteren ist mir unbekannt) müssen hier hingegen nicht beschaltet werden.

4 dies verursacht schaltungstechnisch keine Probleme oder gar Schäden solange der I2C-Slave den am sog. “Pull-Up-Widerstand” anliegenden 3,3V Pegel (vgl. RasPi-Schaltplan, Widerstände R23 und R24) sicher als logisch High erkennt (I2C-Slave Open-Drain-Ausgänge können die Busleitung nicht aktiv nach High schalten)

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ührlichere Anleitungen zur Einrichtung eines AD-Wandlers auf dem RasPi sind wiederum in Kapitel 10, wie auch an unzähligen Stellen im Internet zu finden.

5.3.2.1 Vorgehen

Installation der ADC Python-libraries per Kommandozeile:

$ sudo pip3 install adafruit-circuitpython-ads1x15

Einbinden der ADC und I2C Bibliotheken 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)
(…)

Bibliotheken befinden sich für gewöhnlich in folgendem Verzeichnis (falls Bedarf an einer Editierung besteht):

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

Man sollte nicht vergessen dass die I2C-Funktion in der RasPi-Config auch aktiviert werden muss. Aufruf via:

$ sudo raspi-config

Anzeige der angeschlossenen I2C-Geräte:

$ i2cdetect -y 1

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 meine Aufbau 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 in der Datei dhcpcd.conf
Einträge 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.

Generell sollte das DHCP nicht deaktiviert werden da u. U. andere Netzwerkteilnehmer dann nicht mehr wie gewohnt funktionieren. Bei Verwendung einer statischen IP-Adresse gemäß Kapitel 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 IP-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 (u. U. 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 die (frei verfügbaren) Smartphone-Applikationen installieren: eine App zur Etablierung der VPN-Verbindung, eine weitere für den System-Zugriff via SSH-Shell.

Ist die VPN-Verbindung hergestellt kann der Anwender über z. B. die App “RaspController” Python-Code auf der Shell ausführen (siehe auch obiger screenshot):

$ cd /meinPfad/code
$ python3 meinProgramm.py

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

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

Am einfachsten ist es wohl aus solchen Befehlen ein Shell-Script zu erstellen, 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 wiederum ein python-Programm aufruft
SSH-Shell (innerhalb der App “RaspController”) und (zweimalige) Ausführung eines Shell-Scripts, das wiederum ein Python-Programm aufruft

ein über nohup geschützter Prozess muss mit dem Befehl kill <PID> beendet werden (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 Beispiele und Codeschnipsel auf, die für eigene Projekte an sich generisch verwendbar sind.

Einige lauffähige und erprobte Codebeispiele finden sich auch auf meiner Github-Seite (wird fortlaufend erweitert).

7.1 Vorbedingungen

Der abgebildete Code ist nur lauffähig mit folgenden library-Importen (siehe auch Kapitel 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 while-Schleife kann jederzeit über CTRL+C unterbrochen werden (Befehl KeyboardInterrupt).

Codeschnipsel #3

(…)
GPIO.setmode(GPIO.BCM)
GPIO.setup(5, GPIO.OUT)
(…)
print("Program will activate driver for", zeit, "seconds")
GPIO.output(5, GPIO.LOW)
print("Driver set (Pin 29 on 0.0V)")
try:
  while i<=zeit:
    time.sleep(1)
    s=s+1.0
    print("Time elapsed:", s, "sec")
    i=i+1
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 sondern werden über die GPIO ports aktiv geschaltet8. Einlesen der Sensorspannung durch den AD-Wandler und anschließende Umrechnung9 erfolgt synchron.

Diese “on-demand” Zuschaltung verhindert bzw. verlangsamt die korrosive Zersetzung der Sensor-Elektroden (Elektrolyse) aufgrund Dauerstroms durch die feuchte 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 (gilt nicht für die 5V-Anschlüsse, VBUS); da der Strom durch die Sensoren allerdings sehr 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 kann Daten, sobald sie umfangreicher sind und graphisch aufbereitet werden sollen (z. B. quantitative Veränderung des Bodenfeuchte-Niveaus über mehrere Tage) aber auch gleich mit entsprechenden Befehlen in ein Tabellenkalkulationsprogramm überführen (“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

Lauffähige Prototypen sind in den folgenden zwei kurzen Videos zu sehen.

Dort wird auch der hydraulische Aufbau, in diesem frühen Entwicklungsstadium naturgemäß noch simpel gehalten, 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 DIY Elektronik verwende ich hier lediglich einen einfachen elektronischen EIN/AUS-Schalter (mit Operationsverstärker UA741CN).

8.2 Fortgeschrittener Prototyp mit Sensor und Kamera

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

8.3 Weitere Prototypen

Ein fortlaufend aktualisierter Prototypen-Stand (mit ggf. neuen Layouts für Ansteuerplatine, s. Kapitel 4.2) ist auf meiner Projektseite auf hackaday.io zu finden.

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

9. Zusammenfassung und Ausblick

Im Artikel wurden Möglichkeiten einer ferngesteuerten Pflanzen-Bewässerung mit dem Raspberry Pi 3, Modell B+ aufgezeigt und erfolgreich in die Praxis umgesetzt.

Es versteht sich von selbst dass der Grad an Komplexität eines solchen Projekts insbesondere auf Software-Ebene nahezu beliebig erhöht werden kann.

Zum Beispiel ist die Verwendung von MQTT, Python-GUIs oder auch höher spezialisierten 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 eigene Sensorik (z. B. BMP280) könnte die lokale Temperatur erfassen.

Einen Regelkreis für eine vollautomatisierte Bewässerung passend zur Pflanzenart kann der geneigte Programmierer von Grund auf entwickeln und sukzessive verbessern.

Das Elektronik-Design und das hydraulische Netzwerk sind von diesem Verbesserungsprozess natürlich nicht ausgenommen (Ultraschall-Füllstandsmessung, Ventilumschaltung, Durchflussmessung etc.).

Der Phantasie sind auf jeden Fall keine Grenzen gesetzt, und ich freue mich schon das Thema in kommenden Blog-Artikeln wieder aufzugreifen.

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

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

Adafruit 4-Channel ADC Breakouts: Python

KY-053 Analog Digital Converter

10.2.2.2 Datenblätter

Datenblatt des verwendeten ADC

10.2.2.3 Technisches Prinzip

ADS1115 Delta-Sigma ADC

I2C-Bus besser verstehen

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)

CAMOutputs der Pumpen-Ansteuerungsplatine

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)