Die Sommerferien und der wohlverdiente Urlaub naht, aber wer gießt Zuhause die Blumen?
Der Raspberry Pi Pico!
Dazu habe ich mir mit einem Raspberry Pi Pico WLAN in wenigen Stunden ein einfaches Bewässerungssystem für mein Balkon-Hochbeet gebaut. Der Raspberry Pi Pico holt sich dazu die Uhrzeit über das Internet von einem RTC Server und startet die Bewässerung zuverlässig zu den gewünschten Zeiten.
Verwendet dazu habe ich ein günstiges Set von Amazon mit ausreichend Schlauch, Sprinklerdüsen und viel Zubehör:
und ein 4-Relais Modul 5V und Mini Wasserpumpen, die es ebenfalls günstig bei Amazon gibt:
Der Raspberry Pi Pico wird über den USB-Port und ein separates Netzteil versorgt die 4 Wasserpumpen mit Strom.
Die Relais haben eine Low Level Trigger. Das heißt der IN-Pin muss vom Raspberry Pi auf Masse gezogen werden, damit das Relais schaltet. Wird der IN-Pin nicht auf Masse gezogen, schaltet das Relais ebenfalls nicht. Deshalb verdrahte ich die Wasserpumpen so, dass die Pumpe bei geschaltetem Relais läuft.
Materialliste
Raspberry Pi Pico WLAN: https://amzn.to/46NpFCB
Komponenten für die Bewässerung:
4-Relais Modul 5V: https://amzn.to/44O8ZJE
Mini Wasserpumpe (3 Stück inkl. Schlauch): https://amzn.to/3XVAf6C
Bewässerungssystem (Schlauch, Sprinkler und Zubehör): https://amzn.to/46TIjsO
Verwendetes Zubehör allgemein:
Mini Breadboard: https://amzn.to/3K0nOAH
Jumper Kabel: https://amzn.to/3OfXEfP
Kabel 5-polig: https://amzn.to/44s75OK
WAGO Klemmen: https://amzn.to/3XTsrCd
*Werbung! Wenn Du auf einen der Amazon Links klickst und anschließend ein beliebiges Produkt auf Amazon kaufst, unterstützt Du meinen Kanal mit einem kleinen Anteil. Dir entstehen dadurch KEINE Mehrkosten und Du zahlst den ganz normalen Preis. Danke!
Offene Punkte
- Wenn sich der Raspberry Pi nicht mit dem WLAN verbinden kann, wartet er ewig. Das ist im Fall dass das WLN nicht verfügbar ist natürlich ungünstig. Hier sollte es einen Timeout geben, damit die Bewässerung trotzdem erfolgt (wenn auch zu falschen Zeiten)
- Die Angabe der Bewässerungszeiten in einer Liste ist natürlich ungünstig. Eine Bedatung per MQTT wäre natürlich viel besser
- Erweiterung um einen Feuchtigkeitssensor für einen bedarfsangepasste Bewässerung
- Anzeige oder Countdown für die nächste Bewässerung z.B. mit einem 7-Degment-Display
- Ordentlicher Aufbau auf einer kleinen Leiterplatte und mit einer spritzwassergeschützten Box
Source Code
main.py
Das Hauptprogramm initialisiert das WLAN und die Uhrzeit. Danach wird zu den in der zeiten-Liste angegebenen Zeiten die Bewässerung gestartet,
# Bibliotheken laden from machine import Pin from utime import sleep from machine import Pin, RTC, ADC, Timer import utime as time #Module laden import rtc import bewaesserung tick = 1 # Prüftakt (Sekunden) zeit1 = (20, 00) zeit2 = (21, 00) zeit3 = (06, 00) zeit4 = (06, 30) zeiten = [zeit1, zeit2, zeit3, zeit4] zeitenzeiger = 0 # Initialisierung der Onboard-LED led_onboard = Pin("LED", Pin.OUT) def CheckZeit(): global zeitenzeiger uhrzeit = rtc.getTime() startzeit = zeiten[zeitenzeiger] # check ob Bewaesserung starten soll if uhrzeit[4] == startzeit[0] and uhrzeit[5] == startzeit[1]: bewaesserung.start() if zeitenzeiger<len(zeiten)-1: zeitenzeiger = zeitenzeiger + 1 else: zeitenzeiger = 0 print("Warten auf Zeit " + str(zeitenzeiger)) print(zeiten[zeitenzeiger]) if __name__ == "__main__": # Display initialisieren led_onboard.on() # Uhrzeit initialisieren rtc.setTime() uhrzeit = rtc.getTime() # Teste Relais bewaesserung.test() print("Warten auf Zeit " + str(zeitenzeiger)) print(zeiten[zeitenzeiger]) # Warten auf Zeit while True: # LED blinken led_onboard.on() sleep(tick/2) led_onboard.off() sleep(tick/2) # Check Zeit CheckZeit() # LED an led_onboard.on()
bewaesserung.py
Dieses Modul stellt zwei Funktionen für das Schalten der Relais zur Verfügung.
Beim Testlauf werden die Relais nacheinander für 1s geschaltet.
Mit start() werden die Relais für die bei der device Definition angegebenen Zeiten geschaltet. Je nachdem, wie viele und welche Art Sprinkler an der Wasserpumpe angeschlossen sind und was damit bewässert wird, macht es Sinn die Zeiten anzupassen.
# Bibliotheken laden from machine import Pin from utime import sleep # Parameter Bewässerungskreise port = 0 zeit = 1 # Definieren Bewässerungskreise device0 = [Pin(13, Pin.OUT, value=1), 15] device1 = [Pin(12, Pin.OUT, value=1), 20] device2 = [Pin(11, Pin.OUT, value=1), 15] device3 = [Pin(10, Pin.OUT, value=1), 20] # Liste aller Bewässerungskreise devicelist = [device0, device1, device2, device3] # Testlauf Fix 1s def test(): for device in devicelist: device[port].off() sleep(1) device[port].on() # Ausführung mit Zeit aus Tabelle def start(): for device in devicelist: device[port].off() sleep(device[zeit]) device[port].on() if __name__ == "__main__": start()
rtc.py
Dieses Modul verbindet den Raspberry Pi Pico mit einem RTC-Server und stellt die Uhrzeit des Raspberry Pi Pico
# Basierend auf "Raspberry Pi Pico W: RTC-Zeit mit NTP-Zeitserver einstellen" # https://www.elektronik-kompendium.de/sites/raspberry-pi/2708151.htm # Bibliotheken laden import machine import sys import utime as time import usocket as socket import ustruct as struct #Module laden import wlan # Winterzeit / Sommerzeit #GMT_OFFSET = 3600 * 1 # 3600 = 1 h (Winterzeit) GMT_OFFSET = 3600 * 2 # 3600 = 1 h (Sommerzeit) # NTP-Host NTP_HOST = 'pool.ntp.org' # Funktion: Zeit per NTP holen def getTimeNTP(): NTP_DELTA = 2208988800 NTP_QUERY = bytearray(48) NTP_QUERY[0] = 0x1B addr = socket.getaddrinfo(NTP_HOST, 123)[0][-1] s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: s.settimeout(1) res = s.sendto(NTP_QUERY, addr) msg = s.recv(48) finally: s.close() ntp_time = struct.unpack("!I", msg[40:44])[0] return time.gmtime(ntp_time - NTP_DELTA + GMT_OFFSET) # Funktion: RTC-Zeit setzen def setTimeRTC(): # NTP-Zeit holen tm = getTimeNTP() machine.RTC().datetime((tm[0], tm[1], tm[2], tm[6] + 1, tm[3], tm[4], tm[5], 0)) def setTime(): #Connect to WLAN wlan.connect() # Zeit setzen setTimeRTC() # Aktuelles Datum ausgeben print("Uhrzeit: " + str(machine.RTC().datetime())) def getTime(): return machine.RTC().datetime() if __name__ == "__main__": setTime()
wlan.py
Dieses Modul verbindet den Raspberry Pi mit dem WLAN.
name bzw. passwort sind durch den Namen und das Passwort für Dein Heimnetzwerk zu ersetzen.
import network from utime import sleep # Auslagern in eine Passwort Datei! wifi_ssid = "name" wifi_password = "passwort" def connect(): # Connect to WiFi wlan = network.WLAN(network.STA_IF) wlan.active(True) wlan.connect(wifi_ssid, wifi_password) while wlan.isconnected() == False: print('Waiting for connection...') sleep(1) print("Connected to WiFi")