Automatische Bewässerung für die Zimmerpflanzen

Die türkischen Ferien können lang sein. Wenn man dann die meiste Zeit in Deutschland bei seiner Familie verbringen möchte (2 Monate) muss man sich schon etwas überlegen, was mit seinen Zimmerpflanzen passiert. Am Einfachsten ist es, einen zuverlässigen Nachbar zu haben. Das habe ich im ersten Jahr in meiner neuen Wohnung versucht. Als ich mir dann nach 2 Monaten das Resultat sah – brauchte ich für das nächste Jahr eine andere Lösung.

Also programmierte ich einen Raspberry Pi3. Das war dann im Frühjahr 2018. Folgende Anforderungen hatte ich:

Die Blumentöpfe sollten mit Feuchtigkeitssensoren ausgestattet werden. Da ich kaum für alle 20 Pflanzentöpfte eine extra Bewässerung geben kann, gruppierte ich die Pflanzen in 4 Gruppen. Jede Gruppe mit je 5 Töpfen bekam je 2 Feuchtesensoren und eine Aquariumpumpe und je ein 10 Liter Wasserbehälter. Zu Wasserzuführung habe ich mir die kleinen Tropfer von Gardena zugelegt. Da der Raspberry keine analogen Eingänge verarbeiten kann, nutze ich dafür die digitalen Eingänge. Am Trigger der Feuchtesensoren befindet sich ein Poti. Das konnte man dann so einstellen, dass bei einer gewissen Feuchte der Messfühler durchschaltet.

Nach eine Testwoche stellte ich fest, dass sich die Sensoren durch Elektrolyse auflösten, also ersetze ich die Fühler durch 1mm dicken Kupferdraht. Den Raspberry programmierte ich dann so, dass er nur zu den Messzeiten alle Messfühler unter Strom setzt. Nicht das sich die dicken Kupferdrähte auch noch auflösen.
Den Wasserstand in den 10 Liter Behältern habe ich auch durch Feuchtesensoren ermittelt. Nicht dass die Pumpen irgendwann leer laufen.

Als Sicherheit baute ich noch eine Fernwartungsmöglichkeit per vcn und teamviewer mit ein, so dass ich mich bei Problemen in den Computer aus der Ferne einloggen konnte.

Das Resultat war nach 2 Monaten etwas erschreckend. Der Computer sendete mir ja täglich einen Zustandsbericht in eine Logdatei.

Nach einer Woche lösten sich die Sensoren in den Wasserbehältern auf. Sie meldeten also einen niedrigen Wasserstand, obwohl es nicht so war. Ich loggte mich also aus Deutschland in meinen Raspberry in Istanbul ein und deaktivierte die Wasserstandssensoren im Programm. Dann fielen nacheinander auch die Sensoren in den Blumentöpfen aus, bzw. sie veränderten ihre Parameter. Ein Ausgleich ist bei den Sensoren aber nur am Poti möglich. Also deaktivierte ich nacheinander gut die Hälfte der Blumentopfsensoren.
Nach 2 Monaten konnten noch 3 Pumpen selbstständig gießen, auch wenn nur je ein Sensor noch funktionierte. Die 4.-te Pumpe konnte ich dann nur noch per „Hand“ -Fernsteuerung, ohne Sensoren, manuell aus der Ferne betätigen.

Schlussendlich überlebten 18 der 20 Blumentöpfte.

Ihr Frühjahr 2019 sollte dann alles besser werden

Der Raspberry bekam eine Kamera zur Blumentopfüberwachung dazu. Die resistiven Feuchtesensoren wurden ergänzt durch kapazitive Sensoren. Dazu mussten natürlich noch zwei Analog-Digital-Wandler dazukommen. Ich erhöhte also die Sensoranzahl auf 16 analoge Eingänge. Dazu nutze ich 2 mal den MCP3008. Ich kaufte 8 kapazitiven Feuchtesensoren und nutze weiter 8 resistive Feuchtesensoren, wobei ich Graphitstäbe als Elektroden benutze. Die lösen sich nicht auf. Es stellte sich als wichtig raus, dass die Messzeit nicht zu lange dauert. Es bilden sich dann wahrscheinlich kleine Gasbläschen um die resistiven Sensoren, so dass sich dann der Gesamtwiderstand merklich ändert. Die kapazitiven Sensoren waren unempfindlich gegenüber Elektrolyse, aber lieferten nicht immer die zuverlässigsten Ergebnisse. Der Sensor ist oft einfach nicht lang genug.
weitere Ideen waren dann der Einbau einer kleinen Alarmanlage. Ein Distanzsensor sollte den Raum immer scannen und bei Anwesenheit einer Person ein Foto machen, dass er an meinen FTP- Server schicken sollte. Sollte es dunkel sein, sollte die Zimmerbeleuchtung angehen. Auf dem FTP-Server sollten auch alle Logdateien und ein tägliches Foto meiner Pflanzen geschickt werden.

Bis auf die Alarmanlagenfunktion habe ich auch alles hinbekommen. Die Anlage lief nun schon 2 Sommer sehr zuverlässig. Über einen Fernzugriff über AnyDesk konnte ich sehr einfach mich auf die Oberfläche des Raspberry einloggen, um die Sensorparameter weiter aus der Ferne zu optimieren

Hier die Schaltung

Hier das Hautprogramm in Python

#!/usr/bin/python
# Author: TMike Paetzold
import time
import RPi.GPIO as GPIO
import sys
from time import localtime, strftime
import Adafruit_GPIO.SPI as SPI
import Adafruit_MCP3008
import Adafruit_DHT

# Hardware SPI configuration:
# MCP1 liegt an CE0, MCP2 liegt an CE1
SPI_PORT = 0
SPI_DEVICE_0 = 0
SPI_DEVICE_1 = 1
mcp0 = Adafruit_MCP3008.MCP3008(spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE_0))
mcp1 = Adafruit_MCP3008.MCP3008(spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE_1))

#ZEIT Checken
jahr = strftime("%Y", time.localtime())
tag = strftime("%D", time.localtime())
minute = strftime("%M", time.localtime())
stunde = strftime("%H", time.localtime())
print("")
print ("Die Blumen bekommen gerade Wasser. Es ist ", (stunde), (minute), (tag) )


# Temperatur und Luchtfeuchet lesen
humidity, temperature = Adafruit_DHT.read_retry(22, 4)
print('Temp={0:0.1f}*C Luftfeuchte={1:0.1f}%'.format(temperature, humidity))


# Zaehlweise der Pins festlegen
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)

# PIN 11,12,13,15,16,29 fuer Relais

GPIO.setup(11, GPIO.OUT) #Pumpe1
GPIO.setup(12, GPIO.OUT) #Pumpe2
GPIO.setup(13, GPIO.OUT) #Pumpe3
GPIO.setup(15, GPIO.OUT) #Pumpe4
GPIO.setup(16, GPIO.OUT) #Leer
GPIO.setup(29, GPIO.OUT) #Sensorschalter

#Relais abhaengen

GPIO.output(11, GPIO.HIGH)
GPIO.output(12, GPIO.HIGH)
GPIO.output(13, GPIO.HIGH)
GPIO.output(15, GPIO.HIGH)
GPIO.output(16, GPIO.HIGH)
GPIO.output(29, GPIO.LOW) #Messrelais durchschalten

time.sleep(2) #Initialisierung

#Analogwerte auslesen
#MCP an CE0
values00 = mcp0.read_adc(0)
values01 = mcp0.read_adc(1)
values02 = mcp0.read_adc(2)
values03 = mcp0.read_adc(3)
values04 = mcp0.read_adc(4)
values05 = mcp0.read_adc(5)
values06 = mcp0.read_adc(6)
values07 = mcp0.read_adc(7)
#MCP an CE1
values10 = mcp1.read_adc(0)
values11 = mcp1.read_adc(1)
values12 = mcp1.read_adc(2)
values13 = mcp1.read_adc(3)
values14 = mcp1.read_adc(4)
values15 = mcp1.read_adc(5)
values16 = mcp1.read_adc(6)
values17 = mcp1.read_adc(7)

GPIO.output(29, GPIO.HIGH) #Messrelais abhaengen
print ('_________________________________________________________________________')
print ("___________________Analogmessung MCP an CE0: resistiv____________________ " )
print ("|K0 200 | K1 600 | K2 300 | K3 260 | K4 250 | K5 250 | K6 300 | K7 250|")
print (repr(values00).rjust(5), repr(values01).rjust(5), repr(values02).rjust(5), repr(values03).rjust(5), repr(values04).rjust(5), repr(values05).rjust(5), repr(values06).rjust(5), repr(values07).rjust(5))
print ('_________________________________________________________________________')
#Widerstandsmessung 85-95 frisch gegossen, eher trocken: 190-250

print ("___________________Analogmessung MCP an CE1: kapazitiv___________________ " )
print ("| K0 320 | K1 375 | K2 375 | K3 385 | K4 450 | K5 250 | K6 400 | K7 470 |")
print (repr(values10).rjust(5), repr(values11).rjust(5), repr(values12).rjust(5), repr(values13).rjust(5), repr(values14).rjust(5), repr(values15).rjust(5), repr(values16).rjust(5), repr(values17).rjust(5))
print ('_________________________________________________________________________')
#kapazitive Messung 1018 eher trocken, 170 frisch gegossen


# Pumpe 1 : resistive Messung,
if (values00 > 250) or (values01 > 250) or (values02 > 250) or (values03 > 300):
print ("Eine Pflanze an Pumpe1 r 0-3 ist zu trocken also wird jetzt 6 min gegossen ")
GPIO.output(11, GPIO.LOW)
# x Sekunden giessen, 200s entsp ca 100ml pro Tropfer
time.sleep(360)
GPIO.output(11, GPIO.HIGH)
if (values00 < 250) and (values01 < 250) and (values02 < 250) and (values03 < 300):
print ("****Alle Pflanzen an -Pumpe1 r 0-3 sind feucht!****" )



# Pumpe 2 : resistive Messung
if (values04 > 250) or (values05 > 250) or (values06 > 300) or (values07 > 300):
print ("Eine Pflanze an Pumpe2 r 4-7 ist zu trocken also wird jetzt 4 min gegossen ")
GPIO.output(12, GPIO.LOW)
# x Sekunden giessen, 200s entsp ca 100ml pro Tropfer
time.sleep(240)
GPIO.output(12, GPIO.HIGH)
if (values04 < 250) and (values05 < 250) and (values06 < 300) and (values07 < 300):
print ("****Alle Pflanzen an -Pumpe2 r 4-7 sind feucht!****" )


# Pumpe 3 : kapazitive Messung
if (values10 > 320) or (values11 > 375) or (values12 > 375) or (values13 > 385):
print ("Eine Pflanze an Pumpe3 k 0-3 ist zu trocken also wird jetzt 2 min gegossen ")
GPIO.output(13, GPIO.LOW)
# x Sekunden giessen, 200s entsp ca 100ml pro Tropfer
time.sleep(120)
GPIO.output(13, GPIO.HIGH)
if (values10 < 320) and (values11 < 375) and (values12 < 375) and (values13 < 385):
print ("****Alle Pflanzen an -Pumpe3 k 0-3 sind feucht!****" )


# Pumpe 4 : kapazitive Messung
if (values14 > 450) or (values15 > 250) or (values16 > 400) or (values17 > 470):
print ("Eine Pflanze an Pumpe4 k 4-7 ist zu trocken also wird jetzt 3 min gegossen ")
GPIO.output(15, GPIO.LOW)
# x Sekunden giessen, 200s entsp ca 100ml pro Tropfer
time.sleep(180)
GPIO.output(15, GPIO.HIGH)
if (values14 < 450) and (values15 < 250) and (values16 < 400) and (values17 < 470):
print ("****Alle Pflanzen an -Pumpe4 k 4-7 sind feucht!****" )


print ('________________________________________________________________________')




# Alle Relais abhaengen
GPIO.output(11, GPIO.HIGH)
GPIO.output(12, GPIO.HIGH)
GPIO.output(13, GPIO.HIGH)
GPIO.output(15, GPIO.HIGH)
GPIO.output(16, GPIO.HIGH)
GPIO.output(29, GPIO.HIGH)


print("Programm beendet")
print("")

Hier das Testprogramm zum Messen der Sensorwerte. Das wird bei jedem Neustart des Raspberry ausgeführt

#!/usr/bin/python
# Author: TMike Paetzold
import time
import RPi.GPIO as GPIO
import sys
from time import localtime, strftime
import Adafruit_GPIO.SPI as SPI
import Adafruit_MCP3008
import Adafruit_DHT

# Hardware SPI configuration:
# MCP1 liegt an CE0, MCP2 liegt an CE1
SPI_PORT = 0
SPI_DEVICE_0 = 0
SPI_DEVICE_1 = 1
mcp0 = Adafruit_MCP3008.MCP3008(spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE_0))
mcp1 = Adafruit_MCP3008.MCP3008(spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE_1))

#ZEIT Checken
jahr = strftime("%Y", time.localtime())
tag = strftime("%D", time.localtime())
minute = strftime("%M", time.localtime())
stunde = strftime("%H", time.localtime())
print("")
print ("Der Computer wurde neu gestartet. Es ist: ", stunde,minute,tag )

# Temperatur und Luchtfeuchet lesen
humidity, temperature = Adafruit_DHT.read_retry(22, 4)
print('Temp={0:0.1f}*C Luftfeuchte={1:0.1f}%'.format(temperature, humidity))

# Zaehlweise der Pins festlegen
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)

# PIN 11,12,13,15,16,29 fuer Relais

GPIO.setup(11, GPIO.OUT) #Pumpe1
GPIO.setup(12, GPIO.OUT) #Pumpe2
GPIO.setup(13, GPIO.OUT) #Pumpe3
GPIO.setup(15, GPIO.OUT) #Pumpe4
GPIO.setup(16, GPIO.OUT) #Leer
GPIO.setup(29, GPIO.OUT) #Sensorschalter

GPIO.setup(38, GPIO.IN) #Lichtsensor

#Relais abhaengen

GPIO.output(11, GPIO.HIGH)
GPIO.output(12, GPIO.HIGH)
GPIO.output(13, GPIO.HIGH)
GPIO.output(15, GPIO.HIGH)
GPIO.output(16, GPIO.HIGH)
GPIO.output(29, GPIO.LOW) #Messrelais durchschalten

time.sleep(2) #Initialisierung

#Digitalport auslesen
licht = GPIO.input(38)

#Analogwerte auslesen
#MCP an CE0
values00 = mcp0.read_adc(0)
values01 = mcp0.read_adc(1)
values02 = mcp0.read_adc(2)
values03 = mcp0.read_adc(3)
values04 = mcp0.read_adc(4)
values05 = mcp0.read_adc(5)
values06 = mcp0.read_adc(6)
values07 = mcp0.read_adc(7)
#MCP an CE1
values10 = mcp1.read_adc(0)
values11 = mcp1.read_adc(1)
values12 = mcp1.read_adc(2)
values13 = mcp1.read_adc(3)
values14 = mcp1.read_adc(4)
values15 = mcp1.read_adc(5)
values16 = mcp1.read_adc(6)
values17 = mcp1.read_adc(7)

GPIO.output(29, GPIO.HIGH) #Messrelais abhaengen
if licht == 1 : print ('Es ist hell')
if licht == 0: print ('Es ist dunkel')

print ("___________________Analogmessung MCP an CE0:resistiv____________________ " )
print ("| Kanal0 | Kanal1 | Kanal2 | Kanal3 | Kanal4 | Kanal5 | Kanal6 | Kanal7 |")
print (repr(values00).rjust(5), repr(values01).rjust(5), repr(values02).rjust(5), repr(values03).rjust(5), repr(values04).rjust(5), repr(values05).rjust(5), repr(values06).rjust(5), repr(values07).rjust(5))
print ('__________________________________________________________________________')
#Widerstandsmessung 85-95 frisch gegossen, eher trocken: 190-250

print ("_____________________Analogmessung MCP an CE1: kapazitiv___________________ " )
print ("| Kanal0 | Kanal1 | Kanal2 | Kanal3 | Kanal4 | Kanal5 | Kanal6 | Kanal7 |")
print (repr(values10).rjust(5), repr(values11).rjust(5), repr(values12).rjust(5), repr(values13).rjust(5), repr(values14).rjust(5), repr(values15).rjust(5), repr(values16).rjust(5), repr(values17).rjust(5))
print ('___________________________________________________________________________')
#kapazitive Messung 1018 eher trocken, 170 frisch gegossen

# Alle Relais abhaengen
GPIO.output(11, GPIO.HIGH)
GPIO.output(12, GPIO.HIGH)
GPIO.output(13, GPIO.HIGH)
GPIO.output(15, GPIO.HIGH)
GPIO.output(16, GPIO.HIGH)
GPIO.output(29, GPIO.HIGH)

Hier die cron Tab Datei. Die ist für die zeitgesteuerte Ausführung der Programme zuständig

Die Datei kann in der Konsole des Raspberry mit dem Befehl: sudo crontab -e geändert werden

# Messungen bei reboot 
@reboot python /home/pi/Scripte/boot.py >> /home/pi/logs/log.txt

# taglich 7:30 Uhr giessen, danach log-Datei auf ftp Laden
30 8 * * * python /home/pi/Scripte/Blumen_giessen.py >> /home/pi/logs/log.txt

# täglich 8:40 die logdatei auf dem FTP-Server laden
40 8 * * * /bin/bash /home/pi/Scripte/logtoftp.sh

# Foto machen und Bild auf ftp Server übertragen
0 12 * * * raspistill -o /home/pi/Fotos/Bild.jpg
5 12 * * * /bin/bash /home/pi/Scripte/mftp.sh

Hier die Scripte die zum Hochladen der Bilder und der Logdatei auf dem FTP_Server dienen. FTP-Servername, Benutzername und Passwörter sowie die Pfade zur Logdatei oder zu den Bildern müssen natürlich angepasst werden

Dateiname: logtoftp.sh

#!/bin/bash
HOST='FTP-Serveradresse'
USER='Benutzername'
PASSWD='Passwort'

cd /home/pi/logs/
ftp -n -v $HOST << EOT
ascii
user $USER $PASSWD
prompt
cd /logs/
mput *.txt
bye
EOT

Datei mftp.sh :

#!/bin/bash
HOST='FTP-Serveradresse'
USER='Benutzername'
PASSWD='Passwort'

cd /home/pi/Fotos/
ftp -n -v $HOST << EOT
binary
user $USER $PASSWD
prompt
cd /fotos/
mput *.jpg
bye
EOT

Hier noch eine Python-Datei zum Testen der Pumpen

#!/usr/bin/python
# Author: TMike Paetzold
import time
import RPi.GPIO as GPIO
import sys
from time import localtime, strftime



GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)



GPIO.setup(11, GPIO.OUT) #Pumpe1
GPIO.setup(12, GPIO.OUT) #Pumpe2
GPIO.setup(13, GPIO.OUT) #Pumpe3
GPIO.setup(15, GPIO.OUT) #Pumpe4
GPIO.setup(16, GPIO.OUT) #Leer
GPIO.setup(29, GPIO.OUT) #Sensorschalter

#GPIO.setup(3, GPIO.IN)
GPIO.setup(22, GPIO.IN)
GPIO.setup(18, GPIO.IN)
GPIO.setup(31, GPIO.IN)
GPIO.setup(32, GPIO.IN)
GPIO.setup(33, GPIO.IN)
GPIO.setup(35, GPIO.IN)
GPIO.setup(36, GPIO.IN)
GPIO.setup(37, GPIO.IN)
GPIO.setup(38, GPIO.IN)


#Relais durchschalten

GPIO.output(11, GPIO.LOW)
GPIO.output(12, GPIO.LOW)
GPIO.output(13, GPIO.LOW)
GPIO.output(15, GPIO.LOW)
GPIO.output(16, GPIO.HIGH)
GPIO.output(29, GPIO.HIGH)

time.sleep(10)


# Alle Relais abhaengen
GPIO.output(11, GPIO.HIGH)
GPIO.output(12, GPIO.HIGH)
GPIO.output(13, GPIO.HIGH)
GPIO.output(15, GPIO.HIGH)
GPIO.output(16, GPIO.HIGH)
GPIO.output(29, GPIO.HIGH)


print("Alle Pumpen giessen 3 S Programm beendet")
print("")

Leave a Reply

Your email address will not be published. Required fields are marked *