Arduino 音樂盒程式(三首聖誕歌曲)

 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);

  }

}


留言