**这是本文档旧的修订版!**
用蜂鸣器播放音乐
1. 编程蜂鸣器
1.首先从machine库导入引脚和PWM,从utime库导入sleep.
from machine import Pin, PWM from utime import sleep
2.初始化PWM(也就是脉宽调制)到管脚22,并分配它为变量buzzer。
buzzer = PWM(Pin(22))
3.给变量buzzer分配一个频率属性,选择10到12,000之间的数值,数值越大音调越高,我们可以设定为500.
buzzer.freq(500)
4.将蜂鸣器对象的duty_u16属性设置为1000,这就能让蜂鸣器尽可能地响。更低的值更安静,0根本没有声音。
buzzer.duty_u16(1000)
5.设置1秒的延迟,然后将duty设置为0,这样声音就会停止。如果不这样做,即使程序执行完毕,嗡嗡声也会继续。
sleep(1) buzzer.duty_u16(0)
最终的代码:
from machine import Pin, PWM from utime import sleep buzzer = PWM(Pin(22)) buzzer.freq(500) buzzer.duty_u16(1000) sleep(1) buzzer.duty_u16(0)
2. 播放音乐
因为你可以使用不同的频率,你可以创造一个完整的音符阵列。网上有一些音符频率的列表,其中许多可以追溯到Brett Hagman在Github上的Arduino音调库。我们将使用这些值创建一个列表,以便在代码早期播放任何歌曲。
- 在引脚22上导入必要的库并初始化PWM。
from machine import Pin, PWM from utime import sleep buzzer = PWM(Pin(22))
- 使用下列值创建一个名为notes的字典。
tones = { "B0": 31, "C1": 33, "CS1": 35, "D1": 37, "DS1": 39, "E1": 41, "F1": 44, "FS1": 46, "G1": 49, "GS1": 52, "A1": 55, "AS1": 58, "B1": 62, "C2": 65, "CS2": 69, "D2": 73, "DS2": 78, "E2": 82, "F2": 87, "FS2": 93, "G2": 98, "GS2": 104, "A2": 110, "AS2": 117, "B2": 123, "C3": 131, "CS3": 139, "D3": 147, "DS3": 156, "E3": 165, "F3": 175, "FS3": 185, "G3": 196, "GS3": 208, "A3": 220, "AS3": 233, "B3": 247, "C4": 262, "CS4": 277, "D4": 294, "DS4": 311, "E4": 330, "F4": 349, "FS4": 370, "G4": 392, "GS4": 415, "A4": 440, "AS4": 466, "B4": 494, "C5": 523, "CS5": 554, "D5": 587, "DS5": 622, "E5": 659, "F5": 698, "FS5": 740, "G5": 784, "GS5": 831, "A5": 880, "AS5": 932, "B5": 988, "C6": 1047, "CS6": 1109, "D6": 1175, "DS6": 1245, "E6": 1319, "F6": 1397, "FS6": 1480, "G6": 1568, "GS6": 1661, "A6": 1760, "AS6": 1865, "B6": 1976, "C7": 2093, "CS7": 2217, "D7": 2349, "DS7": 2489, "E7": 2637, "F7": 2794, "FS7": 2960, "G7": 3136, "GS7": 3322, "A7": 3520, "AS7": 3729, "B7": 3951, "C8": 4186, "CS8": 4435, "D8": 4699, "DS8": 4978 }
3.为你的歌曲创建一个音符列表(又名数组)。用字母P表示音乐中的停顿。每个音符都应该用引号括起来。
song = ["E5","G5","A5","P","E5","G5","B5","A5","P","E5","G5","A5","P","G5","E5"]
向在这个帖子上分享这段著名riff音符的人们致敬。
4.创建一个名为playtone的函数,可以使用任意频率并以最大音量播放。
def playtone(frequency): buzzer.duty_u16(1000) buzzer.freq(frequency)
5.创建一个名为bequiet的函数,通过将duty_u16更改为0来使蜂鸣器静音。
def bequiet(): buzzer.duty_u16(0)
6.创建一个名为playsong的函数,您将使用它来遍历音符数组并播放每一个音符,或者在看到P时暂停。
def playsong(mysong): for i in range(len(mysong)): if (mysong[i] == "P"): bequiet() else: playtone(tones[mysong[i]]) sleep(0.3) bequiet()
是这样的。首先,我们创建一个for循环来遍历myssong数组中的所有值。如果值等于P,则触发be quiet;如果值不等于P,则触发playtone。注意,playtone需要一个数字频率值,因此我们必须从音调列表中获取每个音符的数字。如果我们只是播放tone(myssong [i]),它将失败,因为它将尝试播放字符串“E5”,而不是频率659,这是它需要的整数。
对于每个音调或暂停,系统维持0.3秒的睡眠状态。如果你想要更快的节奏,你可以降低时间。如果你想要慢节奏,那就加快节奏。
7.使用song参数触发playsong函数。
playsong(song)
运行此代码时,您将听到蜂鸣器播放熟悉的旋律。完整的代码应该是这样的:
from machine import Pin, PWM from utime import sleep buzzer = PWM(Pin(15)) tones = { "B0": 31, "C1": 33, "CS1": 35, "D1": 37, "DS1": 39, "E1": 41, "F1": 44, "FS1": 46, "G1": 49, "GS1": 52, "A1": 55, "AS1": 58, "B1": 62, "C2": 65, "CS2": 69, "D2": 73, "DS2": 78, "E2": 82, "F2": 87, "FS2": 93, "G2": 98, "GS2": 104, "A2": 110, "AS2": 117, "B2": 123, "C3": 131, "CS3": 139, "D3": 147, "DS3": 156, "E3": 165, "F3": 175, "FS3": 185, "G3": 196, "GS3": 208, "A3": 220, "AS3": 233, "B3": 247, "C4": 262, "CS4": 277, "D4": 294, "DS4": 311, "E4": 330, "F4": 349, "FS4": 370, "G4": 392, "GS4": 415, "A4": 440, "AS4": 466, "B4": 494, "C5": 523, "CS5": 554, "D5": 587, "DS5": 622, "E5": 659, "F5": 698, "FS5": 740, "G5": 784, "GS5": 831, "A5": 880, "AS5": 932, "B5": 988, "C6": 1047, "CS6": 1109, "D6": 1175, "DS6": 1245, "E6": 1319, "F6": 1397, "FS6": 1480, "G6": 1568, "GS6": 1661, "A6": 1760, "AS6": 1865, "B6": 1976, "C7": 2093, "CS7": 2217, "D7": 2349, "DS7": 2489, "E7": 2637, "F7": 2794, "FS7": 2960, "G7": 3136, "GS7": 3322, "A7": 3520, "AS7": 3729, "B7": 3951, "C8": 4186, "CS8": 4435, "D8": 4699, "DS8": 4978 } song = ["E5","G5","A5","P","E5","G5","B5","A5","P","E5","G5","A5","P","G5","E5"] def playtone(frequency): buzzer.duty_u16(1000) buzzer.freq(frequency) def bequiet(): buzzer.duty_u16(0) def playsong(mysong): for i in range(len(mysong)): if (mysong[i] == "P"): bequiet() else: playtone(tones[mysong[i]]) sleep(0.3) bequiet() playsong(song)