这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » Let'sdo第3期-拾色播放器DIY】--过程帖实现蜂鸣器驱动,并播放音乐

共1条 1/1 1 跳转至

Let'sdo第3期-拾色播放器DIY】--过程帖实现蜂鸣器驱动,并播放音乐

助工
2025-12-10 23:51:20     打赏
【Let'sdo第3期-拾色播放器DIY】--过程帖 实现蜂鸣器驱动,并播放音乐

    跟着学习其他大佬搭建环境后,在Mu编辑器上写程序。

   目标是实现蜂鸣器驱动,并播放音乐,我选择的是《欢乐颂》。

a27e6a29-5d71-4311-bffe-4fae45c7c065.png



内容比较简单,直接上代码:


# 设置蜂鸣器连接的引脚(D13)
pwm = pwmio.PWMOut(board.D4, duty_cycle=0, frequency=440, variable_frequency=True)
button2 = digitalio.DigitalInOut(board.D2)

# 8 音阶频率(C4,D4,E4,F4,G4,A4,B4,C5)

# 欢乐颂简谱和时值数组(4/4拍,单位为秒,1为四分音符,2为二分音符,0.5为八分音符)

# 简谱音名与频率映射
note_freq = {
    " ": 1,
    "do": 131,   # 低音do
    "re": 147,   # 低音re
    "mi": 165,    # 低音mi
    "fa": 175,    # 低音mi
    "so": 180,    # 低音mi
    "la": 220,    # 低音mi
    "1": 262,   # do
    "2": 294,   # re
    "3": 330,   # mi
    "4": 349,   # fa
    "5": 360,   # so
    "6": 440,   # la
    "7": 494,   # xi
    "1'": 523,  # 高音do
    "2'": 587,  # 高音re
    "3'": 659,  # 高音mi
    "4'": 698,  # 高音fa
    "5'": 784,  # 高音so
}

# 欢乐颂主旋律(简谱和时值,单位秒)
music_notes = [
    ("3", 0.4), ("3", 0.4), ("4", 0.4), ("5", 0.4), ("5", 0.4), ("4", 0.4), ("3", 0.4), ("2", 0.4),
    ("1", 0.4), ("1", 0.4), ("2", 0.4), ("3", 0.4), ("3", 0.5), ("2", 0.2), ("2", 0.8),
    ("3", 0.4), ("3", 0.4), ("4", 0.4), ("5", 0.4), ("5", 0.4), ("4", 0.4), ("3", 0.4), ("2", 0.4),
    ("1", 0.4), ("1", 0.4), ("2", 0.4), ("3", 0.4), ("2", 0.6), ("1", 0.2), ("1", 0.8),
    ("2", 0.4), ("2", 0.4), ("3'", 0.4), ("1", 0.4),
    ("2", 0.4), ("3", 0.2), ("4", 0.2), ("3", 0.4), ("1", 0.4),
    ("2", 0.4), ("3", 0.2), ("4", 0.2), ("3", 0.4),
    ("1", 0.4), ("2", 0.4), ("so", 0.2),(" ", 0.2),

    ("3", 0.4), ("3", 0.4), ("4", 0.4), ("5", 0.4), ("5", 0.4),("4", 0.4), ("3", 0.4),
    ("4", 0.2), ("2", 0.2),
    ("1", 0.4), ("1", 0.4), ("2", 0.4), ("3", 0.4), ("2", 0.6), ("1", 0.2), ("1", 1.5)
]

# 按键防抖延迟
DEBOUNCE_TIME = 0.2  # 防抖延时(秒)

# 音符播放时长(秒)
NOTE_DURATION = 0.5  # 每个音符的最大播放时长(秒)

def play_note(note, duration):
    frequency = note_freq.get(note, 440)
    pwm.frequency = frequency
    if note.strip() == " ":
        # 空音名,不发声,休止
        time.sleep(duration)
    else:
      pwm.duty_cycle  = 2 ** 15 # = 32768  # 50% 占空比
    time.sleep(duration*2)
    pwm.duty_cycle = 0
    time.sleep(0.05)

def play_music():
    for note, dur in music_notes:
        play_note(note, dur)
    time.sleep(1)

# 停止播放音符
def stop_playing():
    pwm.duty_cycle  = 0

note_index = 0  # 当前音符的索引
last_button_state = False  # 上一次的按键状态(上拉状态下,未按下为False)
note_start_time = time.monotonic()   # 记录音符播放开始的时间
# 示例调用
while True:
    play_music()





关键词: 拾色     播放器     蜂鸣器     播放     音乐    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]