Arduino使用蜂鸣器演奏音乐 对比tone函数与digitalWrite函数
在Arduino上使用蜂鸣器演奏音乐,配件和程序简单容易实现。
这里使用KY-006蜂鸣器,选用无源蜂鸣器才能更好演奏。
蜂鸣器贴上纸或膜声音更大,都没有也可以用胶条。
蜂鸣器连接Arduino可以不用杜邦线,直接插上即可,但插的位置只能选择Arduino的GND以及相邻管脚。我们这里选用12#13#和GND三个相邻管脚。
Arduino的IDE我们使用tone函数更简单。
void setup()
{
pinMode(12, OUTPUT);
}
void loop()
{
tone(12,1000);
}
这样可以发声了。
使用digitalWrite函数要用延迟来控制音调。
void setup()
{
pinMode(12, OUTPUT);
}
void loop()
{
int i;
while (1)
{
for (i = 0; i < 200; i++) //辒出一个频率的声音
{
digitalWrite(12, HIGH); //发声音
delay(1);//延时1ms
digitalWrite(12, LOW); //不发声音
delay(1);//延时ms
}
for (i = 0; i < 100; i++) //辒出另一个频率癿声音
{
digitalWrite(12, HIGH); //发声音
delay(2);//延时2ms
digitalWrite(12, LOW); //不发声音
delay(2);//延时2ms
}
}
}
上面是模拟报警音。
可以设置tone与digitalWrite函数演奏音乐。
tone函数要使用蜂鸣器频率来设置不同音调。
digitalWrite使用蜂鸣器周期设置不同音调。
上图在使用KY-006蜂鸣器时参考的数值。
这里小星的乐谱。
乐谱填入数组中。
下面是IDE中的程序,使用的是tong函数。
// 低音 do、re、mi、fa、sol、la、xi
#define D1 262
#define D2 294
#define D3 330
#define D4 349
#define D5 392
#define D6 440
#define D7 494
// 中音 do、re、mi、fa、sol、la、xi
#define Z1 523
#define Z2 587
#define Z3 659
#define Z4 698
#define Z5 784
#define Z6 880
#define Z7 988
// 高音 do、re、mi、fa、sol、la、xi
#define G1 1046
#define G2 1175
#define G3 1318
#define G4 1397
#define G5 1563
#define G6 1760
#define G7 1967
int tune[]=
{
Z1,Z1,Z5,Z5,Z6,Z6,Z5,
Z4,Z4,Z3,Z3,Z2,Z2,Z1,
Z5,Z5,Z4,Z4,Z3,Z3,Z2,
Z5,Z5,Z4,Z4,Z3,Z3,Z2,
Z1,Z1,Z5,Z5,Z6,Z6,G1,Z5,
Z4,Z4,Z3,Z3,Z2,Z2,Z1,
};
// 每拍的长度
float durt[]=
{
1,1,1,1,1,1,2,
1,1,1,1,1,1,2,
1,1,1,1,1,1,2,
1,1,1,1,1,1,2,
1,1,1,1,1,0.5,0.5,2,
1,1,1,1,1,1,2,
};
int length;
void setup() {
// put your setup code here, to run once:
pinMode(12, OUTPUT);
length=sizeof(tune)/sizeof(tune[0]);
}
void loop() {
// put your main code here, to run repeatedly:
for (int i = 0; i < length; i++) {
tone(12,tune[i]); //扬声器接口,频率, tone
delay(durt[i]*500); // 持续时间
noTone(12); //停止发声
}
delay(6*500);
}
下面的程序,使用的是digitalWrite函数。
// 高音 do、re、mi、fa、sol、la、xi
#define G1 478
#define G2 426
#define G3 379
#define G4 358
#define G5 320
#define G6 284
#define G7 252
// 中音 do、re、mi、fa、sol、la、xi
#define Z1 956
#define Z2 852
#define Z3 759
#define Z4 716
#define Z5 638
#define Z6 568
#define Z7 506
// 低音 do、re、mi、fa、sol、la、xi
// 根据乐谱来定义每个节拍是哪个音
// int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
#define D7 1012
#define D6 1136
#define D5 1276
#define D4 1433
#define D3 1515
#define D2 1701
#define D1 1908
int tune[]=
{
Z1,Z1,Z5,Z5,Z6,Z6,Z5,
Z4,Z4,Z3,Z3,Z2,Z2,Z1,
Z5,Z5,Z4,Z4,Z3,Z3,Z2,
Z5,Z5,Z4,Z4,Z3,Z3,Z2,
Z1,Z1,Z5,Z5,Z6,Z6,Z5,
Z4,Z4,Z3,Z3,Z2,Z2,Z1,
};
// 每拍的长度
int durt[]=
{
1,1,1,1,1,1,2,
1,1,1,1,1,1,2,
1,1,1,1,1,1,2,
1,1,1,1,1,1,2,
1,1,1,1,1,1,2,
1,1,1,1,1,1,2,
};
int length;
int speakerPin=12;
int tempo = 500;
void setup()
{
pinMode(speakerPin,OUTPUT);
length=sizeof(tune)/sizeof(tune[0]);
}
void playTone(int tones, int duration) {
for (long i = 0; i < duration * 1000L; i += tones * 2) {
digitalWrite(speakerPin, HIGH);
delayMicroseconds(tones);
digitalWrite(speakerPin, LOW);
delayMicroseconds(tones);
}
delay(1);
}
void loop()
{
for(int x=0;x<length;x++)
{
playTone(tune[x], durt[x]*tempo);
}
delay(2000);
}
可以结合前面的实验,演奏时点亮LED,Arduino链接如下:
登录后方可回帖