Skip to main content

Der Code

Hier ist ein Beispielcode für eure Programmierung in Micropython in der IDE Thonny auf dem Raspberry Pi Pico.

import time
import random
from machine import Pin, UART
from dfplayer import DFPlayer

# 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 Bewegungserkennung in Sekunden
reset_start_time = 0  # Startzeit für das Timeout

while True:
    # 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 = True  # Setzt 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 LOW, wenn eine Datei abgespielt wird
            print("DFPlayer spielt MP3-Datei ab.")
        else:
            print("DFPlayer ist im Leerlauf.")
            led_pico.value(0)  # LED ausschalten
            playing = False  # Wiedergabe ist abgeschlossen
            waiting_for_reset = True  # Warte auf die Beendigung der Bewegungserkennung
            reset_start_time = time.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