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)

因为你可以使用不同的频率,你可以创造一个完整的音符阵列。网上有一些音符频率的列表,其中许多可以追溯到Brett Hagman在Github上的Arduino音调库。我们将使用这些值创建一个列表,以便在代码早期播放任何歌曲。

  1. 在引脚22上导入必要的库并初始化PWM。
from machine import Pin, PWM
from utime import sleep
 
buzzer = PWM(Pin(22))
  1. 使用下列值创建一个名为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)
  1. 创建一个名为bequiet的函数,通过将duty_u16更改为0来使蜂鸣器静音。
def bequiet():
    buzzer.duty_u16(0)
  1. 创建一个名为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秒的睡眠状态。如果你想要更快的节奏,你可以降低时间。如果你想要慢节奏,那就加快节奏。

  1. 使用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)