//按鈕選曲音樂盒
// 腳位定義
const int buzzerPin = 8; // 只有一個喇叭
const int buttonPin = 2; // 按鈕
const int numSongs = 3;
int currentSong = 0; // 紀錄目前歌曲編號
// 音符定義
#define NOTE_0 0
#define NOTE_C4 262
#define NOTE_D4 294
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_G4 392
#define NOTE_A4 440
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_D5 587
#define NOTE_E5 659
#define NOTE_G5 784
// 歡樂頌
int melody1[] = {
NOTE_E4, NOTE_E4, NOTE_F4, NOTE_G4,
NOTE_G4, NOTE_F4, NOTE_E4, NOTE_D4,
NOTE_C4, NOTE_C4, NOTE_D4, NOTE_E4,
NOTE_E4, NOTE_D4, NOTE_D4, NOTE_0
};
int durations1[] = {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4};
// 小星星
int melody2[] = {
NOTE_C4, NOTE_C4, NOTE_G4, NOTE_G4,
NOTE_A4, NOTE_A4, NOTE_G4, NOTE_0,
NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4,
NOTE_D4, NOTE_D4, NOTE_C4, NOTE_0
};
int durations2[] = {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4};
// 生日快樂
int melody3[] = {
NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_F4, NOTE_E4, NOTE_0,
NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_G4, NOTE_F4, NOTE_0
};
int durations3[] = {4,4,4,4,4,4,4,4,4,4,4,4,4,4};
// 對應旋律與節奏陣列
int* melodies[] = {melody1, melody2, melody3};
int* durations[] = {durations1, durations2, durations3};
int lengths[] = {
sizeof(melody1)/sizeof(int),
sizeof(melody2)/sizeof(int),
sizeof(melody3)/sizeof(int)
};
void setup() {
pinMode(buttonPin, INPUT_PULLUP); // 使用內建上拉電阻
}
void loop() {
// 偵測按鈕是否被按下
if (digitalRead(buttonPin) == LOW) {
delay(200); // 簡單防彈跳
playMelody(buzzerPin, melodies[currentSong], durations[currentSong], lengths[currentSong]);
currentSong = (currentSong + 1) % numSongs; // 切換到下一首
}
}
void playMelody(int pin, int* melody, int* duration, int length) {
for (int i = 0; i < length; i++) {
int noteDuration = 1000 / duration[i];
if (melody[i] != NOTE_0) {
tone(pin, melody[i], noteDuration);
}
delay(noteDuration * 1.3);
noTone(pin);
}
}
留言
張貼留言