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