使用IR Remote + toneMelody 在 loop results.value 後,遙控器按鍵碼會亂跳

/*
  紅外線遙控傳輸IR_Remote有3支接腳:
  面對X凸起面-左為Ouput:訊號(接7)
  面對X凸起面-中為GND:接地
  面對X凸起面-右為VCC:5V

  需下載紅外線函數庫:IRremote by shirriff

*/

/*
  有源蜂鳴器(有貼白色貼紙):內建固定頻率。
  無源蜂鳴器(可看到電路板):用程式調頻率音調播放簡單的旋律
  使用範本toneMelody.ino執行
*/

//無源蜂鳴器(可看到電路板):

#include "pitches.h" //載入音調和頻率的對照檔

//遙控器1:FF30CF、遙控器2:FF18E7、遙控器3:FF7A85、遙控器4:FF10EF、遙控器5:FF38C7、遙控器6:FF5AA5
//1:小旋律、2:卡農、3:給愛麗絲、4:聖誕1歌、5:聖誕2歌、6:聖誕3歌
//int song = 1;

// melody1旋律:小旋律
int melody1[] =
{
  NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3 , 0, NOTE_B3, NOTE_C4 , -1
};

// melody2旋律:卡農
int melody2[] =
{
  NOTE_E3, NOTE_G4, NOTE_C5, NOTE_E5, NOTE_B2, NOTE_G4, NOTE_B4, NOTE_D5,
  NOTE_C3, NOTE_E4, NOTE_A4, NOTE_C5, NOTE_G2, NOTE_E4, NOTE_G4, NOTE_B4,
  NOTE_A2, NOTE_C4, NOTE_F4, NOTE_A4, NOTE_E1, NOTE_C4, NOTE_E4, NOTE_G4,
  NOTE_A2, NOTE_D4, NOTE_F4, NOTE_A4, NOTE_B2, NOTE_D4, NOTE_G4, NOTE_B4,
  NOTE_E3, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5,
  NOTE_E5, NOTE_C5, NOTE_D5, NOTE_E5, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_G4, NOTE_F4, NOTE_F4, NOTE_G4,
  NOTE_F4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_E4, NOTE_D4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4,
  NOTE_F4, NOTE_A4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5,
  NOTE_E5, NOTE_C5, NOTE_D5, NOTE_E5, NOTE_D5, NOTE_C5, NOTE_D5, NOTE_B4, NOTE_C5, NOTE_D5, NOTE_E5, NOTE_D5, NOTE_C5, NOTE_B4,
  NOTE_C5, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_E4, NOTE_C5, NOTE_B4, NOTE_C5,
  NOTE_A4, NOTE_C5, NOTE_B4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5,
  NOTE_A4, NOTE_C5, NOTE_B4, NOTE_C5, NOTE_B4, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_D5, NOTE_C5, NOTE_B4, NOTE_C5, NOTE_A4, NOTE_B4,
  NOTE_C5, -1
};

// melody3旋律:給愛麗絲
int melody3[] =
{
  0, 0, NOTE_E5, NOTE_D5, NOTE_E5, NOTE_D5, NOTE_E5, NOTE_B4, NOTE_D5, NOTE_C5,
  NOTE_A4, 0, NOTE_C4, NOTE_E4, NOTE_A4, NOTE_B4, 0, NOTE_E4, NOTE_G4, NOTE_B4,
  NOTE_C5, 0, NOTE_E4, NOTE_E5, NOTE_D5, NOTE_E5, NOTE_D5, NOTE_E5, NOTE_B4, NOTE_D5, NOTE_C5,
  NOTE_A4, 0, NOTE_C4, NOTE_E4, NOTE_A4, NOTE_B4, 0, NOTE_E4, NOTE_C5, NOTE_B4,
  NOTE_A4, -1
};

// melody4旋律:聖誕1歌
int melody4[] =
{
  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_E5, NOTE_D5, NOTE_D5, NOTE_E5,
  NOTE_D5, NOTE_G5, -1
};

// melody5旋律:聖誕2歌
int melody5[] =
{
  NOTE_B3,
  NOTE_F4, NOTE_F4, NOTE_G4, NOTE_F4, NOTE_E4,
  NOTE_D4, NOTE_D4, NOTE_D4,
  NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_F4,
  NOTE_E4, NOTE_E4, NOTE_E4,
  NOTE_A4, NOTE_A4, NOTE_B4, NOTE_A4, NOTE_G4,
  NOTE_F4, NOTE_D4, NOTE_B3, NOTE_B3,
  NOTE_D4, NOTE_G4, NOTE_E4,
  NOTE_F4, -1
};

// melody6旋律:聖誕3歌
int melody6[] =
{
  NOTE_G4,
  NOTE_E4, NOTE_F4, NOTE_G4, NOTE_G4, NOTE_G4,
  NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, NOTE_C5,
  NOTE_E4, NOTE_F4, NOTE_G4, NOTE_G4, NOTE_G4,
  NOTE_A4, NOTE_G4, NOTE_F4, NOTE_F4,
  NOTE_E4, NOTE_G4, NOTE_C4, NOTE_E4,
  NOTE_D4, NOTE_F4, NOTE_B3,
  NOTE_C4, -1
};

// noteDurations1拍子:小旋律
int noteDurations1[] =
{
  4, 8, 8, 4, 4, 4, 4, 4,
  1
};

// noteDurations2拍子:卡農
int noteDurations2[] =
{
  8, 8, 8, 8, 8, 8, 8, 8,
  8, 8, 8, 8, 8, 8, 8, 8,
  8, 8, 8, 8, 8, 8, 8, 8,
  8, 8, 8, 8, 8, 8, 8, 8,
  8, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
  8, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
  8, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
  8, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
  8, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
  8, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
  8, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
  8, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
  1
};

// noteDurations3拍子:給愛麗絲
int noteDurations3[] =
{
  4, 4, 8, 8, 8, 8, 8, 8, 8, 8,
  4, 8, 8, 8, 8, 4, 8, 8, 8, 8,
  4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  4, 8, 8, 8, 8, 4, 8, 8, 8, 8,
  4, 4, 8, 8, 8, 8, 8, 8, 8, 8,
  4, 1
};

// noteDurations4拍子:聖誕1歌
int noteDurations4[] =
{
  8, 8, 4,
  8, 8, 4,
  8, 8, 8, 8,
  2,
  8, 8, 8, 8,
  8, 8, 8, 16, 16,
  8, 8, 8, 8,
  4, 4, 1
};

// noteDurations5拍子:聖誕2歌
int noteDurations5[] =
{
  4,
  4, 8, 8, 8, 8,
  4, 4, 4,
  4, 8, 8, 8, 8,
  4, 4, 4,
  4, 8, 8, 8, 8,
  4, 4, 8, 8,
  4, 4, 4,
  2, 1
};

// noteDurations6拍子:聖誕3歌
int noteDurations6[] =
{
  8,
  8, 8, 4, 4, 4,
  8, 8, 4, 4, 4,
  8, 8, 4, 4, 4,
  8, 8, 4, 2,
  4, 4, 4, 4,
  4, 2, 4,
  1, 1
};

// toneSpeed1音速:小旋律
int toneSpeed1 = 1000; //設定音速, 我用1800ms, 即1.8 秒當全音符

// toneSpeed2音速:卡農
int toneSpeed2 = 1800; //設定音速, 我用1800ms, 即1.8 秒當全音符

// toneSpeed3音速:給愛麗絲
int toneSpeed3 = 1800; //設定音速, 我用1800ms, 即1.8 秒當全音符

// toneSpeed4音速:聖誕1歌
int toneSpeed4 = 1000; //設定音速, 我用1800ms, 即1.8 秒當全音符

// toneSpeed5音速:聖誕2歌
int toneSpeed5 = 1000; //設定音速, 我用1800ms, 即1.8 秒當全音符

// toneSpeed6音速:聖誕3歌
int toneSpeed6 = 1000; //設定音速, 我用1800ms, 即1.8 秒當全音符

#include <IRremote.h>

int RECV_PIN = 8; //設定紅外線接收頭的PIN腳
IRrecv irrecv(RECV_PIN);

decode_results results; //接收訊號後會把結果存在results

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); //開始接收訊號!
  Serial.println("GO GO");
}

void loop()
{
  if (irrecv.decode(&results))
  {
    Serial.println(results.value, HEX); //接收訊號,以16進位型式輸出到監控視窗
    if (results.value == 0xFF30CF) //如果按下遙控器定鍵1
    {
      int song = 1;
      int thisNote = 0; // 在此使用While 而不用 for
      while (melody1[thisNote] >= 0)
      {
        int noteDuration = toneSpeed1 / noteDurations1[thisNote];
        tone(7, melody1[thisNote], noteDuration);
        int pauseBetweenNotes = noteDuration * 1.30;
        delay(pauseBetweenNotes);
        thisNote++;
      }
      noTone(7); // 播完後靜音
    }
    if (results.value == 0xFF18E7) //如果按下遙控器定鍵2
    {
      int song = 2;
      int thisNote = 0; // 在此使用While 而不用 for
      while (melody2[thisNote] >= 0)
      {
        int noteDuration = toneSpeed2 / noteDurations2[thisNote];
        tone(7, melody2[thisNote], noteDuration);
        int pauseBetweenNotes = noteDuration * 1.30;
        delay(pauseBetweenNotes);
        thisNote++;
      }
      noTone(7); // 播完後靜音
    }
    if (results.value == 0xFF7A85) //如果按下遙控器定鍵3
    {
      int song = 3;
      int thisNote = 0; // 在此使用While 而不用 for
      while (melody3[thisNote] >= 0)
      {
        int noteDuration = toneSpeed3 / noteDurations3[thisNote];
        tone(7, melody3[thisNote], noteDuration);
        int pauseBetweenNotes = noteDuration * 1.30;
        delay(pauseBetweenNotes);
        thisNote++;
      }
      noTone(7); // 播完後靜音
    }
    if (results.value == 0xFF10EF) //如果按下遙控器定鍵4
    {
      int song = 4;
      int thisNote = 0; // 在此使用While 而不用 for
      while (melody4[thisNote] >= 0)
      {
        int noteDuration = toneSpeed4 / noteDurations4[thisNote];
        tone(7, melody4[thisNote], noteDuration);
        int pauseBetweenNotes = noteDuration * 1.30;
        delay(pauseBetweenNotes);
        thisNote++;
      }
      noTone(7); // 播完後靜音
    }
    if (results.value == 0xFF38C7) //如果按下遙控器定鍵5
    {
      int song = 5;
      int thisNote = 0; // 在此使用While 而不用 for
      while (melody5[thisNote] >= 0)
      {
        int noteDuration = toneSpeed5 / noteDurations5[thisNote];
        tone(7, melody5[thisNote], noteDuration);
        int pauseBetweenNotes = noteDuration * 1.30;
        delay(pauseBetweenNotes);
        thisNote++;
      }
      noTone(7); // 播完後靜音
    }
    if (results.value == 0xFF5AA5) //如果按下遙控器定鍵6
    {
      int song = 6;
      int thisNote = 0; // 在此使用While 而不用 for
      while (melody6[thisNote] >= 0)
      {
        int noteDuration = toneSpeed6 / noteDurations6[thisNote];
        tone(7, melody6[thisNote], noteDuration);
        int pauseBetweenNotes = noteDuration * 1.30;
        delay(pauseBetweenNotes);
        thisNote++;
      }
      noTone(7); // 播完後靜音
    }
    irrecv.resume(); //接著接收下一個訊號
  }
  delay(100);
}

GitHub - Arduino-IRremote/Arduino-IRremote: Infrared remote library for Arduino: send and receive infrared signals with multiple protocols