/*
紅外線遙控傳輸IR_Remote有3支接腳:
面對X凸起面-左為Ouput:訊號(接7)
面對X凸起面-中為GND:接地
面對X凸起面-右為VCC:5V
需下載紅外線函數庫:IRremote by shirriff
*/
/*
有源蜂鳴器(有貼白色貼紙):內建固定頻率。
無源蜂鳴器(可看到電路板):用程式調頻率音調播放簡單的旋律
使用範本toneMelody.ino執行
*/
//無源蜂鳴器(可看到電路板):
#include "pitches.h" //載入音調和頻率的對照檔
//遙控器1:FF30CF、遙控器2:FF18E7、遙控器3:FF7A85、遙控器4:FF10EF、遙控器5:FF38C7、遙控器6:FF5AA5
//1:小旋律、2:卡農、3:給愛麗絲、4:聖誕1歌、5:聖誕2歌、6:聖誕3歌
//int song = 1;
// melody1旋律:小旋律
int melody1[] =
{
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3 , 0, NOTE_B3, NOTE_C4 , -1
};
// melody2旋律:卡農
int melody2[] =
{
NOTE_E3, NOTE_G4, NOTE_C5, NOTE_E5, NOTE_B2, NOTE_G4, NOTE_B4, NOTE_D5,
NOTE_C3, NOTE_E4, NOTE_A4, NOTE_C5, NOTE_G2, NOTE_E4, NOTE_G4, NOTE_B4,
NOTE_A2, NOTE_C4, NOTE_F4, NOTE_A4, NOTE_E1, NOTE_C4, NOTE_E4, NOTE_G4,
NOTE_A2, NOTE_D4, NOTE_F4, NOTE_A4, NOTE_B2, NOTE_D4, NOTE_G4, NOTE_B4,
NOTE_E3, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5,
NOTE_E5, NOTE_C5, NOTE_D5, NOTE_E5, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_G4, NOTE_F4, NOTE_F4, NOTE_G4,
NOTE_F4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_E4, NOTE_D4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4,
NOTE_F4, NOTE_A4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5,
NOTE_E5, NOTE_C5, NOTE_D5, NOTE_E5, NOTE_D5, NOTE_C5, NOTE_D5, NOTE_B4, NOTE_C5, NOTE_D5, NOTE_E5, NOTE_D5, NOTE_C5, NOTE_B4,
NOTE_C5, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_E4, NOTE_C5, NOTE_B4, NOTE_C5,
NOTE_A4, NOTE_C5, NOTE_B4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5,
NOTE_A4, NOTE_C5, NOTE_B4, NOTE_C5, NOTE_B4, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_D5, NOTE_C5, NOTE_B4, NOTE_C5, NOTE_A4, NOTE_B4,
NOTE_C5, -1
};
// melody3旋律:給愛麗絲
int melody3[] =
{
0, 0, NOTE_E5, NOTE_D5, NOTE_E5, NOTE_D5, NOTE_E5, NOTE_B4, NOTE_D5, NOTE_C5,
NOTE_A4, 0, NOTE_C4, NOTE_E4, NOTE_A4, NOTE_B4, 0, NOTE_E4, NOTE_G4, NOTE_B4,
NOTE_C5, 0, NOTE_E4, NOTE_E5, NOTE_D5, NOTE_E5, NOTE_D5, NOTE_E5, NOTE_B4, NOTE_D5, NOTE_C5,
NOTE_A4, 0, NOTE_C4, NOTE_E4, NOTE_A4, NOTE_B4, 0, NOTE_E4, NOTE_C5, NOTE_B4,
NOTE_A4, -1
};
// melody4旋律:聖誕1歌
int melody4[] =
{
NOTE_E5, NOTE_E5, NOTE_E5,
NOTE_E5, NOTE_E5, NOTE_E5,
NOTE_E5, NOTE_G5, NOTE_C5, NOTE_D5,
NOTE_E5,
NOTE_F5, NOTE_F5, NOTE_F5, NOTE_F5,
NOTE_F5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5,
NOTE_E5, NOTE_D5, NOTE_D5, NOTE_E5,
NOTE_D5, NOTE_G5, -1
};
// melody5旋律:聖誕2歌
int melody5[] =
{
NOTE_B3,
NOTE_F4, NOTE_F4, NOTE_G4, NOTE_F4, NOTE_E4,
NOTE_D4, NOTE_D4, NOTE_D4,
NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_F4,
NOTE_E4, NOTE_E4, NOTE_E4,
NOTE_A4, NOTE_A4, NOTE_B4, NOTE_A4, NOTE_G4,
NOTE_F4, NOTE_D4, NOTE_B3, NOTE_B3,
NOTE_D4, NOTE_G4, NOTE_E4,
NOTE_F4, -1
};
// melody6旋律:聖誕3歌
int melody6[] =
{
NOTE_G4,
NOTE_E4, NOTE_F4, NOTE_G4, NOTE_G4, NOTE_G4,
NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, NOTE_C5,
NOTE_E4, NOTE_F4, NOTE_G4, NOTE_G4, NOTE_G4,
NOTE_A4, NOTE_G4, NOTE_F4, NOTE_F4,
NOTE_E4, NOTE_G4, NOTE_C4, NOTE_E4,
NOTE_D4, NOTE_F4, NOTE_B3,
NOTE_C4, -1
};
// noteDurations1拍子:小旋律
int noteDurations1[] =
{
4, 8, 8, 4, 4, 4, 4, 4,
1
};
// noteDurations2拍子:卡農
int noteDurations2[] =
{
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
8, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
8, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
8, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
8, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
8, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
8, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
8, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
1
};
// noteDurations3拍子:給愛麗絲
int noteDurations3[] =
{
4, 4, 8, 8, 8, 8, 8, 8, 8, 8,
4, 8, 8, 8, 8, 4, 8, 8, 8, 8,
4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
4, 8, 8, 8, 8, 4, 8, 8, 8, 8,
4, 4, 8, 8, 8, 8, 8, 8, 8, 8,
4, 1
};
// noteDurations4拍子:聖誕1歌
int noteDurations4[] =
{
8, 8, 4,
8, 8, 4,
8, 8, 8, 8,
2,
8, 8, 8, 8,
8, 8, 8, 16, 16,
8, 8, 8, 8,
4, 4, 1
};
// noteDurations5拍子:聖誕2歌
int noteDurations5[] =
{
4,
4, 8, 8, 8, 8,
4, 4, 4,
4, 8, 8, 8, 8,
4, 4, 4,
4, 8, 8, 8, 8,
4, 4, 8, 8,
4, 4, 4,
2, 1
};
// noteDurations6拍子:聖誕3歌
int noteDurations6[] =
{
8,
8, 8, 4, 4, 4,
8, 8, 4, 4, 4,
8, 8, 4, 4, 4,
8, 8, 4, 2,
4, 4, 4, 4,
4, 2, 4,
1, 1
};
// toneSpeed1音速:小旋律
int toneSpeed1 = 1000; //設定音速, 我用1800ms, 即1.8 秒當全音符
// toneSpeed2音速:卡農
int toneSpeed2 = 1800; //設定音速, 我用1800ms, 即1.8 秒當全音符
// toneSpeed3音速:給愛麗絲
int toneSpeed3 = 1800; //設定音速, 我用1800ms, 即1.8 秒當全音符
// toneSpeed4音速:聖誕1歌
int toneSpeed4 = 1000; //設定音速, 我用1800ms, 即1.8 秒當全音符
// toneSpeed5音速:聖誕2歌
int toneSpeed5 = 1000; //設定音速, 我用1800ms, 即1.8 秒當全音符
// toneSpeed6音速:聖誕3歌
int toneSpeed6 = 1000; //設定音速, 我用1800ms, 即1.8 秒當全音符
#include <IRremote.h>
int RECV_PIN = 8; //設定紅外線接收頭的PIN腳
IRrecv irrecv(RECV_PIN);
decode_results results; //接收訊號後會把結果存在results
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); //開始接收訊號!
Serial.println("GO GO");
}
void loop()
{
if (irrecv.decode(&results))
{
Serial.println(results.value, HEX); //接收訊號,以16進位型式輸出到監控視窗
if (results.value == 0xFF30CF) //如果按下遙控器定鍵1
{
int song = 1;
int thisNote = 0; // 在此使用While 而不用 for
while (melody1[thisNote] >= 0)
{
int noteDuration = toneSpeed1 / noteDurations1[thisNote];
tone(7, melody1[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
thisNote++;
}
noTone(7); // 播完後靜音
}
if (results.value == 0xFF18E7) //如果按下遙控器定鍵2
{
int song = 2;
int thisNote = 0; // 在此使用While 而不用 for
while (melody2[thisNote] >= 0)
{
int noteDuration = toneSpeed2 / noteDurations2[thisNote];
tone(7, melody2[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
thisNote++;
}
noTone(7); // 播完後靜音
}
if (results.value == 0xFF7A85) //如果按下遙控器定鍵3
{
int song = 3;
int thisNote = 0; // 在此使用While 而不用 for
while (melody3[thisNote] >= 0)
{
int noteDuration = toneSpeed3 / noteDurations3[thisNote];
tone(7, melody3[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
thisNote++;
}
noTone(7); // 播完後靜音
}
if (results.value == 0xFF10EF) //如果按下遙控器定鍵4
{
int song = 4;
int thisNote = 0; // 在此使用While 而不用 for
while (melody4[thisNote] >= 0)
{
int noteDuration = toneSpeed4 / noteDurations4[thisNote];
tone(7, melody4[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
thisNote++;
}
noTone(7); // 播完後靜音
}
if (results.value == 0xFF38C7) //如果按下遙控器定鍵5
{
int song = 5;
int thisNote = 0; // 在此使用While 而不用 for
while (melody5[thisNote] >= 0)
{
int noteDuration = toneSpeed5 / noteDurations5[thisNote];
tone(7, melody5[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
thisNote++;
}
noTone(7); // 播完後靜音
}
if (results.value == 0xFF5AA5) //如果按下遙控器定鍵6
{
int song = 6;
int thisNote = 0; // 在此使用While 而不用 for
while (melody6[thisNote] >= 0)
{
int noteDuration = toneSpeed6 / noteDurations6[thisNote];
tone(7, melody6[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
thisNote++;
}
noTone(7); // 播完後靜音
}
irrecv.resume(); //接著接收下一個訊號
}
delay(100);
}