这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【Let'sdo第3期-拾色播放器DIY】—蜂鸣器播放八阶音符

共1条 1/1 1 跳转至

【Let'sdo第3期-拾色播放器DIY】—蜂鸣器播放八阶音符

工程师
2025-12-14 18:18:54     打赏

       用蜂鸣器播放八阶音符是控制I/O口输出一定频率的波形,这里使用PWM输出对应的波形。

       设备接线是D5引脚接蜂鸣器的控制引脚。

       需要添加PWM库文件(不需要往lib文件夹复制文件)

import pwmio

       PWM初始化代码为

pwm0 = pwmio.PWMOut(board.D5, duty_cycle=0, frequency=1000, variable_frequency=True)

      完整代码如下

import board
import digitalio
import time
import displayio
import terminalio
from adafruit_display_text import label
import neopixel
import pwmio

# 定义按键变量
Button2_flag = 0


# 初始化板载按键D0/BOOT0,按下接地
button0 = digitalio.DigitalInOut(board.BUTTON)
button0.switch_to_input(pull=digitalio.Pull.UP)

# 初始化板载按键D1,按下接VCC
button1 = digitalio.DigitalInOut(board.D1)
button1.switch_to_input(pull=digitalio.Pull.DOWN)

# 初始化板载按键D2,按下接VCC
button2 = digitalio.DigitalInOut(board.D2)
button2.switch_to_input(pull=digitalio.Pull.DOWN)

# 初始化板载LED  
led0 = digitalio.DigitalInOut(board.LED)  
led0.direction = digitalio.Direction.OUTPUT  
led0.value = True  

# 初始化PWMOut,接蜂鸣器控制脚
pwm0 = pwmio.PWMOut(board.D5, duty_cycle=0, frequency=1000, variable_frequency=True)
# 8音阶频率(C4, D4, E4, F4, G4, A4, B4, C5)
note_names = ['C4', 'D4', 'E4', 'F4', 'G4', 'A4', 'B4', 'C5']
frequencies = [261, 293, 329, 349, 392, 440, 493, 523]
# 音符播放控制函数
def play_note(note):
    if note in range(len(note_names)):
        names = note_names[note]
        freq = frequencies[note]
        print(f"Playing {names} at {freq} Hz")
        pwm0.frequency = int(freq)
        pwm0.duty_cycle = 2 ** 15
    else:
        print(f"Note {names} is not valid in the scale")
# 停止播放音符
def stop_playing():
    pwm0.duty_cycle = 0
# 当前音符的索引
note_index = 0
# 记录音符播放开始的时间
note_start_time = time.monotonic()

# 主循环
while True:
    led0.value = True
    time.sleep(0.05)

    # 读取按键2
    if button2.value:
        print("button1按下")
        if Button2_flag:
            Button2_flag = 0
        else:
            Button2_flag = 1

    #八阶音符
    if Button2_flag:
        # 停止当前音符(如果正在播放)
        stop_playing()
        # 播放下一个音符
        play_note(note_index)
        # 若达到最后一个音符则从头开始,切换到下一个音符
        note_index = (note_index + 1) % len(note_names)
        # 重置音符开始播放的时间
        note_start_time = time.monotonic()
        # 防抖处理
        time.sleep(0.1)

        # 超过最大播放时长后,自动停止播放
        if time.monotonic() - note_start_time > 0.5:
            stop_playing()
            # 记录下一个音符的开始时间
            note_start_time = time.monotonic()
        time.sleep(0.25)
    else:
        # 停止播放
        stop_playing()

    led0.value = False
    time.sleep(0.05)

      按D2按键可以开始或暂停播放。效果如视频

       如果D2和蜂鸣器之间接接近传感器的话可以实现靠近播放。




关键词: 拾色播放器    

共1条 1/1 1 跳转至

回复

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