Arduino 蜂鸣器播放音乐

蜂鸣器

根据发声原理不同分为电压式蜂鸣器和电磁式蜂鸣器。我们使用的是电磁式蜂鸣器,接通电源后,振动膜片周期性的振动发声。需要注意的一点是,发声是在内部有电流产生磁场,使得膜片振动的一瞬间。 如果内部一直是直流电的话我们只能听到很小的一下的声音,如果需要持续的声音(就像我萌以前过生日的那种唱生日快乐歌的小玩意)应该怎么办呢?需要一个交流的驱动电路就行。最简单的方波就可以驱动。 这里我们使用的是无源蜂鸣器, 这里的源指的是振荡源,自带BUFF的就是有源,也就是直接同直流电就可以发声,无源则需要外部送入方波信号用于驱动才行。

接线

arduino 蜂鸣器
5V VCC
GND GND
8 S

第一步 蜂鸣器响起来

前面我们已经把数字IO连接到了蜂鸣器的正极,让蜂鸣器响起来只需要在数字IO上放入方波即可。

digitalWrite(buzzerPin,HIGH); //高电平
delay(100);
digitalWrite(buzzerPin,LOW);  //低电平
delay(100);

其中的100指的是100ms,这样算来通电(高电平)占空比就是50%,周期200ms,那么频率就是500Hz,这个频率实际上已经比较高了。

不同的旋律

不同的乐音有着不同的频率,下面是一张乐音频率图。
Arduino 蜂鸣器播放音乐_第1张图片

我们知道了音调的频率后,下一步就是控制音符的演奏时间。每个音符都会播放一定的时间,这样才能构成一首优美的曲子,而不是生硬的一个调的把所有的音符一股脑的都播放出来。音符节奏分为一拍、半拍、1/4拍、1/8拍,我们规定一拍音符的时间为1;半拍为0.5;1/4拍为0.25;1/8拍为0.125……,所以我们可以为每个音符赋予这样的拍子播放出来,音乐就成了。

音符

#define Do 262  
#define Re 294  
#define Mi 330  
#define Fa 349  
#define Sol 392  
#define La 440  
#define Si 494  

Arduino 蜂鸣器播放音乐_第2张图片

以《欢乐颂》为例

Arduino 蜂鸣器播放音乐_第3张图片
从简谱看,该音乐是D调的,这里的各音符对应的频率对应的是上表中D调的部分。另外,该音乐为四分之四拍,每个对应为1拍。几个特殊音符说明如下:
第一,普通音符。如第一个音符3,对应频率350,占1拍。
第二,带下划线音符,表示0.5拍。
第三,有的音符后带一个点,表示多加0.5拍,即1+0.5
第四,有的音符后带一个—,表示多加1拍,即1+1
第五,有的两个连续的音符上面带弧线,表示连音,可以稍微改下连音后面那个音的频率,比如减少或增加一些数值(需自己调试),这样表现会更流畅,其实不做处理,影响也不大。

程序

#define NTD0 -1
#define NTD1 294
#define NTD2 330
#define NTD3 350
#define NTD4 393
#define NTD5 441
#define NTD6 495
#define NTD7 556

#define NTDL1 147
#define NTDL2 165
#define NTDL3 175
#define NTDL4 196
#define NTDL5 221
#define NTDL6 248
#define NTDL7 278

#define NTDH1 589
#define NTDH2 661
#define NTDH3 700
#define NTDH4 786
#define NTDH5 882
#define NTDH6 990
#define NTDH7 112
//列出全部D调的频率
#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.25
#define SIXTEENTH 0.625
//列出所有节拍
int tune[]=                 //根据简谱列出各频率
{
  NTD3,NTD3,NTD4,NTD5,
  NTD5,NTD4,NTD3,NTD2,
  NTD1,NTD1,NTD2,NTD3,
  NTD3,NTD2,NTD2,
  NTD3,NTD3,NTD4,NTD5,
  NTD5,NTD4,NTD3,NTD2,
  NTD1,NTD1,NTD2,NTD3,
  NTD2,NTD1,NTD1,
  NTD2,NTD2,NTD3,NTD1,
  NTD2,NTD3,NTD4,NTD3,NTD1,
  NTD2,NTD3,NTD4,NTD3,NTD2,
  NTD1,NTD2,NTDL5,NTD0,
  NTD3,NTD3,NTD4,NTD5,
  NTD5,NTD4,NTD3,NTD4,NTD2,
  NTD1,NTD1,NTD2,NTD3,
  NTD2,NTD1,NTD1
};
float durt[]=                   //根据简谱列出各节拍
{
  1,1,1,1,
  1,1,1,1,
  1,1,1,1,
  1+0.5,0.5,1+1,
  1,1,1,1,
  1,1,1,1,
  1,1,1,1,
  1+0.5,0.5,1+1,
  1,1,1,1,
  1,0.5,0.5,1,1,
  1,0.5,0.5,1,1,
  1,1,1,1,
  1,1,1,1,
  1,1,1,0.5,0.5,
  1,1,1,1,
  1+0.5,0.5,1+1,
};
int length;
int tonepin=8;   //得用6号接口
void setup()
{
  pinMode(tonepin,OUTPUT);
  length=sizeof(tune)/sizeof(tune[0]);   //计算长度
}
void loop()
{
  for(int x=0;x

生日快乐歌


int PIN_SPEAKER = 8;

int length = 25;

char notes[] = "ggagCbggagDCggGECbaffECDC";

int beats[] = {1,1,2,2,2,4, 1,1,2,2,2,4, 1,1,2,2,2,2,2, 1,1,2,2,2,4,1};

int tempo = 300;

 

void playTone(int tone, int duration) {

  for (long i = 0; i < duration * 1000L; i += tone * 2) {

    digitalWrite(PIN_SPEAKER, HIGH);

    delayMicroseconds(tone);

    digitalWrite(PIN_SPEAKER, LOW);

    delayMicroseconds(tone);

  }

}

 

void playNote(char note, int duration) {

  char names[] = {'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C', 'D', 'E', 'F', 'G'};

  int tones[] = {1915, 1700, 1519, 1432, 1275, 1136, 1014, 956, 853, 759, 716, 637, 568};

 

  for (int i = 0; i < 12; i++) {

    if (names[i] == note) {

      Serial.print("value:");

      Serial.println(note);

      playTone(tones[i]*2, duration);

    }

  }

}

 

void setup() {

  pinMode(PIN_SPEAKER, OUTPUT);
  Serial.begin(115200);
}

 

void loop() {

  for (int i = 0; i < length; i++) {

    if (notes[i] == ' ') {

      delay(beats[i] * tempo); 

    } else {

      playNote(notes[i], beats[i] * tempo);

    }

    delay(tempo / 2); 

  }

}

爱拼才会赢

Arduino 蜂鸣器播放音乐_第4张图片

程序


#define NTC0 -1

#define NTC1 262

#define NTC2 294

#define NTC3 330

#define NTC4 350

#define NTC5 393

#define NTC6 441

#define NTC7 495

 

#define NTCL1 131

#define NTCL2 147

#define NTCL3 165

#define NTCL4 175

#define NTCL5 196

#define NTCL6 221

#define NTCL7 248  

 

#define NTCH1 525

#define NTCH2 589

#define NTCH3 661

#define NTCH4 700

#define NTCH5 786

#define NTCH6 882

#define NTCH7 990

//列出全部C调的频率

#define WHOLE 1

#define HALF 0.5

#define QUARTER 0.25

#define EIGHTH 0.25

#define SIXTEENTH 0.625

//列出所有节拍

int tune[]=                 //根据简谱列出各频率

{

  NTC5,NTC5,NTC6,

  NTCH1,NTC6,NTC5,NTC6,NTCH1,NTC6,NTC5,

  NTC3,NTC3,NTC3,NTC5,

  NTC6,NTC6,NTC5,NTCH3,NTCH3,NTCH2,NTCH1,

  NTCH2,NTCH1,NTCH2,

  NTCH3,NTCH3,NTCH2,NTCH3,NTCH2,NTCH1,NTCH2,NTCH1,NTC6,

 

  NTCH2,NTCH2,NTCH2,NTCH1,NTC6,NTC5,

  NTC6,NTC5,NTC5,NTCH1,NTC6,NTC5,NTC1,NTC3,

  NTC2,NTC1,NTC2,

  NTC3,NTC5,NTC5,NTC3,NTCH1,NTC7,

  NTC6,NTC5,NTC6,NTCH1,NTCH2,NTCH3,

 

  NTCH3,NTCH2,NTCH1,NTC5,NTCH1,NTCH2,NTCH3,

 

  NTCH2,NTC0,NTCH3,NTCH2,

  NTCH1,NTC0,NTCH2,NTCH1,NTC6,NTC0,

 

  NTCH2,NTC6,NTCH1,NTCH1,NTCH1,NTC6,NTC5,NTC3,

  NTC5,

  NTC5,NTC6,NTCH1,NTC7,NTC6,

  NTCH3,NTCH3,NTCH3,NTCH3,NTCH2,NTCH2,NTCH1,

  NTC6,NTCH3,NTCH2,NTCH1,NTCH2,NTCH1,NTC6,

  NTCH1,

};

float durt[]=                   //根据简谱列出各节拍

{

0.5,0.25,0.25,

1.5,0.5,0.5,0.25,0.25,0.5,0.5,

1+1+1,0.5,0.25,0.25,

1.5,0.5,0.5,0.5,0.25,0.25,0.5,

1+1+1,0.5,0.5,

0.5,0.5,0.5,0.25,0.25,0.5,0.25,0.25,0.5,

0.5,0.5,0.5,0.25,0.25,1+1,

0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,

1+1+1,0.5,0.5,

 

 

1.5,0.5,0.5,0.5,0.5,0.5,

1.5,0.5,1,0.5,0.25,0.25,

1.5,0.5,0.5,0.5,0.5,0.25,0.25,

1+1+1,0.5,0.25,0.25,

1,0.5,0.25,0.25,1,1,

0.5,0.5,0.5,0.5,1,0.25,0.25,0.5,

1+1+1+1,

0.5,0.5,0.5,0.5,1+1,

0.5,0.5,0.5,0.5,1.5,0.25,0.25,

1.5,0.5,1,0.25,0.25,0.25,0.25,1+1+1+1,

 

};

int length;

int tonepin=8;   //得用8号接口

void setup()

{

  pinMode(tonepin,OUTPUT);

  length=sizeof(tune)/sizeof(tune[0]);   //计算长度

}

void loop()

{

  for(int x=0;x

遇见

程序


#define NOTE_C0   -1 
#define NOTE_CL1 131 
#define NOTE_CL2 147 
#define NOTE_CL3 165 
#define NOTE_CL4 175 
#define NOTE_CL5 196 
#define NOTE_CL6 221 
#define NOTE_CL7 248 


#define NOTE_C1 262 
#define NOTE_C2 294 
#define NOTE_C3 330 
#define NOTE_C4 350 
#define NOTE_C5 393 
#define NOTE_C6 441 
#define NOTE_C7 495 


#define NOTE_CH1 525
#define NOTE_CH2 589 
#define NOTE_CH3 661 
#define NOTE_CH4 700 
#define NOTE_CH5 786 
#define NOTE_CH6 882 
#define NOTE_CH7 990 

//该部分是定义是把每个音符和频率值对应起来,全部都打上了,后面可以随意编写,直接调用(也可以用到哪个定义哪个)

#define WHOLE 1 
#define HALF 0.5 
#define QUARTER 0.25 
#define EIGHTH 0.25 
#define SIXTEENTH 0.625  
//该部分是对应了节拍

int tune[] =  
{
NOTE_C0,NOTE_C0,NOTE_C0,NOTE_C5,NOTE_C3,
NOTE_C3,NOTE_C5,NOTE_C2,NOTE_C2,NOTE_C3,NOTE_C2,
NOTE_C2,NOTE_C1,NOTE_C1,NOTE_C0,NOTE_C1,NOTE_CL7,
NOTE_CL6,NOTE_CL7,NOTE_C1,NOTE_CL7,NOTE_C1,NOTE_C1,

NOTE_C2,NOTE_C3,
NOTE_C3,NOTE_C0,NOTE_C0,NOTE_C5,NOTE_C3,
NOTE_C3,NOTE_C5,NOTE_C2,NOTE_C2,NOTE_C3,NOTE_C2,
NOTE_C2,NOTE_C1,NOTE_C1,NOTE_C0,NOTE_C1,NOTE_CL7,
NOTE_CL6,NOTE_CL7,NOTE_C1,NOTE_CL7,NOTE_CL7,NOTE_C1,NOTE_C1,NOTE_C2,
NOTE_C1,NOTE_C0,NOTE_C0,NOTE_C5,NOTE_C6,NOTE_C7,


NOTE_C4,NOTE_C3,NOTE_C2,NOTE_C1,NOTE_C7,NOTE_C5,NOTE_C3,
NOTE_C3,NOTE_C5,NOTE_C2,NOTE_C2,NOTE_C3,NOTE_C2,
NOTE_C2,NOTE_C1,NOTE_C1,NOTE_C0,NOTE_C1,NOTE_CL7,
NOTE_CL6,NOTE_CL7,NOTE_C1,NOTE_CL7,NOTE_CL7,NOTE_C1,NOTE_C1,NOTE_C2,
NOTE_C3,NOTE_C0,NOTE_C0,NOTE_C5,NOTE_C3,
NOTE_C3,NOTE_C5,NOTE_CH2,NOTE_CH2,NOTE_CH1,NOTE_C7,
NOTE_C7,NOTE_CH6,NOTE_C0,NOTE_C0,NOTE_C1,NOTE_CL7,
NOTE_CL6,NOTE_CL7,NOTE_C1,NOTE_CL7,NOTE_CL7,NOTE_C1,NOTE_C1,NOTE_C2,
NOTE_C1,NOTE_C0,NOTE_C0,NOTE_C5,NOTE_C6,NOTE_C7,
NOTE_CH1,NOTE_C7,NOTE_CH1,NOTE_C7,NOTE_C6,NOTE_C5,NOTE_C6,
NOTE_C6,NOTE_C5,NOTE_C5,NOTE_C5,NOTE_C1,NOTE_C2,NOTE_C3,
NOTE_C4,NOTE_C3,NOTE_C4,NOTE_C5,NOTE_C1,NOTE_C2,NOTE_C3,
NOTE_C3,NOTE_C3,NOTE_C0,NOTE_C0,NOTE_C5,NOTE_C6,NOTE_C7,
NOTE_C1,NOTE_C7,NOTE_CH1,NOTE_CH3,NOTE_CH1,NOTE_CH2,NOTE_CH3,
NOTE_CH3,NOTE_C5,NOTE_C5,NOTE_C5,NOTE_C1,NOTE_C2,NOTE_C3,
NOTE_C4,NOTE_C3,NOTE_C4,NOTE_C3,NOTE_C2,NOTE_C2,NOTE_C1,
NOTE_CL7,NOTE_C1,NOTE_C1,NOTE_C0,NOTE_C5,NOTE_C6,NOTE_C7,
NOTE_CH1,NOTE_C7,NOTE_CH1,NOTE_CH2,NOTE_CH1,NOTE_C7,NOTE_C6,
NOTE_C6,NOTE_C5,NOTE_C0,NOTE_C0,NOTE_C1,NOTE_C2,NOTE_C3,
NOTE_C4,NOTE_C3,NOTE_C4,NOTE_C5,NOTE_C1,NOTE_C1,NOTE_C6,
NOTE_C6,NOTE_C5,NOTE_C5,NOTE_C0,NOTE_C5,NOTE_C6,NOTE_C7,
NOTE_CH1,NOTE_C7,NOTE_CH1,NOTE_CH2,NOTE_CH1,NOTE_CH2,NOTE_CH3,
NOTE_CH3,NOTE_C5,NOTE_C5,NOTE_C0,NOTE_C1,NOTE_C2,NOTE_C3,NOTE_C4,
NOTE_C4,NOTE_C3,NOTE_C4,NOTE_C5,NOTE_C1,NOTE_C2,
NOTE_C2,NOTE_C3,NOTE_C2,NOTE_C1,NOTE_C1,NOTE_C1,NOTE_C0,NOTE_C0,
NOTE_C0,NOTE_C0,NOTE_C0,NOTE_C5,NOTE_C6,NOTE_C7,
NOTE_CH1,NOTE_C7,NOTE_CH1,NOTE_C7,NOTE_C6,NOTE_C5,NOTE_C4,
NOTE_C4,NOTE_C5,NOTE_C5,NOTE_C0,NOTE_C0,

};

float duration[]= 
{ 
1,1,1,0.5+0.5,//听见
1,0.5+0.5,1,0.5+0.5,//冬天的离
0.5+0.5,1,1,0.5+0.5,//开  我在
0.5+0.5,0.5+0.5,0.5+0.5,0.5+0.5,//某年某月醒过来
1,1,1,0.5+0.5,//我想
1,0.5+0.5,1,0.5+0.5,//我等我期
0.5+0.5,1,1,0.5+0.5,//待未来
0.5+0.5,0.5+0.5,0.5+0.5,0.5+0.5,//却不能理智安
1,1,0.5+0.5,0.5+0.5,//排
0.5+0.5,0.5+0.5,1,0.5+0.5,//阴天
1,0.5+0.5,1,0.5+0.5,//傍晚车窗
0.5+0.5,1,1,0.5+0.5,//外  未来
0.5+0.5,0.5+0.5,0.5+0.5,0.5+0.5,//有一个人在等
1,1,1,0.5+0.5,//待   向左
1,0.5+0.5,1,0.5+0.5,//向右向前
0.5+0.5,1,1,0.5+0.5,//看  爱要
0.5+0.5,0.5+0.5,0.5+0.5,0.5+0.5,//拐几个弯才
1,1,0.5+0.5,0.5+0.5,//来  我遇见
1,0.5+0.5,0.5+0.5,0.5+0.5,//谁会有怎样的对
0.5+0.5,1,0.5+0.5,0.5+0.5,//白  我等的
1,0.5+0.5,0.5+0.5,0.5+0.5,//人他在多远的未
0.5+0.5,1,0.5+0.5,0.5+0.5,//来  我听见 
1,0.5+0.5,0.5+0.5,0.5+0.5,//风来自地铁和人
0.5+0.5,1,0.5+0.5,0.5+0.5,//海  我排着
1,0.5+0.5,0.5+0.5,0.5+0.5,//队  拿着爱的号
0.5+0.5,1,0.5+0.5,0.5+0.5,//码牌  我往前
1,0.5+0.5,0.5+0.5,0.5+0.5,//飞  飞过一片时间
0.5+0.5,1,0.5+0.5,0.5+0.5,//海  我们也
1,0.5+0.5,0.5+0.5,0.5+0.5,//曾在爱情里受伤
0.5+0.5,1,0.5+0.5,0.5+0.5,//害   我看着
1,0.5+0.5,0.5+0.5,0.5+0.5,//路  梦的路口 有点
0.5+0.5,1,0.5+0.5,0.5+0.5,//窄   我遇见
1,0.5+0.5,0.5+0.5,1,//你 是最美丽的
0.25+0.25+0.25+0.25,0.5+0.5,1,1,//意外
1,1,0.5+0.5,0.5+0.5,//终有一
1,0.5+0.5,0.5+0.5,0.5+0.5,//天我的谜底会揭
0.5+0.5,1,1,1,//开

};
//这部分是整首曲子的节拍部分,也定义个序列duration,浮点(数组的个数和前面音符的个数是一样的,一一对应)

int length;//这里定义一个变量,后面用来表示共有多少个音符

int tonePin=8;//蜂鸣器的端口,数字模拟都可以

void setup()

{

pinMode(tonePin,OUTPUT);//设置蜂鸣器的pin为输出模式

length = sizeof(tune)/sizeof(tune[0]);//这里用了一个sizeof函数,可以查出tone序列里有多少个音符

}

void loop() 

{  

  for(int x=0;x

QQ交流群:247620001 验证信息:arduino

你可能感兴趣的:(Arduino,stm创客教育,Maker)