Der Code
Hier ist ein Beispielcode für eure Programmierung in Micropython in der IDE Thonny auf dem Raspberry Pi Pico.
#import Bibliothekentime
ladenimport #---------------------------------------------------------------------random
from machine import Pin, ADCUART
from dfplayer import timeDFPlayer
# HC-SR501 Bewegungsmelder
pir_sensor = Pin(28, Pin.IN) # Verbinde den Bewegungsmelder mit Pin 28
# Onboard-LED des Raspberry Pi Pico
led_pico = Pin(25, Pin.OUT) # Onboard-LED an Pin 25
# Busy-Pin des DFPlayer Mini
busy_pin = Pin(22, Pin.IN) # Verbinde den Busy-Pin des DFPlayer mit Pin 22
# UART-Konfiguration für DFPlayer
uart = UART(0, baudrate=9600, tx=Pin(16), rx=Pin(17))
# DFPlayer MP3 Player
dfplayer = DFPlayer(uart_id=0, tx_pin_id=16, rx_pin_id=17) # Initialisiere DFPlayer mit UART Pins
time.sleep(2) # Warte, bis der DFPlayer vollständig bereit ist
# Setze die Lautstärke einmalig
print("Setze Lautstärke...")
dfplayer.volume(10) # Lautstärke auf 15 setzen (Bereich 0-30)
time.sleep(0.5)
# Funktion zum Abspielen einer zufälligen MP3-Datei
def play_random_mp3():
track_number = random.randint(1, 4) # Wähle eine zufällige Datei im Bereich 001-004
time.sleep(0.2) # Kurze Pause nach der Zufallsauswahl
print(f"Spiele MP3-Datei {track_number} ab...")
dfplayer.play(1, track_number) # Spiele die Datei im Ordner ./01/
time.sleep(0.2) # Zusätzliche kurze Pause für Stabilität
print("MP3-Wiedergabe gestartet.")
# Hauptprogramm
playing = False
waiting_for_reset = False
reset_timeout = 5 # Timeout für die LEDsBewegungserkennung led_redin Sekunden
reset_start_time = Pin(15, Pin.OUT)
led_yellow = Pin(14, Pin.OUT)
led_green = Pin(13, Pin.OUT)0 # ADC-PinStartzeit für dendas Bodenfeuchtigkeitssensor
#---------------------------------------------------------------------
soil_sensor = ADC(26)
# Schwellenwerte für Feuchtigkeit
#---------------------------------------------------------------------
DRY_THRESHOLD = 30000 # Unter diesem Wert wird es als trocken betrachtet
MOIST_THRESHOLD = 60000 # Ober diesem Wert wird es als feucht betrachtet
def read_soil_moisture():
# Bodenfeuchtigkeit auslesen
return soil_sensor.read_u16()Timeout
while True:
moisture_level# Prüfen, ob der Sensor keine Bewegung mehr meldet, bevor eine neue erkannt werden kann
if not playing and not waiting_for_reset and pir_sensor.value() == 1:
print("Bewegung erkannt!")
led_pico.value(1) # LED einschalten
play_random_mp3()
playing = read_soil_moisture()True # BodenSetzt den Status auf "abspielend"
if playing:
# Überprüfe den Status des Busy-Pins und steuere die LED entsprechend
if busy_pin.value() == 0: # Busy-Pin ist trocken,LOW, rotewenn LEDeine leuchtetDatei #---------------------------------------------------------------------abgespielt ifwird
moisture_levelprint("DFPlayer <spielt DRY_THRESHOLD:MP3-Datei led_red.value(1)ab.")
led_yellow.value(0)else:
led_green.print("DFPlayer ist im Leerlauf.")
led_pico.value(0) # Boden hat wenig Feuchtigkeit, gelbe LED leuchtetausschalten
#---------------------------------------------------------------------playing elif= moisture_level < MOIST_THRESHOLD:
led_red.value(0)
led_yellow.value(1)
led_green.value(0)False # BodenWiedergabe ist feuchtabgeschlossen
genug,waiting_for_reset grüne= LED leuchtet
#---------------------------------------------------------------------
else:
led_red.value(0)
led_yellow.value(0)
led_green.value(1)True # Warte eineauf Sekundedie bevorBeendigung der nächsteBewegungserkennung
Wertreset_start_time gemessen= wirdtime.time() #-# Startzeit für das Timeout setzen
# Überprüfen, ob das Timeout abgelaufen ist oder der Sensor keine Bewegung mehr meldet
if waiting_for_reset:
if pir_sensor.value() == 0:
print("Bereit für neue Bewegungserkennung.")
waiting_for_reset = False
elif time.time() -------------------------------------------------------------------- reset_start_time > reset_timeout:
print("Timeout erreicht. Bereit für neue Bewegungserkennung.")
waiting_for_reset = False
time.sleep(0.1) # Kurze Pause, um Sensor nicht zu überlasten