Музыкальный автомат Seeburg Consolette

Я работаю над настенным устройством Seeburg Jukebox. У меня он без проблем воспроизводит по одной дорожке с SD-карты. Но мне нужна помощь в том, чтобы быть новичком в программировании: 1. Код длинный, потому что он может воспроизводить 160 песен. 2. Было бы неплохо, если бы это было возможно. Будем признательны за любую помощь с этим кодом.

#include <SD.h>
#include <SPI.h>
#include <Adafruit_VS1053.h>

#define BREAKOUT_RESET  9      // вывод сброса VS1053 (выход)
#define BREAKOUT_CS     10     // вывод выбора микросхемы VS1053 (выход)
#define BREAKOUT_DCS    8      // VS1053 Выбор данных/команд (выход)
#define SHIELD_RESET  -1      // вывод сброса VS1053 (не используется!)
#define SHIELD_CS     7      // вывод выбора микросхемы VS1053 (выход)
#define SHIELD_DCS    6      // VS1053 Выбор данных/команд (выход)
#define CARDCS 4     // пин выбора чипа карты
#define DREQ 3       // VS1053 Запрос данных, в идеале вывод прерывания
Adafruit_VS1053_FilePlayer musicPlayer = 
Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);

int opto = 18;

void setup() {    
  Serial.begin(9600); 
  if (! musicPlayer.begin()) {}
  if (!SD.begin(CARDCS)) {}

  musicPlayer.setVolume(1,1);

  pinMode(opto, INPUT); //инициализируем цифровой вывод как вход оптоизолятора.
  digitalWrite(opto, HIGH);} // включает внутренний подтягивающий резистор.

void loop() {

  int number = 0;  // считает импульсы алфавита
  int letter = 0;  // подсчитывает цифровые импульсы.
  int buffer[4] = {1,1,1,1}; // буфер для чтения ввода. Если 4 чтения подряд одинаковы, это допустимый ввод.
  int buffndx = 0; 
  int pausecnt = 0; // подсчитывает количество прочитанных HIGH.
  int maxpause = 30; // когда pausecnt достигает maxpause, мы находимся в паузе между alpa и numeric, иначе мы находимся в конце передачи.
  int countpause = false;
  buffer[0] = 1;
  buffer[1] = 1;
  buffer[2] = 1;
  buffer[3] = 1;

Serial.println("SEEBURG CONSOLETTE JUKEBOX");

  //Числовой цикл//
  while( pausecnt < maxpause ) { 
     buffer[buffndx] = digitalRead(opto); // читаем входной пин
     if(buffer[buffndx] != 1){}
    delay(8); // немного раздвигаем чтения.
     buffndx++; 
     if (buffndx == 4) buffndx = 0; // вращаем индекс буфера.
     if ((buffer[0] == 0) && (buffer[1] == 0) && (buffer[2] == 0) && (buffer[3] == 0) ){ // мы получили правильный ввод, поэтому обработаем его.
        pausecnt = 0; // мы получили наш пульс, поэтому перезапустите часы для следующего.
        number++; //увеличиваем числовой счетчик.
        while(! ((buffer[0] == 1 ) && (buffer[1] == 1) && (buffer[2] == 1) && (buffer[3] == 1)) ) { // Цикл, пока мы не получим действительный ВЫСОКИЙ
        buffer[buffndx] = digitalRead(opto); // читаем входной пин
        buffndx++; // вращаем индекс буфера
    if (buffndx == 4) buffndx = 0;} // вращаем индекс буфера.
        countpause = true; //мы получаем входные данные, поэтому начинаем считать паузы вместо вечного цикла.
        continue;}else{
    if (countpause == true) pausecnt++;}} // иначе неверный ввод


  // Буквенный цикл//
    pausecnt = 0;   // Сброс счетчика паузы. Готов к приходу следующего потока импульсов.
    countpause = false; // цикл до тех пор, пока не будет получен импульс.
    while( pausecnt < maxpause ) { // Начинаем цифровой цикл
    buffer[buffndx] = digitalRead(opto); // читаем входной пин
    delay(8);
    buffndx++; 
    if (buffndx == 4) buffndx = 0; // вращаем индекс буфера.
    if ((buffer[0] == 0) && (buffer[1] == 0) && (buffer[2] == 0) && (buffer[3] == 0) ){ // мы получили правильный ввод, поэтому обработаем его.
        pausecnt = 0; // мы получили наш пульс, поэтому перезапустите часы для следующего.
        letter++; //увеличиваем счетчик алфавита.
        while(! ((buffer[0] == 1) && (buffer[1] == 1) && (buffer[2] == 1) && (buffer[3] == 1)) ) { // Цикл, пока мы не получим действительный ВЫСОКИЙ
        buffer[buffndx] = digitalRead(opto); // читаем входной пин
        buffndx++; // вращаем индекс буфера
    if (buffndx == 4) buffndx = 0;} // вращаем индекс буфера.
        countpause = true; //мы получаем входные данные, поэтому начинаем считать паузы вместо вечного цикла.
        continue;}else{
     if (countpause == true) pausecnt++;} // иначе неверный ввод// иначе неверный ввод

  }

 //изменить сигнал//
    {number = 10 - number;
    letter = 21 - letter;}

  String signal = "";

  if(letter == 1) signal += "A";
  if(letter == 2) signal += "B";
  if(letter == 3) signal += "C";
  if(letter == 4) signal += "D";
  if(letter == 5) signal += "E";
  if(letter == 6) signal += "F";
  if(letter == 7) signal += "G";
  if(letter == 8) signal += "H";
  if(letter == 9) signal += "J";
  if(letter == 10) signal += "K";
  if(letter == 11) signal += ("L");
  if(letter == 12) signal += ("M");
  if(letter == 13) signal += ("N");
  if(letter == 14) signal += ("P");
  if(letter == 15) signal += ("Q");
  if(letter == 16) signal += ("R");
  if(letter == 17) signal += ("S");
  if(letter == 18) signal += ("T");
  if(letter == 19) signal += ("U");
  if(letter == 20) signal += ("V");

  signal += String(number);
  Serial.println(signal);
  delay(1000);

        //////////А////////////
   if(letter == 1 && number == 1);
   {musicPlayer.playFullFile("A1.mp3");}

   if(letter == 1 && number == 2);
   {musicPlayer.playFullFile("A2.mp3");} 

   if(letter == 1 && number == 3);
   {musicPlayer.playFullFile("A3.mp3");} 

   if(letter == 1 && number == 4);
  {musicPlayer.playFullFile("A4.mp3");}

   if(letter == 1 && number == 5);
  {musicPlayer.playFullFile("A5.mp3");} 

   if(letter == 1 && number == 6);
  {musicPlayer.playFullFile("A6.mp3");} 

   if(letter == 1 && number == 7);
  {musicPlayer.playFullFile("A7.mp3");} 

   if(letter == 1 && number == 8);
   {musicPlayer.playFullFile("A8.mp3");}

           //////////В////////////
   if(letter == 2 && number == 1);
   {musicPlayer.playFullFile("B1.mp3");} 

   if(letter == 2 && number == 2);
   {musicPlayer.playFullFile("B2.mp3");} 

   if(letter == 2 && number == 3);
   {musicPlayer.playFullFile("B3.mp3");} 

   if(letter == 2 && number == 4);
   {musicPlayer.playFullFile("B4.mp3");}

   if(letter == 2 && number == 5);
   {musicPlayer.playFullFile("B5.mp3");} 

   if(letter == 2 && number == 6);
  {musicPlayer.playFullFile("B6.mp3");} 

   if(letter == 2 && number == 7);
   {musicPlayer.playFullFile("B7.mp3");} 

   if(letter == 2 && number == 8);
   {musicPlayer.playFullFile("B8.mp3");}

    //////////С////////////
   if(letter == 3 && number == 1);
   {musicPlayer.playFullFile("C1.mp3");} 

   if(letter == 3 && number == 2);
   {musicPlayer.playFullFile("C2.mp3");} 

   if(letter == 3 && number == 3);
   {musicPlayer.playFullFile("C3.mp3");} 

   if(letter == 3 && number == 4);
   {musicPlayer.playFullFile("C4.mp3");}

   if(letter == 3 && number == 5);
   {musicPlayer.playFullFile("C5.mp3");} 

   if(letter == 3 && number == 6);
    {musicPlayer.playFullFile("C6.mp3");}

   if(letter == 3 && number == 7);
    {musicPlayer.playFullFile("C7.mp3");} 

   if(letter == 3 && number == 8);
    {musicPlayer.playFullFile("C8.mp3");}

       //////////Д////////////
   if(letter == 4 && number == 1);
   {musicPlayer.playFullFile("D1.mp3");} 

   if(letter == 4 && number == 2);
   {musicPlayer.playFullFile("D2.mp3");} 

   if(letter == 4 && number == 3);
   {musicPlayer.playFullFile("D3.mp3");} 

   if(letter == 4 && number == 4);
   {musicPlayer.playFullFile("D4.mp3");}

   if(letter == 4 && number == 5);
   {musicPlayer.playFullFile("D5.mp3");} 

   if(letter == 4 && number == 6);
   {musicPlayer.playFullFile("D6.mp3");} 

   if(letter == 4 && number == 7);
   {musicPlayer.playFullFile("D7.mp3");} 

   if(letter == 4 && number == 8);
   {musicPlayer.playFullFile("D8.mp3");}


       //////////Е////////////
   if(letter == 5 && number == 1);
   {musicPlayer.playFullFile("E1.mp3");} 

   if(letter == 5 && number == 2);
   {musicPlayer.playFullFile("E2.mp3");} 

   if(letter == 5 && number == 3);
   {musicPlayer.playFullFile("E3.mp3");} 

   if(letter == 5 && number == 4);
   {musicPlayer.playFullFile("E4.mp3");}

   if(letter == 5 && number == 5);
   {musicPlayer.playFullFile("E5.mp3");} 

   if(letter == 5 && number == 6);
   {musicPlayer.playFullFile("E6.mp3");} 

   if(letter == 5 && number == 7);
   {musicPlayer.playFullFile("E7.mp3");} 

   if(letter == 5 && number == 8);
   {musicPlayer.playFullFile("E8.mp3");} 

          //////////Ф////////////
   if(letter == 6 && number == 1);
   {musicPlayer.playFullFile("F1.mp3");} 

   if(letter == 6 && number == 2);
   {musicPlayer.playFullFile("F2.mp3");} 

   if(letter == 6 && number == 3);
   {musicPlayer.playFullFile("F3.mp3");} 

   if(letter == 6 && number == 4);
   {musicPlayer.playFullFile("F4.mp3");}

   if(letter == 6 && number == 5);
   {musicPlayer.playFullFile("F5.mp3");} 

   if(letter == 6 && number == 6);
   {musicPlayer.playFullFile("F6.mp3");} 

   if(letter == 6 && number == 7);
   {musicPlayer.playFullFile("F7.mp3");} 

   if(letter == 6 && number == 8);
   {musicPlayer.playFullFile("F8.mp3");} 


          //////////ГРАММ////////////
   if(letter == 7 && number == 1);
  {musicPlayer.playFullFile("G1.mp3");} 

  if(letter == 7 && number == 2);
  {musicPlayer.playFullFile("G2.mp3");}

  if(letter == 7 && number == 3);
  {musicPlayer.playFullFile("G3.mp3");}

  if(letter == 7 && number == 4);
  {musicPlayer.playFullFile("G4.mp3");}

  if(letter == 7 && number == 5);
  {musicPlayer.playFullFile("G5.mp3");}

  if(letter == 7 && number == 6);
  {musicPlayer.playFullFile("G6.mp3");}

  if(letter == 7 && number == 7);
  {musicPlayer.playFullFile("G7.mp3");}

  if(letter == 7 && number == 8);
  {musicPlayer.playFullFile("G8.mp3");}

            //////////ЧАС//////////;//
   if(letter == 8 && number == 1);
  {musicPlayer.playFullFile("H1.mp3");} 

  if(letter == 8 && number == 2);
  {musicPlayer.playFullFile("H2.mp3");}

  if(letter == 8 && number == 3);
  {musicPlayer.playFullFile("H3.mp3");}

  if(letter == 8 && number == 4);
  {musicPlayer.playFullFile("H4.mp3");}

  if(letter == 8 && number == 5);
  {musicPlayer.playFullFile("H5.mp3");}

  if(letter == 8 && number == 6);
  {musicPlayer.playFullFile("H6.mp3");}

  if(letter == 8 && number == 7);
  {musicPlayer.playFullFile("H7.mp3");}

  if(letter == 8 && number == 8);
  {musicPlayer.playFullFile("H8.mp3");}

            //////////J//////////;//
   if(letter == 9 && number == 1);
  {musicPlayer.playFullFile("J1.mp3");} 

  if(letter == 9 && number == 2);
  {musicPlayer.playFullFile("J2.mp3");}

  if(letter == 9 && number == 3);
  {musicPlayer.playFullFile("J3.mp3");}

  if(letter == 9 && number == 4);
  {musicPlayer.playFullFile("J4.mp3");}

  if(letter == 9 && number == 5);
  {musicPlayer.playFullFile("J5.mp3");}

  if(letter == 9 && number == 6);
  {musicPlayer.playFullFile("J6.mp3");}

  if(letter == 9 && number == 7);
  {musicPlayer.playFullFile("J7.mp3");}

  if(letter == 9 && number == 8);
  {musicPlayer.playFullFile("J8.mp3");}

            //////////К////////////
   if(letter == 10 && number == 1);
  {musicPlayer.playFullFile("K1.mp3");} 

  if(letter == 10 && number == 2);
  {musicPlayer.playFullFile("K2.mp3");}

  if(letter == 10 && number == 3);
  {musicPlayer.playFullFile("K3.mp3");}

  if(letter == 10 && number == 4);
  {musicPlayer.playFullFile("K4.mp3");}

  if(letter == 10 && number == 5);
  {musicPlayer.playFullFile("K5.mp3");}

  if(letter == 10 && number == 6);
  {musicPlayer.playFullFile("K6.mp3");}

  if(letter == 10 && number == 7);
  {musicPlayer.playFullFile("K7.mp3");}

  if(letter == 10 && number == 8);
  {musicPlayer.playFullFile("K8.mp3");}


              //////////Л////////////
   if(letter == 11 && number == 1);
  {musicPlayer.playFullFile("L1.mp3");} 

  if(letter == 11 && number == 2);
  {musicPlayer.playFullFile("L2.mp3");}

  if(letter == 11 && number == 3);
  {musicPlayer.playFullFile("L3.mp3");}

  if(letter == 11 && number == 4);
  {musicPlayer.playFullFile("L4.mp3");}

  if(letter == 11 && number == 5);
  {musicPlayer.playFullFile("L5.mp3");}

  if(letter == 11 && number == 6);
  {musicPlayer.playFullFile("L6.mp3");}

  if(letter == 11 && number == 7);
  {musicPlayer.playFullFile("L7.mp3");}

  if(letter == 11 && number == 8);
  {musicPlayer.playFullFile("L8.mp3");}

              //////////М////////////
   if(letter == 12 && number == 1);
  {musicPlayer.playFullFile("M1.mp3");} 

  if(letter == 12 && number == 2);
  {musicPlayer.playFullFile("M2.mp3");}

  if(letter == 12 && number == 3);
  {musicPlayer.playFullFile("M3.mp3");}

  if(letter == 12 && number == 4);
  {musicPlayer.playFullFile("M4.mp3");}

  if(letter == 12 && number == 5);
  {musicPlayer.playFullFile("M5.mp3");}

  if(letter == 12 && number == 6);
  {musicPlayer.playFullFile("M6.mp3");}

  if(letter == 12 && number == 7);
  {musicPlayer.playFullFile("M7.mp3");}

  if(letter == 12 && number == 8);
  {musicPlayer.playFullFile("M8.mp3");}

              //////////Н////////////
   if(letter == 13 && number == 1);
  {musicPlayer.playFullFile("N1.mp3");} 

  if(letter == 13 && number == 2);
  {musicPlayer.playFullFile("N2.mp3");}

  if(letter == 13 && number == 3);
  {musicPlayer.playFullFile("N3.mp3");}

  if(letter == 13 && number == 4);
  {musicPlayer.playFullFile("N4.mp3");}

  if(letter == 13 && number == 5);
  {musicPlayer.playFullFile("N5.mp3");}

  if(letter == 13 && number == 6);
  {musicPlayer.playFullFile("N6.mp3");}

  if(letter == 13 && number == 7);
  {musicPlayer.playFullFile("N7.mp3");}

  if(letter == 13 && number == 8);
  {musicPlayer.playFullFile("N8.mp3");}

              //////////П////////////
   if(letter == 14 && number == 1);
  {musicPlayer.playFullFile("P1.mp3");} 

  if(letter == 14 && number == 2);
  {musicPlayer.playFullFile("P2.mp3");}

  if(letter == 14 && number == 3);
  {musicPlayer.playFullFile("P3.mp3");}

  if(letter == 14 && number == 4);
  {musicPlayer.playFullFile("P4.mp3");}

  if(letter == 14 && number == 5);
  {musicPlayer.playFullFile("P5.mp3");}

  if(letter == 14 && number == 6);
  {musicPlayer.playFullFile("P6.mp3");}

  if(letter == 14 && number == 7);
  {musicPlayer.playFullFile("P7.mp3");}

  if(letter == 14 && number == 8);
  {musicPlayer.playFullFile("P8.mp3");}

              //////////В////////////
   if(letter == 15 && number == 1);
  {musicPlayer.playFullFile("Q1.mp3");} 

  if(letter == 15 && number == 2);
  {musicPlayer.playFullFile("Q2.mp3");}

  if(letter == 15 && number == 3);
  {musicPlayer.playFullFile("Q3.mp3");}

  if(letter == 15 && number == 4);
  {musicPlayer.playFullFile("Q4.mp3");}

  if(letter == 15 && number == 5);
  {musicPlayer.playFullFile("Q5.mp3");}

  if(letter == 15 && number == 6);
  {musicPlayer.playFullFile("Q6.mp3");}

  if(letter == 15 && number == 7);
  {musicPlayer.playFullFile("Q7.mp3");}

  if(letter == 15 && number == 8);
  {musicPlayer.playFullFile("Q8.mp3");}

              //////////Р////////////
   if(letter == 16 && number == 1);
  {musicPlayer.playFullFile("R1.mp3");} 

  if(letter == 16 && number == 2);
  {musicPlayer.playFullFile("R2.mp3");}

  if(letter == 16 && number == 3);
  {musicPlayer.playFullFile("R3.mp3");}

  if(letter == 16 && number == 4);
  {musicPlayer.playFullFile("R4.mp3");}

  if(letter == 16 && number == 5);
  {musicPlayer.playFullFile("R5.mp3");}

  if(letter == 16 && number == 6);
  {musicPlayer.playFullFile("R6.mp3");}

  if(letter == 16 && number == 7);
  {musicPlayer.playFullFile("R7.mp3");}

  if(letter == 16 && number == 8);
  {musicPlayer.playFullFile("R8.mp3");}

              //////////С////////////
   if(letter == 17 && number == 1);
  {musicPlayer.playFullFile("S1.mp3");} 

  if(letter == 17 && number == 2);
  {musicPlayer.playFullFile("S2.mp3");}

  if(letter == 17 && number == 3);
  {musicPlayer.playFullFile("S3.mp3");}

  if(letter == 17 && number == 4);
  {musicPlayer.playFullFile("S4.mp3");}

  if(letter == 17 && number == 5);
  {musicPlayer.playFullFile("S5.mp3");}

  if(letter == 17 && number == 6);
  {musicPlayer.playFullFile("S6.mp3");}

  if(letter == 17 && number == 7);
  {musicPlayer.playFullFile("S7.mp3");}

  if(letter == 17 && number == 8);
  {musicPlayer.playFullFile("S8.mp3");}

              //////////Т////////////
   if(letter == 18 && number == 1);
  {musicPlayer.playFullFile("T1.mp3");} 

  if(letter == 18 && number == 2);
  {musicPlayer.playFullFile("T2.mp3");}

  if(letter == 18 && number == 3);
  {musicPlayer.playFullFile("T3.mp3");}

  if(letter == 18 && number == 4);
  {musicPlayer.playFullFile("T4.mp3");}

  if(letter == 18 && number == 5);
  {musicPlayer.playFullFile("T5.mp3");}

  if(letter == 18 && number == 6);
  {musicPlayer.playFullFile("T6.mp3");}

  if(letter == 18 && number == 7);
  {musicPlayer.playFullFile("T7.mp3");}

  if(letter == 18 && number == 8);
  {musicPlayer.playFullFile("T8.mp3");}

              //////////У////////////
   if(letter == 19 && number == 1);
  {musicPlayer.playFullFile("U1.mp3");} 

  if(letter == 19 && number == 2);
  {musicPlayer.playFullFile("U2.mp3");}

  if(letter == 19 && number == 3);
  {musicPlayer.playFullFile("U3.mp3");}

  if(letter == 19 && number == 4);
  {musicPlayer.playFullFile("U4.mp3");}

  if(letter == 19 && number == 5);
  {musicPlayer.playFullFile("U5.mp3");}

  if(letter == 19 && number == 6);
  {musicPlayer.playFullFile("U6.mp3");}

  if(letter == 19 && number == 7);
  {musicPlayer.playFullFile("U7.mp3");}

  if(letter == 19 && number == 8);
  {musicPlayer.playFullFile("U8.mp3");}

            //////////В////////////
   if(letter == 20 && number == 1);
  {musicPlayer.playFullFile("V1.mp3");} 

  if(letter == 20 && number == 2);
  {musicPlayer.playFullFile("V2.mp3");}

  if(letter == 20 && number == 3);
  {musicPlayer.playFullFile("V3.mp3");}

  if(letter == 20 && number == 4);
  {musicPlayer.playFullFile("V4.mp3");}

  if(letter == 20 && number == 5);
  {musicPlayer.playFullFile("V5.mp3");}

  if(letter == 20 && number == 6);
  {musicPlayer.playFullFile("V6.mp3");}

  if(letter == 20 && number == 7);
  {musicPlayer.playFullFile("V7.mp3");}

  if(letter == 20 && number == 8);
  {musicPlayer.playFullFile("V8.mp3");}
}

, 👍1

Обсуждение

Я пытаюсь начать аналогичный проект - мне интересно, не могли бы вы указать мне, где вы получили информацию о вашем аппаратном интерфейсе? Заранее спасибо!, @user2526332


1 ответ


3

Этот ответ касается только первой проблемы:

  1. Код длинный, потому что он может воспроизводить 160 песен.

Кроме того, вы можете выровнять свой код, выделив его и нажав Ctrl-K.

Я буду улучшать его по частям (предоставив вам ручную работу):

Выровнять код

#define BREAKOUT_RESET  9      // вывод сброса VS1053 (выход)
#define BREAKOUT_CS     10     // вывод выбора микросхемы VS1053 (выход)
#define BREAKOUT_DCS    8      // VS1053 Выбор данных/команд (выход)
#define SHIELD_RESET  -1      // вывод сброса VS1053 (не используется!)

Выровняйте этот код, чтобы все значения располагались друг под другом, а комментарии начинались в одном столбце.

Использовать цикл for

  buffer[0] = 1;
  buffer[1] = 1;
  buffer[2] = 1;
  buffer[3] = 1;

Вы можете использовать цикл for, например:

for (int n = 0; n < 4; n++)
{
    buffer[n] = 1;
}

Однако этот код можно удалить, так как значения уже инициализированы в:

int buffer[4] = {1,1,1,1}; // буфер для чтения ввода. Если 4 чтения подряд одинаковы, это допустимый ввод.

Предотвращение почти идентичного дублирования кода

В части цикла цифр/букв:

//Числовой цикл//
  while( pausecnt < maxpause ) { 
     buffer[buffndx] = digitalRead(opto); // читаем входной пин
     if(buffer[buffndx] != 1){}
    delay(8); // немного раздвигаем чтения.
     buffndx++; 
     if (buffndx == 4) buffndx = 0; // вращаем индекс буфера.
     if ((buffer[0] == 0) && (buffer[1] == 0) && (buffer[2] == 0) && (buffer[3] == 0) ){ // мы получили правильный ввод, поэтому обработаем его.
        pausecnt = 0; // мы получили наш пульс, поэтому перезапустите часы для следующего.
        number++; //увеличиваем числовой счетчик.
        while(! ((buffer[0] == 1 ) && (buffer[1] == 1) && (buffer[2] == 1) && (buffer[3] == 1)) ) { // Цикл, пока мы не получим действительный ВЫСОКИЙ
        buffer[buffndx] = digitalRead(opto); // читаем входной пин
        buffndx++; // вращаем индекс буфера
    if (buffndx == 4) buffndx = 0;} // вращаем индекс буфера.
        countpause = true; //мы получаем входные данные, поэтому начинаем считать паузы вместо вечного цикла.
        continue;}else{
    if (countpause == true) pausecnt++;}} // иначе неверный ввод


  // Буквенный цикл//
    pausecnt = 0;   // Сброс счетчика паузы. Готов к приходу следующего потока импульсов.
    countpause = false; // цикл до тех пор, пока не будет получен импульс.
    while( pausecnt < maxpause ) { // Начинаем цифровой цикл
    buffer[buffndx] = digitalRead(opto); // читаем входной пин
    delay(8);
    buffndx++; 
    if (buffndx == 4) buffndx = 0; // вращаем индекс буфера.
    if ((buffer[0] == 0) && (buffer[1] == 0) && (buffer[2] == 0) && (buffer[3] == 0) ){ // мы получили правильный ввод, поэтому обработаем его.
        pausecnt = 0; // мы получили наш пульс, поэтому перезапустите часы для следующего.
        letter++; //увеличиваем счетчик алфавита.
        while(! ((buffer[0] == 1) && (buffer[1] == 1) && (buffer[2] == 1) && (buffer[3] == 1)) ) { // Цикл, пока мы не получим действительный ВЫСОКИЙ
        buffer[buffndx] = digitalRead(opto); // читаем входной пин
        buffndx++; // вращаем индекс буфера
    if (buffndx == 4) buffndx = 0;} // вращаем индекс буфера.
        countpause = true; //мы получаем входные данные, поэтому начинаем считать паузы вместо вечного цикла.
        continue;}else{
     if (countpause == true) pausecnt++;} // иначе неверный ввод// иначе неверный ввод

  }

Сначала добавьте скобки и выровняйте их (я делаю это для числовой части):

 while( pausecnt < maxpause ) 
 { 
   buffer[buffndx] = digitalRead(opto); // читаем входной пин

   if(buffer[buffndx] != 1)
   {
   }

   delay(8); // немного раздвигаем чтения.
   buffndx++; 

   if (buffndx == 4)
   {
     buffndx = 0; // вращаем индекс буфера.
   }

   if ((buffer[0] == 0) && (buffer[1] == 0) && (buffer[2] == 0) && (buffer[3] == 0) )
   {
     // мы получили допустимый ввод, так что обработайте его.
     pausecnt = 0; // мы получили наш пульс, поэтому перезапустите часы для следующего.
     number++; //увеличиваем числовой счетчик.
     while(! ((buffer[0] == 1 ) && (buffer[1] == 1) && (buffer[2] == 1) && (buffer[3] == 1)) ) 
     { 
        // Цикл, пока мы не получим допустимый HIGH
        buffer[buffndx] = digitalRead(opto); // читаем входной пин
        buffndx++; // вращаем индекс буфера

        if (buffndx == 4) 
        {
          buffndx = 0;
        }
      } // вращаем индекс буфера.

      countpause = true; //мы получаем входные данные, поэтому начинаем считать паузы вместо вечного цикла.
      continue;
    }
    else
    {
      if (countpause == true) 
      {
        pausecnt++;
      }
    } // иначе неверный ввод

Обратите внимание, что он длиннее, но намного понятнее (четкий код важнее, чем короткий).

Теперь, потому что код, начинающийся с:

buffer[buffndx] = digitalRead(opto); // читаем входной пин
...

Пока код конца числового цикла почти не совпадет с буквенным кодом цикла, попытайтесь найти различия между двумя частями: только переменная число и буква . Таким образом, вы создаете новую функцию (например, processKey), вы передаете число или букву (так, для числа вызовите processKey(number), а для буквы вызовите processKey(letter). Обратите внимание, что оба являются целыми числами. Новая функция будет:

int processKey(int key) // Элемент представляет собой число или букву
{
    ...
    return key;
}

Вы возвращаете ключ (который, возможно, является увеличенным значением (из-за number++ в исходном коде). Несколько продвинутый способ — передать его как указатель:

void processKey(int* key) // Элемент представляет собой число или букву

и измените ключ с помощью (*key)++; и вызовите функции с помощью processKey(&number) и processKey(&letter) .

Использовать определение

Обратите внимание, что вместо 4 лучше использовать #define.

     if(buffer[buffndx] != 1){}

Удалить мертвый код

Эта строка ничего не делает; чтобы было понятно, всегда выравнивайте скобки:

     if(buffer[buffndx] != 1)
     {
     }

Всегда используйте квадратные скобки {

if (buffndx == 4) buffndx = 0; // вращаем индекс буфера.

Использование:

if (buffndx == 4) 
{
    buffndx = 0; // вращаем индекс буфера.
}

Избегайте дублирования кода

     if ((buffer[0] == 0) && (buffer[1] == 0) && (buffer[2] == 0) && (buffer[3] == 0) ){ // мы получили правильный ввод, поэтому обработаем его.
        pausecnt = 0; // мы получили наш пульс, поэтому перезапустите часы для следующего.
        number++; //увеличиваем числовой счетчик.
        while(! ((buffer[0] == 1 ) && (buffer[1] == 1) && (buffer[2] == 1) && (buffer[3] == 1)) ) { // Цикл, пока мы не получим действительный ВЫСОКИЙ

В этой части вы дважды проверяете, равны ли значения 0 или 1, создаете для этого функцию (например, areAllValues(buffer, 0) для первого вызова и areAllValues(buffer, 1) для следующего. Если 0 и 1 являются единственными значениями, используйте логическое значение (True/False).

    if (buffndx == 4) buffndx = 0;} // вращать индекс буфера.

Используйте здесь тот же #define, который я предложил выше.

Не проверять на истинность/ложь

    if (countpause == true) pausecnt++;}} // иначе неверный ввод

Не нужно проверять истинность:

    if (countpause) ...

Используйте правильный регистр

Также лучше всегда использовать правильный регистр, поэтому countPause вместо countpause.

Избегайте повторения операторов if (1)

  if(letter == 1) signal += "A";
  if(letter == 2) signal += "B";
  if(letter == 3) signal += "C";
  if(letter == 4) signal += "D";
  if(letter == 5) signal += "E";
  if(letter == 6) signal += "F";
  if(letter == 7) signal += "G";
  if(letter == 8) signal += "H";
  if(letter == 9) signal += "J";
  if(letter == 10) signal += "K";
  if(letter == 11) signal += ("L");
  if(letter == 12) signal += ("M");
  if(letter == 13) signal += ("N");
  if(letter == 14) signal += ("P");
  if(letter == 15) signal += ("Q");
  if(letter == 16) signal += ("R");
  if(letter == 17) signal += ("S");
  if(letter == 18) signal += ("T");
  if(letter == 19) signal += ("U");
  if(letter == 20) signal += ("V");

Вместо этого используйте значение символа ASCII.

 if ((letter >= 1) && (letter <= 20))
 {
     signal += (char) ((int)('A') + letter - 1);
 {

Избегайте повторения операторов if (2)

Большая часть:

 if(letter == 1 && number == 1);
   {musicPlayer.playFullFile("A1.mp3");}

   if(letter == 1 && number == 2);
   {musicPlayer.playFullFile("A2.mp3");} 

 ...

Используйте два оператора if, заполнив первый и второй символы имени файла.

char[] fileName = "XX.mp3";

if ((letter >= 1) && (letter <= 20))
{
    if ((number >= 1) && (number <= 8))
    {
       fileName[0] = (char) ((int)('A') + letter - 1);
       fileName[1] = (char) ((int)('0') + number - 1);
       musicPlayer.playFullFile(fileName);
    }
}

Начать с 0

Кстати, инженеры-программисты обычно начинают массивы/счетчики и т. д. с 0 вместо 1; что позволяет сократить число конверсий -1.

,

Моя интерпретация фразы «было бы неплохо, если бы она выстраивалась в очередь к следующему выбору, если это возможно» заключалась в том, чтобы следующая песня начинала играть, как только закончилась текущая :-), @Gerben

Я обратился только к первой проблеме; Я добавлю это в ответ., @Michel Keijzers