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

  1. 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)
  2. Die Angabe der Bewässerungszeiten in einer Liste ist natürlich ungünstig. Eine Bedatung per MQTT wäre natürlich viel besser
  3. Erweiterung um einen Feuchtigkeitssensor für einen bedarfsangepasste Bewässerung
  4. Anzeige oder Countdown für die nächste Bewässerung z.B. mit einem 7-Degment-Display
  5. 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")