Hallo zusammen,
Ich könnte Hilfe beim folgenden Projekt gebrauchen, Vorweg: Ich bin noch Anfänger. Der untere Code ist eine Kombination aus eigenem Schaffen und unserem guten Freund (?) Chat-GPT. Vor allem beim erstellen der beiden Modi hat mir Chat geholfen.
An sich funktioniert der Code auch erstmal ganz gut, bis zu dem Punkt, wo der DFPlayer in eine Dauerschleife des Abspielens kommen soll.
Der DFPlayer spielt ein Lied zuende, sofern er keinen anderen Input bekommt. Soweit so gut. Allerdings stehe ich jetzt auf dem Schlauch, wie ich es hinkriegen kann, dass er (sowohl im Shuffle-, als auch im Reihenfolgen-Modus) selbstständig das nächste (bzw. im Shuffle-Mode ein neues zufälliges) Lied abspielt und ich gleichzeitig noch die Tasteninputs "abhorchen" kann.
Ergo: Wie kann ich eine Dauerschleife (je Modus) erstellen, welche von den Tasten unterbrochen werden kann, ohne dass der DFPlayer alle paar ms das nächste Lied spielt?
Hilfe ist sehr willkommen. Vielen Dank im Voraus!
Hier mein Code:
import time
from machine import Pin
from dfplayermini import DFPlayerMini
import random # Für zufällige Liedauswahl
player1 = DFPlayerMini(1, 4, 5)
button1 = Pin(3, Pin.IN, Pin.PULL_UP)
button2 = Pin(0, Pin.IN, Pin.PULL_UP)
aux_detect = Pin(8, Pin.IN, Pin.PULL_UP)
relay = Pin(9, Pin.OUT)
S0 = Pin(6, Pin.OUT)
S1 = Pin(7, Pin.OUT)
S2 = Pin(10, Pin.OUT)
x = 0
y = 0
relay_timer = 0 # Timer für BT-Wechsel
relay.value(0)
switched = False # Für AUX-Kabel-Erkennung
current_channel = 0
# Modusvariable (0 = Reihenfolge, 1 = Shuffle)
mode = 0
current_song = 0 # Aktueller Song (für Reihenfolge-Modus)
# Funktion zum Wechseln des Multiplexer-Kanals
def switch_channel(channel):
S0.value((channel >> 0) & 1)
S1.value((channel >> 1) & 1)
S2.value((channel >> 2) & 1)
switch_channel(0)
read_value = player1.set_volume(15)
read_value = player1.stop()
# Überprüfen der Knöpfe
def check_buttons():
"""Überprüft, ob einer der Knöpfe gedrückt wird"""
if button1.value() == 0 or button2.value() == 0:
return True
return False
# Funktion für die Zufallswiedergabe
def play_random():
"""Spielt ein zufälliges Lied aus der SD-Karte"""
song = random.randint(1, 5) # Anzahl der Lieder anpassen
print(f"Playing random song: {song}")
player1.play(song)
# Funktion zum Wechseln zwischen Reihenfolge und Shuffle
def switch_mode():
global mode, current_song
if mode == 0: # Von Reihenfolge zu Shuffle wechseln
print("Switching to shuffle mode")
current_song = 0 # Zurücksetzen der Reihenfolgenummer
play_random()
mode = 1
else: # Von Shuffle zu Reihenfolge wechseln
print("Switching to sequence mode")
mode = 0
# Funktion zur Wiedergabe des nächsten Liedes im Reihenfolge-Modus
def play_next_in_sequence():
"""Spielt das nächste Lied in der Reihenfolge ab"""
global current_song
current_song += 1
print(f"Playing next song in sequence: {current_song}")
player1.play(current_song)
# Haupt-Schleife
while True:
# Überprüfen des AUX-Eingangs
if aux_detect.value() == 0 and not switched: # Nur prüfen, wenn das Kabel eingesteckt ist und noch nicht gewechselt wurde
print("AUX-Kabel eingesteckt")
switch_channel(1) # Kanal wechseln
y = 1
switched = True # Setze die Variable auf True, um zu verhindern, dass der Kanal wieder gewechselt wird
relay.value(0)
time.sleep(0.1)
if aux_detect.value() == 1 and switched: # Überprüfe, ob das Kabel entfernt wurde
switched = False # Erlaube den Wechsel wieder, falls das Kabel entfernt wird
time.sleep(0.1)
# Überprüfen von Button 2 (AUX, BT, SD Steuerung)
if button2.value() == 0:
while button2.value() == 0:
pass
time.sleep(0.1)
if y == 0:
print("AUX")
switch_channel(1)
y = 1
time.sleep(0.2)
elif y == 1:
print("BT")
switch_channel(2)
relay.value(1) # Relais einschalten
relay_timer = time.ticks_ms() # Timer zurücksetzen, wenn zu BT gewechselt wird
y = 2
time.sleep(0.2)
elif y == 2:
print("SD")
relay_timer = time.ticks_ms() # Timer zurücksetzen, wenn zu BT gewechselt wird
switch_channel(0)
time.sleep(1) # 1 Sekunde warten, bevor das Lied startet (Warten auf Knopfdruck)
if check_buttons(): # Überprüfen, ob ein Knopf gedrückt wurde
print("Aktion durch Knopfdruck unterbrochen")
else:
read_value = player1.set_volume(15)
player1.play_next()
y = 0
time.sleep(0.2)
# Überwachen des Timers, um das Relais auszuschalten, wenn 5 Minuten vergangen sind
if y != 2 and relay.value() == 1: # Wenn der Status "SD" ist und das Relais an ist
if time.ticks_diff(time.ticks_ms(), relay_timer) > 3000: # 3 Sekunden für Testzwecke
print("Deactivating relay due to inactivity.")
relay.value(0) # Relais ausschalten, wenn 3 Sekunden vergangen sind
time.sleep(0.1)
# Überprüfen von Button 1 (Play/Pause und Zufallsmodus)
if button1.value() == 0 and y == 0:
time.sleep(0.1) # Entprellung
button1_time = time.ticks_ms()
click_count = 1 # Anzahl der Klicks
# Prüfe auf langen Druck (> 1 Sekunde)
while button1.value() == 0:
if time.ticks_diff(time.ticks_ms(), button1_time) > 1000:
switch_mode() # Wechsel zwischen Modus
time.sleep(0.1)
break # Kein Mehrfachklick mehr möglich
# Falls kein langer Druck: Prüfe auf Mehrfachklicks
else:
double_click_time = time.ticks_ms()
while time.ticks_diff(time.ticks_ms(), double_click_time) < 400:
if button1.value() == 0: # Zweiter Klick erkannt
click_count += 1
time.sleep(0.1) # Nochmals entprellen
while button1.value() == 0:
pass # Warten, bis losgelassen
time.sleep(0.1) # Kurzes Debouncing nach Loslassen
if click_count == 2:
double_click_time = time.ticks_ms() # Warte auf dritten Klick
continue
if click_count == 3:
print("prev") # Dreifach-Klick → "prev"
time.sleep(0.1)
break
else: # Falls innerhalb der Wartezeit kein dritter Klick kommt
if click_count == 2:
print("next") # Doppel-Klick → "next"
if mode == 0:
play_next_in_sequence()
elif mode == 1:
play_random() # Im Shuffle-Modus zufälliges Lied abspielen
elif click_count == 1:
if x == 0:
print("play")
player1.start()
else:
print("pause")
player1.pause()
x = 1 if x == 0 else 0
time.sleep(0.2) # Letztes Debouncing
Display More