用蜂鸣器播放八阶音符是控制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和蜂鸣器之间接接近传感器的话可以实现靠近播放。
我要赚赏金
