Endlich gehen meine Pflanzen nicht mehr ein
Durch mein neues Bewässerungssystem bekommen meine Pflanzen immer die richtige Menge Wasser, die sie benötigen. Früher sind meine Pflanzen immer vertrocknet. Dann meinte ich es zu gut und sie sind „ersoffen“.
Das passiert mir jetzt nicht mehr. Und für ein paar Euro könnt ihr das Ganze ebenfalls nachbauen. Die Schaltung und der dazugehörige Programmcode ist recht einfach. Es ist sogar ohne Löten möglich. Aber für eine dauerhafte Anwendung empfehle ich die Schaltung doch zu löten und gegebenenfalls wasserfest zu verbauen, damit die Schaltung ordnungsgemäß funktioniert.
Folgende Bauteile werden benötigt für das Bewässerungssystem:
- der Arduino Uno (bzw. Arduino Nano) mit USB-Kabel
- Steckplatine oder Lochrasterplatine
- Jumperkabel oder Schaltdraht
- 3 x 1kOhm Widerstände
- ein NPN-Transistor
- eine Diode
- eine Wasserpumpe
- ein Bodenfeuchtigkeitssensor
- eine LED
- ein Taster
- optional ein Solarpanel + Powerbank
Was genau macht die Schaltung?
Es ist im Grunde genommen ganz einfach. Der Feuchtigkeitssensor schickt einen Wert an den Arduino. Dieser wird verarbeitet und ausgewertet. Ist es zu trocken, geht die Pumpe an, ansonsten passiert nichts. Zusätzlich hat man noch einen Taster, um die Pumpe manuell bedienen zu können. Zusätzlich gibt es noch eine Fehlerleuchte, die anspringt, wenn der gemessene Wert außerhalb eines gewissen Bereichs liegt. Das kann zustande kommen, wenn z. B. der Feuchtigkeitssensor nicht in der Erde steckt oder ein Kabel abgerissen ist. Die Pumpe geht dann natürlich nicht an, obwohl ein Wert zurückgeliefert wird, der als „sehr trocken interpretiert wird. Das wurde im Programmcode abgefangen, damit die Pflanze nicht endlos Wasser bekommt.
Zur Schaltung vom Bewässerungssystem
Das ist der Schaltplan für das Bewässerungssystem. Leider habe ich kein entsprechendes Bauteil für den Bodenfeuchtigkeitssensor gefunden. Alternativ habe ich einen Temperatur- und Feuchtigkeitssensor von einem anderen Typ in diesem Schaltplan gewählt. Später seht ihr die richtigen Bauteile auf einem Bild. Kommen wir gleich zur Pumpe, damit die läuft benötigen wir einen Transistor. Die Ausgangspins vom Arduino können ca. 20 mA schalten. Die Pumpe benötigt etwa 100 mA. Das bedeutet mit dem Pin 6 geben wir das Signal an die Basis vom Transistor und der schaltet die eigentliche Last; also die Wasserpumpe.
Wir benötigen dazu noch eine Diode. Diese verhindert, dass der Transistor zerstört wird, wenn der Motor schlagartig abgeschaltet wird. Wer mehr darüber wissen möchte, kann sich über die Freilaufdiode informieren. An Pin 2 hängt ein Taster. Der ist später für den manuellen Pumpvorgang zuständig. Pin 9 schaltet die LED im Falle eines Fehlers. An A0 hängt der Sensor für die Bodenfeuchtigkeit. Die genaue Verkabelung wird auf dem Bild gezeigt.
Der Programmcode vom Bewässerungssystem
Damit die Bauelemente auch das machen, was wir wollen, müssen die eingelesenen Werte (vom Feuchtigkeitssensor und Taster) verarbeitet werden. Danach entscheidet sich, ob z. B die Pumpe läuft, die LED leuchtet oder nichts passiert, weil alles ok ist. Ich erläutere den Code ausführlich, falls es dennoch Fragen dazu gibt, schreibt mich gern an. Das gilt natürlich auch für den Schaltplan.
Zunächst definieren wir die Pins. Mit anderen Worten wir geben ihnen Namen. Für die Programmierung ist es verständlicher, wenn man z. B. die Pumpe anspricht, anstatt Pin 6. Somit weiß man genau was gemeint ist.
Wenn alle Pins belegt sind, weiß man später nicht mehr, was wofür steht. Danach deklariere ich zwei Variablen. Einmal für den Tasterzustand, der entweder gedrückt oder nicht gedrückt sein kann. Dafür nehmen wir einen boolschen Wert (true oder false). Für den Feuchtigkeitswert nehmen wir einen Integer Wert. In unserem Fall bekommen wir nur ganzzahlige Werte die zwischen 0 und 1023 liegen.
Der setup Teil
Mit Serial.begin(9600); legen wir die Signalübertragung zwischen Arduino und dem PC fest. Im Grunde genommen braucht ihr das nicht für die fertige Schaltung, da diese später nicht mehr mit dem PC verbunden ist. Ich brauchte allerdings die Werte am PC um die Schaltung zu testen und zu konfigurieren. In der nächsten Zeile wird der Pin für die Wasserpumpe als Ausgang festgelegt. Das bedeutet er liest keinen Wert aus, sondern schaltet den Ausgang auf HIGH. Wenn man dann einen Verbraucher gegen Masse schaltet, fließt ein Strom.
In der nächsten Zeile legen wir einen Interrupt fest. Wofür wird der benötigt? Mit einem Interrupt kann man ein Ereignis aufrufen. Und zwar funktioniert das Ganze so. Der Code wird der Reihe nach abgearbeitet. Manchmal kann es sein, dass man in einer Schleife festhängt. In unserem Fall habe ich das extra so eingebaut. Dazu später mehr.
Die Schleife dauert ca. 25 min und in der Zeit wird der Rest vom Programmcode nicht berücksichtigt. Aber ich habe einen manuellen Schalter eingebaut, damit man per Knopfdruck die Pumpe anschalten kann. Bloß bin ich in der Schleife oder woanders „gefangen“ müsste ich solange warten und den Zeitpunkt abpassen, dass ich den Taster drücke, wenn der Arduino das auch realisiert. Und da kommt der Interrupt ins Spiel. Sobald dieser ausgelöst wird, verlässt er die Schleife, führt schnell etwas aus und springt an die Stelle zurück, die verlassen wurde. Es muss keine Schleife sein, aber in unserem Fall ist es die for-Schleife.
In der Klammer vom Interrupt stehen 3 Parameter. Im ersten Teil wird der Pin festgelegt. Je nachdem, welchen Arduino-Typ ihr habt, sind die Interrupt-Pins an unterschiedlichen stellen. Bei dem Uno ist es der Pin 2 (Interrupt 0) und 3 (Interrupt 1). Der zweite Parameter steht für die Methode, die ausgeführt werden soll, wenn der Interrupt ausgelöst wurde. In der Methode sind ein paar Zeilen Code hinterlegt. In unserem Fall wird der Tasterstatus getoggelt (wenn true dann false, wenn false dann true). Der letzte Parameter steht für die Auslösung des Interrupts. Falling bedeutet von 5 V auf 0 V. Also ich drücke den Taster (5 V) und erst nachdem ich losgelassen habe (0 V), wird der Interrupt ausgelöst.
Der loop-Teil
Die Methode GetHumidity_SensorValue() liest den Wert vom analogen Pin(0) aus und speichert den Wert in einer Variable. In der While-Schleife überprüfen wir, ob der Feuchtigkeitswert kleiner gleich 450 (das bedeutet, es muss nicht gegossen werden) ist. Wenn das stimmt, geht es in die While-Schleife und darin bleiben wir solange, bis der Feuchtigkeitswert größer als 450 (es ist trocken) wird. Mit der for-Schleife bewirken wir eine 25 min Pause. Die Lebensdauer vom Feuchtigkeitssensor ist begrenzt. Um so öfter wir diesen abfragen, desto schneller wird er kaputt gehen.
Für unser Projekt reicht es vollkommen aus, wenn alle 25 min eine Überprüfung stattfindet. Mit der if-Anweisung wird der Tasterzustand überprüft, der durch den Interrupt verändert werden kann. Wenn der Taster gedrückt wird, läuft die Wasserpumpe für 2 Sekunden. Das sieht man in der Methode StartingWaterPump(). Danach geht es mit der for-Schleife weiter. Weiterhin wird in der for-Schleife die Fehlerleuchte auf aus gesetzt und Daten an den PC gesendet. Mit der Pause von 500 Millisekunden und 3000 Wiederholungen kommen wir auf die 25 min Pause, wo der Feuchtigkeitssensor nicht abgefragt wird.
Ist die for-Schleife durchlaufen, wird wieder der Feuchtigkeitswert abgefragt und dieser an den PC-geschickt. Ist der Wert kleiner gleich 450, bleiben wir in der While-Schleife und es geht von vorn los. Wenn der Wert größer als 450 ist, kommen wir aus der While-Schleife raus. Nun überprüfen wir, ob sich der Feuchtigkeitswert zwischen 450 und 800 befindet. Wenn ja schaltet sich die Pumpe ein. Falls nicht, geht die Fehlerleuchte an. Wenn der Wert nicht zwischen 450 und 800 liegt ist vermutlich etwas mit dem Sensor nicht in Ordnung. Z. B. könnte ein Kabel abgegangen sein oder der Sensor befindet sich nicht mehr in der Erde. Dann bekommen wir den Wert 1023.
So sieht der Aufbau provisorisch aus
Zum Abschluss
Das System ist sehr einfach aufgebaut. Damit meine ich sowohl die Schaltung, als auch der Programmcode. Mir ist bewusst, es gibt wesentlich bessere Lösungen für ein Bewässerungssystem. Aber ich habe das Projekt alleine aufgebaut und für meine Zwecke reicht es auf jeden Fall aus. Sobald der Arduino Nano da ist, werde ich die Schaltung noch zusammen löten und mir eine optisch bessere Lösung für das ganze System überlegen. Ich teste es seit ein paar Wochen und vorerst funktioniert alles. Falls es dazu noch Fragen gibt, schreibt mir gern eine Nachricht oder hinterlasst einen Kommentare. Vielleicht habe andere die gleiche Frage. Na dann viel Spaß beim Nachbauen und Ausprobieren.
Hallo Rico,
kannst fu mir erklären, warum scheribst du i in dem loop Teil (Schleife for)?
void loop()
{
GetHumidity_SensorValue();
while (humiditySensorValue <= 450 )
{
// 25 min delay
for (int i = 0; i <= 3000; i++)
Ich bedankte mich für deinen Antwort,
Viele Grüße
Augusto Castro
Hallo die Antwort kommt ein wenig spät, weil ich im Urlaub war. Ich habe eine for schleife verwendet, damit der Sensorwert nur alle 25 Minuten abgefragt wird. Das erhöht die Lebensdauer des Sensors. Die for schleife wird 3000 mal wiederholt und das alle 0,5 Sekunden. Das sind dann 1500 Sekunden und das sind 25 Minuten. Hätte ich ein delay von 1500000 Millisekunden genommen, hätte ich in der Zeit den Taster nicht mehr abfragen können. Ich hoffe, ich konnte dir damit weiterhelfen;)
Hallo Rico,
Kann man die Schaltung 2mal Bauen und an einen Arduino Uno 3 anschließen
Mit freundlichen Grüßen
Maurice B.
Hallo Maurice,
ja man kann die Schaltung öfter nachbauen und an den Arduino anschließen. Man muss nur darauf achten, dass der Arduino Uno 3 maximal 500 mA liefern kann (bezogen auf den 5 Volt Pin). Die digitalen Ausgänge können maximal 40 mA pro Ausgang schalten. Man benötigt ggf. ein externes Netzteil.
LG Rico
Hey,
welche Wasserpumpe nutzt du? Der Link funktioniert leider nicht mehr.
Würde deine Schaltung gerne nachbauen 🙂
Hallo,
ich würde dir diesen Beitrag empfehlen.
https://schaltungen-mit-arduino.de/2020/04/21/solarpumpe-diy-arduino/
Diese Schaltung hat sich besser bewährt.
Dort ist auch der Link für die Wasserpumpe.
LG Rico