可以的,下面是我写的MP3播放器
import board
import audiopwmio
import audiomp3
import time
import microcontroller
import digitalio
import os
# ==================== 硬件配置 ====================
AUDIO_PIN = board.GP13 # 音频输出引脚
BUTTON_PIN = board.GP24 # 切歌按键(短接 GND 触发)
OVERCLOCK_FREQ_HZ = 150000000 # 超频以获得更流畅的解码
# ==================== 初始化按键(内置上拉,短接时为低电平) ====================
button = digitalio.DigitalInOut(BUTTON_PIN)
button.switch_to_input(pull=digitalio.Pull.UP)
# ==================== 扫描根目录下的 MP3 文件 ====================
def get_mp3_files():
files = []
for file in os.listdir("/"):
if file.lower().endswith(".mp3"):
files.append(file)
files.sort()
return files
playlist = get_mp3_files()
if not playlist:
# 没有歌曲时闪灯或仅保持静默,这里简单进入死循环
while True:
time.sleep(1)
current_index = 0
def next_song():
global current_index
current_index = (current_index + 1) % len(playlist)
# ==================== 主播放逻辑 ====================
microcontroller.cpu.frequency = OVERCLOCK_FREQ_HZ
audio_out = None
try:
audio_out = audiopwmio.PWMAudioOut(AUDIO_PIN)
while True:
mp3_file_name = playlist[current_index]
try:
with open(mp3_file_name, "rb") as mp3_file:
decoder = audiomp3.MP3Decoder(mp3_file)
audio_XXXXXXXXXXXXXXX(decoder)
button_last = button.value
while audio_out.playing:
# 检测按键下降沿(按下)
current_button = button.value
if button_last and not current_button:
audio_out.stop()
next_song()
# 等待按键释放,避免连续触发
while not button.value:
time.sleep(0.01)
time.sleep(0.2)
break # 退出内层循环,开始播放新歌
button_last = current_button
time.sleep(0.05) # 短延时,保证按键响应灵敏
else:
# 歌曲自然播放完毕,自动切下一首
next_song()
time.sleep(0.5)
except Exception as e:
# 单曲播放异常,等待 2 秒后尝试下一首
time.sleep(2)
next_song()
except Exception as e:
# 音频输出初始化失败,陷入死循环
while True:
time.sleep(1)
finally:
if audio_out:
audio_out.stop()
audio_out.deinit()