#include "pitches.h"
#define SPEAKER_PIN 8
#define DEBOUNCE_DELAY 50
const uint8_t buttonPins[] = {12, 11, 10, 9, 7, 6, 5, 4};
const int buttonTones[] = {
NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4,
NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5
};
// 曲子1: 一闪一闪亮晶晶
const int twinkleMelody[] = {
NOTE_C4, NOTE_C4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_A4, NOTE_G4,
NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_D4, NOTE_D4, NOTE_C4
};
const int twinkleDurations[] = {
4, 4, 4, 4, 4, 4, 2,
4, 4, 4, 4, 4, 4, 2
};
// 曲子2: 铃儿响叮当
const int jingleBellsMelody[] = {
NOTE_E4, NOTE_E4, NOTE_E4,
NOTE_E4, NOTE_E4, NOTE_E4,
NOTE_E4, NOTE_G4, NOTE_C4, NOTE_D4, NOTE_E4,
NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4,
NOTE_F4, NOTE_E4, NOTE_E4, NOTE_E4, NOTE_E4,
NOTE_D4, NOTE_D4, NOTE_E4, NOTE_D4, NOTE_G4
};
const int jingleBellsDurations[] = {
4, 4, 2,
4, 4, 2,
4, 4, 8/3, 8/3, 8/3,
4, 4, 4, 4,
4, 4, 4, 8/3, 8/3,
4, 4, 4, 2, 2
};
// 曲子3: 小星星变奏曲
const int starMelody[] = {
NOTE_C4, NOTE_C4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_A4, NOTE_G4,
NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_D4, NOTE_D4, NOTE_C4,
NOTE_G4, NOTE_G4, NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_D4,
NOTE_G4, NOTE_G4, NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_D4,
NOTE_C4, NOTE_C4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_A4, NOTE_G4,
NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_D4, NOTE_D4, NOTE_C4
};
const int starDurations[] = {
4, 4, 4, 4, 4, 4, 2,
4, 4, 4, 4, 4, 4, 2,
4, 4, 4, 4, 4, 4, 2,
4, 4, 4, 4, 4, 4, 2,
4, 4, 4, 4, 4, 4, 2,
4, 4, 4, 4, 4, 4, 2
};
// 曲子4: 生日快乐
const int happyBirthdayMelody[] = {
NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_F4, NOTE_E4,
NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_G4, NOTE_F4,
NOTE_C4, NOTE_C4, NOTE_C5, NOTE_A4, NOTE_F4, NOTE_E4, NOTE_D4,
NOTE_B4, NOTE_B4, NOTE_A4, NOTE_F4, NOTE_G4, NOTE_F4
};
const int happyBirthdayDurations[] = {
4, 4, 2, 2, 2, 1,
4, 4, 2, 2, 2, 1,
4, 4, 2, 2, 4, 4, 2,
4, 4, 2, 2, 2, 1
};
// 曲子5: 茉莉花
const int jasmineMelody[] = {
NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4,
NOTE_E4, NOTE_F4, NOTE_G4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_D4,
NOTE_E4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_E4,
NOTE_D4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_E4, NOTE_D4
};
const int jasmineDurations[] = {
4, 8, 8, 4, 8, 8, 2,
4, 8, 8, 4, 8, 8, 2,
4, 8, 8, 4, 8, 8, 8, 8,
4, 8, 8, 4, 8, 8, 2
};
// 曲子6: 两只老虎
const int tigersMelody[] = {
NOTE_C4, NOTE_D4, NOTE_E4, NOTE_C4,
NOTE_C4, NOTE_D4, NOTE_E4, NOTE_C4,
NOTE_E4, NOTE_F4, NOTE_G4,
NOTE_E4, NOTE_F4, NOTE_G4,
NOTE_G4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_C4,
NOTE_G4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_C4,
NOTE_C4, NOTE_G3, NOTE_C4,
NOTE_C4, NOTE_G3, NOTE_C4
};
const int tigersDurations[] = {
4, 4, 4, 4,
4, 4, 4, 4,
4, 4, 2,
4, 4, 2,
4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4,
4, 4, 2,
4, 4, 2
};
// 曲子7: 采蘑菇的小姑娘
const int mushroomMelody[] = {
NOTE_C5, NOTE_C5, NOTE_B4, NOTE_A4, NOTE_G4, NOTE_A4, NOTE_B4,
NOTE_G4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_B4, NOTE_A4,
NOTE_G4, NOTE_E4, NOTE_G4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_D4,
NOTE_E4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_F4
};
const int mushroomDurations[] = {
8, 8, 8, 8, 4, 8, 8,
8, 8, 8, 8, 4, 8, 8,
8, 8, 8, 8, 8, 8, 2,
8, 8, 8, 8, 8, 8, 2
};
// 曲子8: 新年好
const int newYearMelody[] = {
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_E4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_D4,
NOTE_C4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_D4, NOTE_C4, NOTE_C4
};
const int newYearDurations[] = {
4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 2, 2,
4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 2, 2
};
const int numTones = sizeof(buttonPins) / sizeof(buttonPins[0]);
unsigned long lastPressTime = 0;
uint8_t lastPressedButton = 0;
int playMode = 0;
int currentSong = 0;
void setup() {
for (uint8_t i = 0; i < numTones; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
}
pinMode(SPEAKER_PIN, OUTPUT);
Serial.begin(9600);
Serial.println("Press buttons to play different songs:");
Serial.println("Button 1: Twinkle Twinkle Little Star");
Serial.println("Button 2: Jingle Bells");
Serial.println("Button 3: Little Star Variation");
Serial.println("Button 4: Happy Birthday");
Serial.println("Button 5: Jasmine Flower");
Serial.println("Button 6: Two Tigers");
Serial.println("Button 7: Mushroom Girl");
Serial.println("Button 8: Happy New Year");
}
void playSong(const int melody[], const int durations[], int size) {
static unsigned long noteStartTime = 0;
static int currentNote = 0;
if (currentNote >= size) {
noTone(SPEAKER_PIN);
playMode = 0;
currentNote = 0;
return;
}
unsigned long currentTime = millis();
int noteDuration = 1000 / durations[currentNote];
if (currentTime - noteStartTime >= noteDuration * 1.3) {
noteStartTime = currentTime;
currentNote++;
if (currentNote < size) {
tone(SPEAKER_PIN, melody[currentNote], noteDuration);
}
}
}
void loop() {
if (playMode == 0) {
for (uint8_t i = 0; i < numTones; i++) {
if (digitalRead(buttonPins[i]) == LOW) {
if (lastPressedButton != i + 1 || millis() - lastPressTime > DEBOUNCE_DELAY) {
lastPressedButton = i + 1;
lastPressTime = millis();
noTone(SPEAKER_PIN);
playMode = 1;
currentSong = i;
Serial.print("Playing song for button ");
Serial.println(i + 1);
}
}
}
} else {
switch(currentSong) {
case 0:
playSong(twinkleMelody, twinkleDurations, sizeof(twinkleMelody)/sizeof(twinkleMelody[0]));
break;
case 1:
playSong(jingleBellsMelody, jingleBellsDurations, sizeof(jingleBellsMelody)/sizeof(jingleBellsMelody[0]));
break;
case 2:
playSong(starMelody, starDurations, sizeof(starMelody)/sizeof(starMelody[0]));
break;
case 3:
playSong(happyBirthdayMelody, happyBirthdayDurations, sizeof(happyBirthdayMelody)/sizeof(happyBirthdayMelody[0]));
break;
case 4:
playSong(jasmineMelody, jasmineDurations, sizeof(jasmineMelody)/sizeof(jasmineMelody[0]));
break;
case 5:
playSong(tigersMelody, tigersDurations, sizeof(tigersMelody)/sizeof(tigersMelody[0]));
break;
case 6:
playSong(mushroomMelody, mushroomDurations, sizeof(mushroomMelody)/sizeof(mushroomMelody[0]));
break;
case 7:
playSong(newYearMelody, newYearDurations, sizeof(newYearMelody)/sizeof(newYearMelody[0]));
break;
default:
playMode = 0;
break;
}
}
}