from machine import Pin, PWM
import time
# 建立 PWM 控制腳位 (GPIO2)
beeper = PWM(Pin(2, Pin.OUT))
# 音名對應的頻率 (Hz)
tones = {
"C4": 262, "D4": 294, "E4": 330, "F4": 349,
"G4": 392, "A4": 440, "B4": 494,
"C5": 523, "D5": 587, "E5": 659, "F5": 698,
"G5": 784, "A5": 880, "B5": 988,
"P": 0 # 休止符 (pause)
}
# 小星星旋律 (音符)
melody = [
"C4","C4","G4","G4","A4","A4","G4",
"F4","F4","E4","E4","D4","D4","C4",
"G4","G4","F4","F4","E4","E4","D4",
"G4","G4","F4","F4","E4","E4","D4",
"C4","C4","G4","G4","A4","A4","G4",
"F4","F4","E4","E4","D4","D4","C4"
]
# 每個音符的時值 (單位:拍) → 4 = 四分音符, 2 = 二分音符
beats = [
4,4,4,4,4,4,2,
4,4,4,4,4,4,2,
4,4,4,4,4,4,2,
4,4,4,4,4,4,2,
4,4,4,4,4,4,2,
4,4,4,4,4,4,2
]
# 基本速度 (一拍 = 0.4 秒,可調快或調慢)
tempo = 0.4
# 播放音樂
for i in range(len(melody)):
note = melody[i]
duration = beats[i] * tempo
if note == "P": # 休止符
beeper.duty_u16(0)
else:
beeper.freq(tones[note])
beeper.duty_u16(32768) # 50% 占空比
time.sleep(duration * 0.9) # 音長
beeper.duty_u16(0) # 每個音之間留一點空隙
time.sleep(duration * 0.1)
print("播放完成!")