该任务需要用到DFRobot音频 1738-1142-ND,其数据手册如下
根据文档中对音频的接线定义,使用PWM对蜂鸣器的声音频率进行控制

选择ESP32-S3 Reverse TFT Feather的D10引脚作为PWM输出
buzzer = pwmio.PWMOut( board.D10, duty_cycle=0, frequency=440, variable_frequency=True # 允许后续更改频率(否则会报 Invalid variable_frequency) )
定义do re mi fa so la si do八个音对应的频率
NOTES = {
"C4": 261.63,
"D4": 293.66,
"E4": 329.63,
"F4": 349.23,
"G4": 392.00,
"A4": 440.00,
"B4": 493.88,
"C5": 523.25,
}每个音发声300ms,每个音间隙50ms,定义播放函数
DURATION_SEC = 0.30 # 每个音发声 300 ms GAP_SEC = 0.05 # 音间隙 50 ms def play_note(freq, dur): buzzer.frequency = int(freq) # 变更为目标音高(Hz) buzzer.duty_cycle = 32768 # 50%占空比(0..65535) time.sleep(dur) buzzer.duty_cycle = 0 # 关掉蜂鸣器
在主循环中,循环播放这八个音
while True: for name in ["C4","D4","E4","F4","G4","A4","B4","C5"]: play_note(NOTES[name], DURATION_SEC) time.sleep(GAP_SEC)
根据这个原理,可以播放音乐,首先定义常用音对应的频率
# 常用音名到频率(Hz),十二平均律
N = {
"C4": 261.63, "D4": 293.66, "E4": 329.63, "F4": 349.23,
"G4": 392.00, "A4": 440.00, "B4": 493.88,
"C5": 523.25, "D5": 587.33, "E5": 659.25, "F5": 698.46, "G5": 783.99
}设定音乐的节奏
# 设定速度与时值 TEMPO_BPM = 120 # 每分钟 120 拍 BEAT_SEC = 60.0 / TEMPO_BPM QUARTER = BEAT_SEC # 四分音符时长 EIGHTH = BEAT_SEC / 2.0 # 八分音符 HALF = BEAT_SEC * 2.0 # 二分音符 REST = 0.03 # 音符之间的断开(Legato/断奏间隙,可按需微调)
编写一个数组,用于存放歌曲《一闪一闪亮晶晶》的旋律
MELODY = [ ( "C4", QUARTER), ( "C4", QUARTER), ( "G4", QUARTER), ( "G4", QUARTER), ( "A4", QUARTER), ( "A4", QUARTER), ( "G4", HALF), # How I wonder what you are, ( "F4", QUARTER), ( "F4", QUARTER), ( "E4", QUARTER), ( "E4", QUARTER), ( "D4", QUARTER), ( "D4", QUARTER), ( "C4", HALF), # Up above the world so high, ( "G4", QUARTER), ( "G4", QUARTER), ( "F4", QUARTER), ( "F4", QUARTER), ( "E4", QUARTER), ( "E4", QUARTER), ( "D4", HALF), # Like a diamond in the sky. ( "G4", QUARTER), ( "G4", QUARTER), ( "F4", QUARTER), ( "F4", QUARTER), ( "E4", QUARTER), ( "E4", QUARTER), ( "D4", HALF), # A' 段(回到开头) ( "C4", QUARTER), ( "C4", QUARTER), ( "G4", QUARTER), ( "G4", QUARTER), ( "A4", QUARTER), ( "A4", QUARTER), ( "G4", HALF), ( "F4", QUARTER), ( "F4", QUARTER), ( "E4", QUARTER), ( "E4", QUARTER), ( "D4", QUARTER), ( "D4", QUARTER), ( "C4", HALF), ]
定义音乐播放函数
def play(freq_hz: float, dur_s: float, duty=0.5): """在给定频率下发声 dur_s 秒;duty 为占空比(0..1)。""" buzzer.frequency = int(freq_hz) buzzer.duty_cycle = int(65535 * duty) time.sleep(dur_s - REST) # 留出一点断奏间隙 buzzer.duty_cycle = 0 time.sleep(REST)
在主循环中,循环播放《一闪一闪亮晶晶》
while True: for note, dur in MELODY: if note is None: # 休止符(当前示例没有用到) buzzer.duty_cycle = 0 time.sleep(dur) else: play(N[note], dur, duty=0.45) # 适当降低占空比,让声音更柔和 time.sleep(1.0) # 一遍结束,停顿再来
由于不能放视频,音乐播放将在成果帖中展示
代码内容如下
我要赚赏金
