const int buzzerPin = 8;
const int buttonPin = 2;
int currentSong = 0;
bool buttonPressed = false;
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 50;
// 定義音符頻率(Hz)
#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_F5 698
#define NOTE_G5 784
// Jingle Bells(延長版)
int song1[] = {
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_D5, NOTE_D5, NOTE_E5, NOTE_D5, NOTE_G5
};
int song1Dur[] = {
4, 4, 2, 4, 4, 2,
4, 4, 4, 4, 1,
4, 4, 2, 4, 4, 2, 4,
4, 4, 4, 4, 4, 4, 1
};
// We Wish You a Merry Christmas(延長版)
int song2[] = {
NOTE_G4, NOTE_E4, NOTE_F4, NOTE_G4,
NOTE_G4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5,
NOTE_C5, NOTE_C5, NOTE_D5, NOTE_C5, NOTE_B4, NOTE_A4,
NOTE_G4, NOTE_E4, NOTE_F4, NOTE_G4
};
int song2Dur[] = {
4, 4, 4, 4,
4, 2, 4, 4, 1,
4, 4, 4, 4, 4, 4,
4, 4, 4, 1
};
// Silent Night(延長版)
int song3[] = {
NOTE_G4, NOTE_A4, NOTE_G4, NOTE_E4,
NOTE_G4, NOTE_A4, NOTE_G4, NOTE_E4,
NOTE_D4, NOTE_D4, NOTE_G4, NOTE_G4,
NOTE_E4, NOTE_E4, NOTE_G4
};
int song3Dur[] = {
4, 4, 4, 2,
4, 4, 4, 2,
4, 4, 4, 4,
4, 4, 1
};
void setup() {
pinMode(buzzerPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
static bool lastButtonState = HIGH;
bool reading = digitalRead(buttonPin);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading == LOW && !buttonPressed) {
buttonPressed = true;
currentSong = (currentSong + 1) % 3;
playSong(currentSong);
}
}
if (reading == HIGH) {
buttonPressed = false;
}
lastButtonState = reading;
}
void playSong(int songNum) {
int* melody;
int* durations;
int length;
switch (songNum) {
case 0:
melody = song1;
durations = song1Dur;
length = sizeof(song1) / sizeof(song1[0]);
break;
case 1:
melody = song2;
durations = song2Dur;
length = sizeof(song2) / sizeof(song2[0]);
break;
case 2:
melody = song3;
durations = song3Dur;
length = sizeof(song3) / sizeof(song3[0]);
break;
}
for (int i = 0; i < length; i++) {
int duration = 1000 / durations[i];
tone(buzzerPin, melody[i], duration);
delay(duration * 1.3);
noTone(buzzerPin);
}
}
留言
張貼留言