from machine import Pin, PWM
from utime import sleep_ms
class Tone:
def __init__(self, pin_number):
"""
初始化Tone类
pin_number: GPIO引脚号
"""
self.pwm = PWM(Pin(pin_number))
self.pwm.duty_u16(0) # 初始化为关闭状态
def play(self, frequency, duration_ms=None):
"""
播放指定频率的声音
frequency: 频率(Hz)
duration_ms: 持续时间(毫秒),如果为None则持续播放直到调用stop()
"""
if frequency <= 0:
self.stop()
return
# 设置频率
self.pwm.freq(int(frequency))
# 设置50%占空比
self.pwm.duty_u16(32768) # 65535 的一半
if duration_ms is not None:
sleep_ms(duration_ms)
self.stop()
def stop(self):
"""
停止播放声音
"""
self.pwm.duty_u16(0)
def __del__(self):
"""
清理PWM资源
"""
self.pwm.deinit()
# 音符频率对照表
NOTES = {
'C4': 262, # 中央C
'D4': 294,
'E4': 330,
'F4': 349,
'G4': 392,
'A4': 440,
'B4': 494,
'C5': 523,
}
# 创建Tone对象,假设蜂鸣器连接到GPIO 15
buzzer = Tone(15)
# 播放440Hz的声音持续1秒
buzzer.play(440, 1000)
# 播放音符
buzzer.play(NOTES['C4'], 500) # 播放中央C音0.5秒
# 持续播放直到手动停止
buzzer.play(440)
sleep_ms(1000)
buzzer.stop()