Salir de un bucle

Buenas a todos, estoy empezando con el arduino y he modificado una practica que me venia con mi arduino. Lo que he qeruido hacer es que 3 led se enciendan progresivamente y una vez encencidos parpadeen. Hasta ahi todo bien, lo que quiero hacer es volviendo a apretar el boton se apague todo pero no hay manera de hacerlo y llevo ya un buen rato

int switchState = 0;

void setup() {
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(2,INPUT);
}
void loop(){
  switchState = digitalRead(2);
  if (switchState == LOW) {
    //the button is not presed
    digitalWrite(3,LOW); //green LED
    digitalWrite(4,LOW); // red LED
    digitalWrite(5,LOW); // red LED
  }
  else { // the burron is pressed
      digitalWrite(5,HIGH); //red LED
      delay(250);
      digitalWrite(4,HIGH); // red LED
      delay(250);
      digitalWrite(3,HIGH); // green LED
      
      delay(1000);
      digitalWrite(3,LOW); //green LED
      digitalWrite(4,LOW); // red LED
      digitalWrite(5,LOW); // red LED
      
      while(switchState == HIGH)
      {
        
      delay(250);
      digitalWrite(3,HIGH); //green LED
      digitalWrite(4,HIGH); // red LED
      digitalWrite(5,HIGH); // red LED
      delay(250);
      digitalWrite(3,LOW); //green LED
      digitalWrite(4,LOW); // red LED
      digitalWrite(5,LOW); // red LED
      
     
      
      }
  
      
  }
}// go bavk to the beginning of the loop

Si alguien me puede ayudar le estaria muy agradecido.

El problema es que cuando haces el bucle while no vuelves a leer e botón. Si el botón cambia de estado no lo "ves" y por lo tanto nunca se sale del bucle.

Creo que algo así haría lo que quieres:

int switchState = 0;

void setup() {
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(2,INPUT);
}
void loop(){
  switchState = digitalRead(2);
  if (switchState == LOW) {
    //the button is not presed
    digitalWrite(3,LOW); //green LED
    digitalWrite(4,LOW); // red LED
    digitalWrite(5,LOW); // red LED
  }
  else { // the burron is pressed
      digitalWrite(5,HIGH); //red LED
      delay(250);
      digitalWrite(4,HIGH); // red LED
      delay(250);
      digitalWrite(3,HIGH); // green LED
      
      delay(1000);
      digitalWrite(3,LOW); //green LED
      digitalWrite(4,LOW); // red LED
      digitalWrite(5,LOW); // red LED
      
      do
      {
         switchState = digitalRead(2);
         delay(250);
         digitalWrite(3,HIGH); //green LED
         digitalWrite(4,HIGH); // red LED
         digitalWrite(5,HIGH); // red LED
         delay(250);
         digitalWrite(3,LOW); //green LED
         digitalWrite(4,LOW); // red LED
         digitalWrite(5,LOW); // red LED
      } while(switchState == HIGH);
  }
}// go bavk to the beginning of the loop

Muchas Gracias! Hay alguna manera de que pueda hacer lo mismo pero en vez de estar pulsando el boton todo el rato lo haga solo hasta que yo lo vuelva a pulsar?

Muchas gracias por todo

Si, lo de entrar en la secuencia se puede hacer fácilmente. Pero entonces, si no pulsas el botón (y lo vuelves a soltar), como se sale del bucle? Solo se hace un número de veces?

Prueba

int switchState = 0;

void setup() {
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(2,INPUT);
}
void loop(){
  switchState = digitalRead(2);
  if (switchState == LOW) {
    //the button is not presed
    digitalWrite(3,LOW); //green LED
    digitalWrite(4,LOW); // red LED
    digitalWrite(5,LOW); // red LED
  }
  else { // the burron is pressed
      digitalWrite(5,HIGH); //red LED
      delay(250);
      digitalWrite(4,HIGH); // red LED
      delay(250);
      digitalWrite(3,HIGH); // green LED
      
      delay(1000);
      digitalWrite(3,LOW); //green LED
      digitalWrite(4,LOW); // red LED
      digitalWrite(5,LOW); // red LED
      
  do{
      delay(250);
      digitalWrite(3,HIGH); //green LED
      digitalWrite(4,HIGH); // red LED
      digitalWrite(5,HIGH); // red LED
      delay(250);
      digitalWrite(3,LOW); //green LED
      digitalWrite(4,LOW); // red LED
      digitalWrite(5,LOW); // red LED
    } while(digitalRead(2) == HIGH);
  }
}

Solo para jugar con las posibles formas de hacerlo intentaré armar una máquina de estados donde cada situación es un nuevo estado, sea para prender 1 led o para prender varios. La gran diferencia es que este programa podra interrumpirse en cualquier momento y no como el actual que tiene demoras de 250 a 1000 mseg para reaccionar a una pulsada LOW.

Defino int states = 8;

Cuando se presiona el pulsador (HIGH) se inicia el primer estado

estado 0: indefinido mientras se presione el pulsador a LOW digitalWrite(5, LOW); //green LED digitalWrite(4, LOW); // red LED digitalWrite(3, LOW); // red LED

estado 1: por 250 mseg digitalWrite(5,HIGH); //red LED digitalWrite(4,LOW); // red LED digitalWrite(3,LOW); //green LED

estado 2: por 250 mseg digitalWrite(5,LOW); //red LED digitalWrite(4,HIGH); // red LED digitalWrite(3,LOW); //green LED

estado 3: por 250 mseg digitalWrite(5,LOW); //red LED digitalWrite(4,LOW); // red LED digitalWrite(3,HIGH); //green LED

estado 4: por 250 mseg digitalWrite(5,LOW); //red LED digitalWrite(4,LOW); // red LED digitalWrite(3,LOW); //green LED

estado 5: por 250 mseg digitalWrite(5,HIGH); //red LED digitalWrite(4,HIGH); // red LED digitalWrite(3,HIGH); //green LED

y repito 4 y 5 el estado 4 puedo usarlo como estado cuando suelto el pulsador

Aca el código

int switchState = 0;
int switchStateAnt = 0;
int estado = 1;
int estadoAnt = 0;
unsigned long time = 0;
bool status = false;
int retardo = 250;

void setup() {
  Serial.begin(9600);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(2,INPUT);
}
void loop(){
  
  char str[38];
  
  switchState = digitalRead(2);
  
  if (switchState == LOW) {
     estado = 0;
     switchStateAnt = 0;
  }
  if (switchState == HIGH && switchStateAnt == LOW) {
      estado = 1;
      retardo = 250;
      switchStateAnt = HIGH;
      time = millis();
  }

  sprintf(str, "Estado %d Ant = %d delay %d", estado, estadoAnt, retardo);
  Serial.println(str);
  
  switch (estado) {
      case 0:
              digitalWrite(5, LOW); //green LED
              digitalWrite(4, LOW); // red LED
              digitalWrite(3, LOW); // red LED
              break;
      case 1: 
              digitalWrite(5, HIGH); //green LED
              digitalWrite(4, LOW); // red LED
              digitalWrite(3, LOW); // red LED
              if (millis() - time > retardo) {
                 estado = 2;
                 retardo = 250;
                 time = millis();
              }
              break;
      case 2: 
              digitalWrite(5, LOW); //green LED
              digitalWrite(4, HIGH); // red LED
              digitalWrite(3, LOW); // red LED
              if (millis() - time > retardo) {
                 estado = 3;
                 retardo = 250;
                 time = millis();
              }
              break;
      case 3:   
              digitalWrite(5, LOW); //green LED
              digitalWrite(4, LOW); // red LED
              digitalWrite(3, HIGH); // red LED
              if (millis() - time > retardo) {
                 estado = 4;
                 retardo = 1000;
                 time = millis();
              }
              estadoAnt = 3;
              break;
      case 4:
              digitalWrite(5, LOW); //green LED
              digitalWrite(4, LOW); // red LED
              digitalWrite(3, LOW); // red LED
              if (millis() - time > retardo && estadoAnt == 3) {
                 estado = 5;
                 retardo = 250;
                 time = millis(); 
              } 
              if (millis() - time > retardo && estadoAnt == 5) {
                 estado = 5;
                 retardo = 250;
                 time = millis(); 
              }
              break;
      case 5:
              digitalWrite(5, HIGH); //green LED
              digitalWrite(4, HIGH); // red LED
              digitalWrite(3, HIGH); // red LED
              if (millis() - time > retardo) {
                 estado = 4;
                 time = millis();
              }
              estadoAnt = 5;
              break;
  }
}