// Define the notes in the melody#define NOTE_E7 2637#define NOTE_C7 2093#define NOTE_G7 3136#define NOTE_G6 1568#define NOTE_E6 1319#define NOTE_A6 1760#define NOTE_B6 1976#define NOTE_AS6 1865#define NOTE_A6 1760#define NOTE_G6 1568#define NOTE_E7 2637#define NOTE_G7 3136#define NOTE_A7 3520#define NOTE_F7 2794#define NOTE_G7 3136#define NOTE_E7 2637#define NOTE_C7 2093#define NOTE_D7 2349#define NOTE_B6 1976#define NOTE_C7 2093
const int buttonPin = 2; // the number of the pushbutton pinconst int speakerPin = 8; // the number of the speaker pinconst int ledPin1 = 13; // the number of the first LED pinconst int ledPin2 = 12; // the number of the second LED pin
int buttonState = 0; // variable for reading the pushbutton statusint lastButtonState = HIGH; // previous state of the buttonunsigned long lastDebounceTime = 0; // the last time the output pin was toggledunsigned long debounceDelay = 50; // the debounce time; increase if the output flickers
int melody[] = { NOTE_E7, NOTE_E7, 0, NOTE_E7, 0, NOTE_C7, NOTE_E7, 0, NOTE_G7, 0, 0, 0, NOTE_G6, 0, 0, 0, NOTE_C7, 0, 0, NOTE_G6, 0, 0, NOTE_E6, 0, 0, NOTE_A6, 0, NOTE_B6, 0, NOTE_AS6, NOTE_A6, 0, NOTE_G6, NOTE_E7, NOTE_G7, NOTE_A7, 0, NOTE_F7, NOTE_G7, 0, NOTE_E7, 0, NOTE_C7, NOTE_D7, NOTE_B6, 0, 0,
NOTE_E7, NOTE_E7, 0, NOTE_E7, 0, NOTE_C7, NOTE_E7, 0, NOTE_G7, 0, 0, 0, NOTE_G6, 0, 0, 0, NOTE_C7, 0, 0, NOTE_G6, 0, 0, NOTE_E6, 0, 0, NOTE_A6, 0, NOTE_B6, 0, NOTE_AS6, NOTE_A6, 0, NOTE_G6, NOTE_E7, NOTE_G7, NOTE_A7, 0, NOTE_F7, NOTE_G7, 0, NOTE_E7, 0, NOTE_C7, NOTE_D7, NOTE_B6, 0, 0};
int noteDurations[] = { 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12};
void setup() { pinMode(buttonPin, INPUT_PULLUP); // initialize the pushbutton pin as an input with pull-up resistor pinMode(speakerPin, OUTPUT); // initialize the speaker pin as an output pinMode(ledPin1, OUTPUT); // initialize the first LED pin as an output pinMode(ledPin2, OUTPUT); // initialize the second LED pin as an output}
void loop() { int reading = digitalRead(buttonPin); // read the state of the pushbutton
// If the switch changed, due to noise or pressing if (reading != lastButtonState) { // reset the debouncing timer lastDebounceTime = millis(); }
if ((millis() - lastDebounceTime) > debounceDelay) { // whatever the reading is at, it's been there for longer than the debounce // delay, so take it as the actual current state:
// if the button state has changed if (reading != buttonState) { buttonState = reading;
// only turn on the LED if the new button state is LOW if (buttonState == LOW) { playMarioTheme(); // play Mario Bros theme song } } }
// save the reading. Next time through the loop, it'll be the lastButtonState: lastButtonState = reading;}
void playMarioTheme() { for (int thisNote = 0; thisNote < sizeof(melody)/sizeof(melody[0]); thisNote++) { int noteDuration = 1000 / noteDurations[thisNote]; if (melody[thisNote] != 0) { tone(speakerPin, melody[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
// Blink LEDs alternately if (thisNote % 2 == 0) { digitalWrite(ledPin1, HIGH); digitalWrite(ledPin2, LOW); } else { digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, HIGH); }
delay(pauseBetweenNotes); noTone(speakerPin); } else { delay(noteDuration); } }
// Turn off LEDs after the song is done digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, LOW);}