Sonar Martinillo con ciclo while y terminarlo en cualquier punto [SOLUCIONADO]

Buenas tardes:
Me encuentro haciendo un prototipo que consiste en sonar la canción de "Martinillo" al pulsar un botón, esto junto a un led RGB que prende y apaga al compas de la música. El problemas que tengo es que en el momento de pulsar el botón en cualquier parte de la canción no para y tengo que esperar hasta que esta acabe. Quisiera ver si me pudieran ayudar con esto.
Gracias.

# define NOTE_G3 196
# define NOTE_G4 392    
# define NOTE_D5 294
# define NOTE_C4 262
# define NOTE_C5 523
# define NOTE_E4 330
# define NOTE_F4 349
# define NOTE_A4 440
# define NOTE_B4 494

int contador = 0;
int estadoBoton = 0;
int estado2Boton = 0;
int residuo = 0;
int residuo3 = 0;

void setup()
{
  pinMode(2, INPUT);
  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(7, OUTPUT);
  
  Serial.begin(9600);  
}

void loop()
{
  estadoBoton = digitalRead(2);
  while(estadoBoton == HIGH){
  tone(8, NOTE_C4, 50);
  digitalWrite(3, HIGH);
  delay(200);
  digitalWrite(3, LOW);
  delay(250);
  tone(8, NOTE_D5, 50);
  digitalWrite(5, HIGH);
  delay(200);
  digitalWrite(5, LOW);
  delay(250);
  tone(8, NOTE_E4, 50);
  digitalWrite(3, HIGH);
  delay(200);
  digitalWrite(3, LOW);
  delay(350);
  tone(8, NOTE_C4, 50);
  digitalWrite(7, HIGH);
  delay(200);
  digitalWrite(7, LOW);
  delay(250);
  tone(8, NOTE_C4, 50);
  digitalWrite(3, HIGH);
  delay(200);
  digitalWrite(3, LOW);
  delay(200);
  tone(8, NOTE_D5, 50);
  digitalWrite(5, HIGH);
  delay(200);
  digitalWrite(5, LOW);
  delay(200);
  tone(8, NOTE_E4, 50);
  digitalWrite(3, HIGH);
  delay(200);
  digitalWrite(3, LOW);
  delay(200);
  tone(8, NOTE_C4, 50);
  digitalWrite(7, HIGH);
  delay(200);
  digitalWrite(7, LOW);
  delay(250);
  tone(8, NOTE_E4, 50);
  digitalWrite(5, HIGH);
  delay(200);
  digitalWrite(5, LOW);
  delay(250);
  tone(8, NOTE_F4, 50);
  digitalWrite(3, HIGH);
  delay(200);
  digitalWrite(3, LOW);
  delay(250);
  tone(8, NOTE_G4, 50);
  digitalWrite(7, HIGH);
  delay(300);
  digitalWrite(7, LOW);
  delay(400);
  tone(8, NOTE_E4, 50);
  digitalWrite(5, HIGH);
  delay(200);
  digitalWrite(5, LOW);
  delay(200);
  tone(8, NOTE_F4, 50);
  digitalWrite(3, HIGH);
  delay(200);
  digitalWrite(3, LOW);
  delay(200);
  tone(8, NOTE_G4, 50);
  digitalWrite(7, HIGH);
  delay(300);
  digitalWrite(7, LOW);
  delay(400);
  tone(8, NOTE_G4, 50);
  digitalWrite(3, HIGH);
  delay(150);
  digitalWrite(3, LOW);
  delay(100);
  tone(8, NOTE_A4, 50);
  digitalWrite(7, HIGH);
  delay(150);
  digitalWrite(7, LOW);
  delay(100);
  tone(8, NOTE_G4, 50);
  digitalWrite(5, HIGH);
  delay(150);
  digitalWrite(5, LOW);
  delay(100);
  tone(8, NOTE_F4, 50);
  digitalWrite(3, HIGH);
  delay(150);
  digitalWrite(3, LOW);
  delay(100);
  tone(8, NOTE_E4, 50);
  digitalWrite(7, HIGH);
  delay(350);
  digitalWrite(7, LOW);
  delay(250);
  tone(8, NOTE_C4, 50);
  digitalWrite(5, HIGH);
  delay(350);
  digitalWrite(5, LOW);
  delay(250);
  tone(8, NOTE_G4, 50);
  digitalWrite(3, HIGH);
  delay(150);
  digitalWrite(3, LOW);
  delay(100);
  tone(8, NOTE_A4, 50);
  digitalWrite(7, HIGH);
  delay(150);
  digitalWrite(7, LOW);
  delay(100);
  tone(8, NOTE_G4, 50);
  digitalWrite(5, HIGH);
  delay(150);
  digitalWrite(5, LOW);
  delay(100);
  tone(8, NOTE_F4, 50);
  digitalWrite(3, HIGH);
  delay(150);
  digitalWrite(3, LOW);
  delay(100);
  tone(8, NOTE_E4, 50);
  digitalWrite(7, HIGH);
  delay(350);
  digitalWrite(7, LOW);
  delay(250);
  tone(8, NOTE_C4, 50);
  digitalWrite(5, HIGH);
  delay(350);
  digitalWrite(5, LOW);
  delay(250); 
  tone(8, NOTE_D5, 50);
  digitalWrite(3, HIGH);
  delay(250);
  digitalWrite(3, LOW);
  delay(350);
  tone(8, NOTE_G3, 50);
  digitalWrite(7, HIGH);
  delay(250);
  digitalWrite(7, LOW);
  delay(350);
  tone(8, NOTE_C4, 50);
  digitalWrite(5, HIGH);
  delay(250);
  digitalWrite(5, LOW);
  delay(550);
  tone(8, NOTE_D5, 50);
  digitalWrite(3, HIGH);
  delay(250);
  digitalWrite(3, LOW);
  delay(350);
  tone(8, NOTE_G3, 50);
  digitalWrite(7, HIGH);
  delay(250);
  digitalWrite(7, LOW);
  delay(350);
  tone(8, NOTE_C4, 50);
  digitalWrite(5, HIGH);
  delay(250);
  digitalWrite(5, LOW);
  delay(550);
    
  estado2Boton = digitalRead(2);
    if(estado2Boton == HIGH){
      break;
    }
  }
  delay(5000);
}

Puedes poner los datos (pin, nota, duracion, pinled, delays) en arrays y luego con un for ejecutas las notas y verificas si se ha pulsado el botón.
Algo así (solo pongo los datos de la primer nota, completar el resto, si no conté mal son 32 notas)

int pin[32] = {8, ...};
int nota[32] = {NOTE_C4, ...};
int durac[32] = {50, ...};
int led[32] = [3, ...];
int d1[32] = {200, ...};
int d2[32] = {250, ...};

void loop()
{
  estadoBoton = digitalRead(2);
  while(estadoBoton == HIGH){
    for(int i; i< 32; i++) { // 32 es la cantidad de notas
      tone(pin[i], nota[i], durac[i]);
      digitalWrite(led[i], HIGH);
      delay(d1[i]);
      digitalWrite(led[i], LOW);
      delay(d2[i]);
      estado2Boton = digitalRead(2);
      if(estado2Boton == HIGH){
        break;
      }
    }
  }
  delay(5000);
}

Por cierto, ¿algo que ver con @men_dominguez?
Me llamó la atención que justamente usaras código que puse de ejemplo en su tema sobre while

estado2Boton = digitalRead(2);
if(estado2Boton == HIGH){
  break;
}

Si justamente estudiamos en la misma escuela y pues somos del mismo grupo de tecnologia

Dile que si sirvió la respuesta (veo que si) edite el título de su tema y agregue [Solucionado], y que agradecer no cuesta nada. :wink:

Saludos

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.