【雕爺學編程】Arduino動手做(49)---有源和無源蜂鳴器模塊5

37款傳感器與模塊的提法,在網絡上廣泛流傳,其實Arduino能夠兼容的傳感器模塊肯定是不止37種的。鑑於本人手頭積累了一些傳感器和執行器模塊,依照實踐出真知(一定要動手做)的理念,以學習和交流爲目的,這裏準備逐一動手試試多做實驗,不管成功與否,都會記錄下來——小小的進步或是搞不掂的問題,希望能夠拋磚引玉。

【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)
實驗四十九:有源蜂鳴器模塊 低電平觸發蜂鳴器 控制板發聲傳感器智能小車

 

程序十一:三角波發生器的警報聲
實驗開源仿真編程(Linkboy V4.63)

程序十二:祝你生日快樂
實驗開源仿真編程(Linkboy V4.63)

Arduino實驗場景圖

程序十三:循環播放中音
實驗開源圖形編程(Mind+、編玩邊學)

【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)

實驗四十九:有源蜂鳴器模塊 低電平觸發蜂鳴器 控制板發聲傳感器智能小車

程序十四:控制無源蜂鳴器發出兩隻老虎音調的聲音

Arduino實驗開源代碼

 

/*
  【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)
  程序十四:播放二隻老虎樂曲
*/

int buzzer=3;           //設定蜂鳴器接腳為D3
int duration = 500;
int aSo = 392;          //定義音符頻率
int bDo = 523;
int bRe = 587;
int bMi = 659;
int bFa = 698;
int bSo = 784;
int bLa = 880;
int bSi = 988;
int bDDo = 1047;

void setup(){
pinMode(buzzer,OUTPUT);   //設定蜂鳴器為輸出
}

void loop(){
  tone(3,bDo,duration);
  delay(600);
  tone(3,bRe,duration);
  delay(600);
  tone(3,bMi,duration);
  delay(600);
  tone(3,bDo,duration);
  delay(800);
  
  tone(3,bDo,duration);
  delay(600);
  tone(3,bRe,duration);
  delay(600);
  tone(3,bMi,duration);
  delay(600);
  tone(3,bDo,duration);
  delay(800);
  
  tone(3,bMi,duration);
  delay(600);
  tone(3,bFa,duration);
  delay(600);
  tone(3,bSo,duration);
  delay(800);
  
  tone(3,bMi,duration);
  delay(600);
  tone(3,bFa,duration);
  delay(600);
  tone(3,bSo,duration);
  delay(800);

  tone(3,bSo,duration);
  delay(600);
  tone(3,bLa,duration);
  delay(600);
  tone(3,bSo,duration);
  delay(600);
  tone(3,bFa,duration);
  delay(600);
  tone(3,bMi,duration);
  delay(700);
  tone(3,bDo,duration);
  delay(800);

  tone(3,bSo,duration);
  delay(600);
  tone(3,bLa,duration);
  delay(600);
  tone(3,bSo,duration);
  delay(600);
  tone(3,bFa,duration);
  delay(600);
  tone(3,bMi,duration);
  delay(700);
  tone(3,bDo,duration);
  delay(800);

  tone(3,bDo,duration);
  delay(700);
  tone(3,aSo,duration);
  delay(700);
  tone(3,bDo,duration);
  delay(800);

  tone(3,bDo,duration);
  delay(700);
  tone(3,aSo,duration);
  delay(700);
  tone(3,bDo,duration);
  delay(800);
  delay(2000);
}

  

tone()函數說明:
tone(pin, frequency, duration)
pin=訊號接口,frequency=頻率,duration=間距
實驗使用到的音階有Do(523Hz), Re (587Hz), Mi(659Hz), Fa(698Hz), So(784Hz), La(880Hz), Si(988Hz) 到高音 Do (1047Hz)

 

要讓蜂鳴器唱歌基本上就是讓蜂鳴器可以產生不同頻率的聲音,頻率的單位是赫茲(Hz),也就是每秒振動多少次。

 

1939年的一次國際會議把 A (La) = 440Hz 確定爲國際標準音,又名演奏會音高。 1955年,這一標準被國際標準化組織認可,並於1975年確定下來。
換句話說~我們只要讓一個東西能以每秒振動440下,聽到的聲音就是A。

音階--頻率對照表(單位:Hz)

【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)

實驗四十九:有源蜂鳴器模塊 低電平觸發蜂鳴器 控制板發聲傳感器智能小車

程序十五:播放do re mi fa sol la si

Arduino參考開源代碼

 

/*
  【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)
  程序十五:播放do re mi fa sol la si
*/

const int buzzPin = 3;//無源蜂鳴器接D3
int delayTime = 200;

void setup() {
  // 把你的設置代碼放在這裏,運行一次
  pinMode(buzzPin, OUTPUT);//設置爲輸出
}

void loop() {
  // 把你的主要代碼放在這裏,重複運行
  tone(buzzPin, 262, 150);
  delay(delayTime);
  noTone(buzzPin);
  tone(buzzPin, 294, 150);
  delay(delayTime);
  noTone(buzzPin);
  tone(buzzPin, 330, 150);
  delay(delayTime);
  noTone(buzzPin);
  tone(buzzPin, 349, 150);
  delay(delayTime);
  noTone(buzzPin);
  tone(buzzPin, 292, 150);
  delay(delayTime);
  noTone(buzzPin);
  tone(buzzPin, 440, 150);
  delay(delayTime);
  noTone(buzzPin);
  tone(buzzPin, 494, 150);
  delay(delayTime);
  noTone(buzzPin);
}

  

【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)

實驗四十九:有源蜂鳴器模塊 低電平觸發蜂鳴器 控制板發聲傳感器智能小車

程序十六:播放melody音樂

Arduino參考開源代碼

 

/*
【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)
程序十六:播放melody音樂
*/

#define NOTE_C4 262//詮釋旋律
#define NOTE_G3 196
#define NOTE_A3 220
#define NOTE_B3 247

int melody[] = {
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};
// 音符時長:4 = 四分音符,8 = 八分音符,等等
int noteDurations[] = {
4, 8, 8, 4, 4, 4, 4, 4
};

void setup() {
// 遍歷旋律的音符
}

void loop() {
for (int thisNote = 0; thisNote < 8; thisNote++) {
// 計算音符持續時間,用一秒除以音符類型。
//例如。 四分音符 = 1000 / 4,八分音符 = 1000/8 等等。
int noteDuration = 1000 / noteDurations[thisNote];
tone(3, melody[thisNote], noteDuration);
// 爲了區分音符,設置它們之間的最小時間。
// 音符的持續時間 + 30% 似乎效果很好
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// 停止播放音調
noTone(3);
}
}

Arduino實驗場景圖

程序十七:利用蜂鳴器播放天空之城

Arduino參考開源代碼

 

/*
  【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)
  程序十七:利用蜂鳴器播放天空之城
*/

#define NOTE_D0 -1
#define NOTE_D1 294
#define NOTE_D2 330
#define NOTE_D3 350
#define NOTE_D4 393
#define NOTE_D5 441
#define NOTE_D6 495
#define NOTE_D7 556

#define NOTE_DL1 147
#define NOTE_DL2 165
#define NOTE_DL3 175
#define NOTE_DL4 196
#define NOTE_DL5 221
#define NOTE_DL6 248
#define NOTE_DL7 278

#define NOTE_DH1 589
#define NOTE_DH2 661
#define NOTE_DH3 700
#define NOTE_DH4 786
#define NOTE_DH5 882
#define NOTE_DH6 990
#define NOTE_DH7 112
//以上部分是定義是把每個音符和頻率值對應起來,其實不用打這麼多,但是都打上了,後面可以隨意編寫

#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.25
#define SIXTEENTH 0.625
//這部分是用英文對應了拍子,這樣後面也比較好看

int tune[] =
{
  NOTE_D0, NOTE_D0, NOTE_D0, NOTE_D6, NOTE_D7, NOTE_DH1, NOTE_D7, NOTE_DH1, NOTE_DH3, NOTE_D7, NOTE_D7, NOTE_D7, NOTE_D3, NOTE_D3,
  NOTE_D6, NOTE_D5, NOTE_D6, NOTE_DH1, NOTE_D5, NOTE_D5, NOTE_D5, NOTE_D3, NOTE_D4, NOTE_D3, NOTE_D4, NOTE_DH1,
  NOTE_D3, NOTE_D3, NOTE_D0, NOTE_DH1, NOTE_DH1, NOTE_DH1, NOTE_D7, NOTE_D4, NOTE_D4, NOTE_D7, NOTE_D7, NOTE_D7, NOTE_D0, NOTE_D6, NOTE_D7,
  NOTE_DH1, NOTE_D7, NOTE_DH1, NOTE_DH3, NOTE_D7, NOTE_D7, NOTE_D7, NOTE_D3, NOTE_D3, NOTE_D6, NOTE_D5, NOTE_D6, NOTE_DH1,
  NOTE_D5, NOTE_D5, NOTE_D5, NOTE_D2, NOTE_D3, NOTE_D4, NOTE_DH1, NOTE_D7, NOTE_D7, NOTE_DH1, NOTE_DH1, NOTE_DH2, NOTE_DH2, NOTE_DH3, NOTE_DH1, NOTE_DH1, NOTE_DH1,
  NOTE_DH1, NOTE_D7, NOTE_D6, NOTE_D6, NOTE_D7, NOTE_D5, NOTE_D6, NOTE_D6, NOTE_D6, NOTE_DH1, NOTE_DH2, NOTE_DH3, NOTE_DH2, NOTE_DH3, NOTE_DH5,
  NOTE_DH2, NOTE_DH2, NOTE_DH2, NOTE_D5, NOTE_D5, NOTE_DH1, NOTE_D7, NOTE_DH1, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3,
  NOTE_D6, NOTE_D7, NOTE_DH1, NOTE_D7, NOTE_DH2, NOTE_DH2, NOTE_DH1, NOTE_D5, NOTE_D5, NOTE_D5, NOTE_DH4, NOTE_DH3, NOTE_DH2, NOTE_DH1,
  NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH6, NOTE_DH6, NOTE_DH5, NOTE_DH5, NOTE_DH3, NOTE_DH2, NOTE_DH1, NOTE_DH1, NOTE_D0, NOTE_DH1,
  NOTE_DH2, NOTE_DH1, NOTE_DH2, NOTE_DH2, NOTE_DH5, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH6, NOTE_DH6, NOTE_DH5, NOTE_DH5,
  NOTE_DH3, NOTE_DH2, NOTE_DH1, NOTE_DH1, NOTE_D0, NOTE_DH1, NOTE_DH2, NOTE_DH1, NOTE_DH2, NOTE_DH2, NOTE_D7, NOTE_D6, NOTE_D6, NOTE_D6, NOTE_D6, NOTE_D7
};//這部分就是整首曲子的音符部分,用了一個序列定義爲tune,整數

float duration[] =
{
  1, 1, 1, 0.5, 0.5,     1 + 0.5, 0.5, 1, 1,     1, 1, 1, 0.5, 0.5,
  1 + 0.5, 0.5, 1, 1,     1, 1, 1, 1,          1 + 0.5, 0.5, 1, 1,
  1, 1, 0.5, 0.5, 0.5, 0.5,    1 + 0.5, 0.5, 1, 1,     1, 1, 1, 0.5, 0.5,
  1 + 0.5, 0.5, 1, 1,    1, 1, 1, 0.5, 0.5,     1 + 0.5, 0.5, 1, 1,
  1, 1, 1, 0.5, 0.5,    1, 0.5, 0.25, 0.25, 0.25, 0.5,    0.5, 0.5, 0.5, 0.25, 0.5, 1,
  0.5, 0.5, 0.5, 0.5, 1, 1,    1, 1, 1, 0.5, 0.5,    1 + 0.5, 0.5, 1, 1,
  1, 1, 1, 0.5, 0.5,    1.5, 0.5, 1, 1,    1, 1, 1, 1,
  0.5, 0.5, 1, 1, 0.5, 0.5,    1.5, 0.25, 0.5, 1,    1, 1, 1, 1,
  1, 1, 1, 1,    1, 1, 1, 1,    0.5, 0.5, 1, 1, 0.5, 0.5,
  1, 0.5, 0.5, 1, 1,    1, 1, 1, 1,    1, 1, 1, 1,
  0.5, 0.5, 1, 1, 0.5, 0.5,    1, 0.5, 0.25, 0.5, 1,    1, 1, 1, 0.5, 0.5
};//這部分是整首曲子的節拍部分,也定義個序列duration,浮點(數組的個數和前面音符的個數是一樣的,一一對應麼)

int length;//這裏定義一個變量,後面用來表示共有多少個音符
int tonePin = 3; //蜂鳴器的pin

void setup(){
  pinMode(tonePin, OUTPUT); //設置蜂鳴器的pin爲輸出模式
  length = sizeof(tune) / sizeof(tune[0]); //這裏用了一個sizeof函數, 可以查出tone序列裏有多少個音符
}

void loop(){
  for (int x = 0; x < length; x++) //循環音符的次數
  {
    tone(tonePin, tune[x]); //此函數依次播放tune序列裏的數組,即每個 音符
    delay(400 * duration[x]); //每個音符持續的時間,即節拍duration,是調整時間的越大,曲子速度越慢,越小曲子速度越快,自己掌握
    noTone(tonePin);//停止當前音符,進入下一音符
  }
  delay(5000);//等待5秒後,循環重新開始
}

 

  

 

盲人避障器(有障礙時蜂鳴器鳴響)
實驗開源仿真編程(Linkboy V4.63)

Arduino實驗場景圖

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章