Como salir del while en este codigo??

Hola. grupo.

Tengo un problema que no puedo solucionar, principalmente por que estoy iniciando con arduino y la programación les muestro mi código, del cual no puedo pasar del case 49 al case 50, ambos deseo que realicen el ciclo infinito para lo cual uso while pero luego deseo cambiar y ya no puedo salir del while.

Espero me puedan brindar algunas ideas por favor, gracias;

byte escena=0;



void void setup()
{
    Serial.begin(9600);
}

void void loop()
{
    if(Serial.available()>0){
        escena=Serial.read();
        
        switch (escena) {
            case 49 :
              mostrar_escena1();// do something
              break;
            case 50:
              mostrar_escena2();// do something
              break;
            default:
              // do something
        }
    }
}

void mostrar_escena1(){
do{
   Serial.println("recibi escena 1");  
} while (escena==49);
  
}


void mostrar_escena2(){
while(escena==50){
    Serial.println("recibi escena 2");
}

}

El código en sí no es muy comprensible (en el propósito); pero lo que sí puedo decir, es que lo único que necesitas, es que la condición del while eventualmente no se cumpla (o pase por una sentencia break). Por ejemplo:

while (escena==49);

Como acaba en punto y coma, eso quiere decir que en ese bloque de código no se hace nada más que detener la ejecución. La única forma de salir de un ciclo así, quizás sea con una interrupción (aunque para tu propósito, esto no es recomendado). Este while necesita tener instrucciones en su bloque, que eventualmente haga que se rompa el ciclo (break o que "escena != 49").

Lo que debería importar, es la respuesta a la siguiente pregunta: exactamente para qué necesitas un ciclo para cada "escena"?

Si insertas una condición que dependa del valor de una variable es posible, que cambies de escena en escena a pesar del ciclo infinito establecido por la instrucción while().

Esto puede ser automático usando un control de tiempo con millis(); o bien manual, usando un potenciómetro, un dispositivo táctil, o incluso un sensor.

Este es un ejemplo de “las escenas”, que uso en el proyecto; mediante la pantalla táctil, es posible salir del ciclo perpetuo establecido por while(1), este menú corresponde al menú principal.

void MP()
{
 while(1)
 {
  GD.Clear();
  GD.Begin(BITMAPS);
  GD.ColorA(25);
  GD.Vertex2ii(0, 0, 15);   //Imagen de fondo de  800x480
  GD.ColorA(255);
  GD.get_inputs();

  GD.SaveContext();
  GD.ColorA(150);  
  Poly po;   
//Panel maestro
  GD.ColorRGB(0x008B4B);  
  GD.Tag(15);    po.begin();  po.v(16*(800),16*115);    po.v(16*(765),16*150);   po.v(16*(765),16*330);    po.v(16*(800),16*365);    po.draw();  GD.Tag(255);  
  GD.RestoreContext(); 

  if (GD.inputs.tag==15)
      {delay(145);
        M1();
      }   

  GD.swap();
 }
}

Luego de activar la entrada táctil, ocurre el cambio a la siguiente “escena” (yo les llamo “menú”). Cada uno de los menús es un ciclo controlado por una instrucción while().

Video: escenas o menús usando la instrucción while()

Muchas gracias por sus respuestas, estoy preparando escenas con 10 focos de 220V donde se prenden haciendo distintas combinaciones en ciertos tiempos, quiero meter una de esas combinaciones en while para que se repita hasta que se cambie la orden, aun no lo logre, estudiare el ejemplo de TFTLCDCyg y haber que puedo hacer ya que soy demasiado nuevo en esto y me cuesta comprender los codigos.

Saludos