树莓派pico使用无源蜂鸣器播放小星星
树莓派pico播放小星星,无源蜂鸣器
from machine import Pin, PWM
import time
# ================= 配置区域 =================
BUZZER_PIN = 15 # 蜂鸣器连接的 GPIO 引脚 (建议 GP15)
VOLUME = 20000 # 音量 (0-65535), 建议 40000 (约 60%)
BPM = 80 # 速度 (每分钟拍数), 儿歌建议 60-90
BASE_TEMPO = 60000 // BPM # 计算每拍的毫秒数 (约 750ms)
# ===========================================
# 初始化 PWM
buzzer = PWM(Pin(BUZZER_PIN))
buzzer.duty_u16(VOLUME)
# 音符频率表 (C 大调)
# 对应简谱:1=C, 2=D, 3=E, 4=F, 5=G, 6=A
NOTES = {
'C4': 261, 'D4': 293, 'E4': 329, 'F4': 349, 'G4': 392, 'A4': 440,
'C5': 523, # 高音 C
'0': 0 # 休止符
}
# 小星星 旋律数据
# 格式:(音符,节拍数)
# 节拍数:1 = 一拍,2 = 两拍 (结尾音)
SONG = [
# 1 1 5 5 6 6 5 - (一闪一闪亮晶晶)
('C4', 1), ('C4', 1), ('G4', 1), ('G4', 1), ('A4', 1), ('A4', 1), ('G4', 2),
# 4 4 3 3 2 2 1 - (满天都是小星星)
('F4', 1), ('F4', 1), ('E4', 1), ('E4', 1), ('D4', 1), ('D4', 1), ('C4', 2),
# 5 5 4 4 3 3 2 - (挂在天上放光明)
('G4', 1), ('G4', 1), ('F4', 1), ('F4', 1), ('E4', 1), ('E4', 1), ('D4', 2),
# 5 5 4 4 3 3 2 - (好像许多小眼睛)
('G4', 1), ('G4', 1), ('F4', 1), ('F4', 1), ('E4', 1), ('E4', 1), ('D4', 2),
# 1 1 5 5 6 6 5 - (一闪一闪亮晶晶)
('C4', 1), ('C4', 1), ('G4', 1), ('G4', 1), ('A4', 1), ('A4', 1), ('G4', 2),
# 4 4 3 3 2 2 1 - (满天都是小星星)
('F4', 1), ('F4', 1), ('E4', 1), ('E4', 1), ('D4', 1), ('D4', 1), ('C4', 2),
]
def play_note(note, beats):
"""播放单个音符"""
freq = NOTES.get(note, 0)
if freq == 0:
# 休止符:静音
buzzer.duty_u16(0)
else:
# 发声:设置频率和音量
buzzer.freq(freq)
buzzer.duty_u16(VOLUME)
# 计算持续时间 (毫秒)
duration = int(BASE_TEMPO * beats)
time.sleep_ms(duration)
# 音符间短暂停顿,让旋律更清晰 (约 30ms)
buzzer.duty_u16(0)
time.sleep_ms(30)
try:
print("开始播放:小星星...")
print(f"速度:{BPM} BPM | 引脚:GP{BUZZER_PIN}")
while True:
for note, beats in SONG:
play_note(note, beats)
print("一曲完毕,2 秒后重复...")
time.sleep(2)
except KeyboardInterrupt:
print("用户停止播放。")
finally:
# 程序彻底退出时才关闭蜂鸣器
buzzer.deinit()
print("蜂鸣器已关闭。")

浙公网安备 33010602011771号