按鈕選曲音樂盒

 //按鈕選曲音樂盒

// 腳位定義

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

  }

}


留言