lcd i2c congelado con blucles while

buenas resulta que estoy haciendo un menú con arduino uno y una pantalla i2c, y como toda la información no me entra en una pantalla pues estoy haciendo varias.

el codigo en si es:

void pantalla1(){
     int cont=0;
     int noSalir=0;

     while(noSalir==0 && cont<50){
     lcd.setcursor(0,0);
     lcd.print("pantalla 1");

     if(vboton2==1){
     noSalir=1;
     delay(200);
     }
     
     cont++;
     if(cont==50){
     pantalla2();
     }
     } 
}


void pantalla2(){
     int cont=0;
     int noSalir=0;

     while(noSalir==0 && cont<50){
     lcd.setcursor(0,0);
     lcd.print("pantalla 2");

     if(vboton2==1){
     noSalir=1;
     delay(200);
     }
     
     cont++;
     if(cont==50){
     pantalla1();
     }
     } 
}

el problema de este código es, funciona perfectamente, pero a los 7 min mas o menos se queda congelado y no entiendo porque…

alguna solución de como hacerlo? hay algo mal que se me escapa?

un saludo y gracias

Hola. Creo que tienes un problema en tu código con la memoria. Estás llamando recursivamente a una función desde la otra, y viceversa. Ten en cuenta que cuando la llamas, no se vacían de memoria las variables de la función desde la que estás llamando, pues no ha terminado (aunque lo hagas en la última instrucción de la misma). Al contrario, se crean en la pila variables nuevas para la función llamada. Así, lo que ocurre es que cada vez vas ocupando más memoria, hasta que la llenas y viene el crash. No es lo más normal que en un programa de arduino, una vez que llames una función, la ejecución ya no regrese nunca al bucle loop. Prueba, por ejemplo:

void pantalla1(){
// Aquí exclusivamente el código de dibujo de pantalla 1
}
void pantalla2(){
// Aquí exclusivamente el código de dibujo de pantalla 2
}

loop(){ //Aquí puedes poner tu juego de loops y delays para llamar alternativamente a pantalla1 o pantalla2
pantalla1(); 
//cuando el código regresa aquí, se ha vaciado la memoria de los datos de pantalla1.
delay(1000);
pantalla2();
//cuando el código regresa aquí, se ha vaciado la memoria de los datos de pantalla2.
}

y debería funcionar sin problemas, ya que cada función termina totalmente antes de llamar a otra. El código de control que he puesto en loop, podría ir en otra función, pero lo importante es que se "cierra" (borra de memoria) completamente la función pantalla1 o pantalla2 antes de volver a ser llamadas y crearse una "nueva copia" de las mismas.

noter: Hola. Creo que tienes un problema en tu código con la memoria. Estás llamando recursivamente a una función desde la otra, y viceversa. Ten en cuenta que cuando la llamas, no se vacían de memoria las variables de la función desde la que estás llamando, pues no ha terminado (aunque lo hagas en la última instrucción de la misma). Al contrario, se crean en la pila variables nuevas para la función llamada. Así, lo que ocurre es que cada vez vas ocupando más memoria, hasta que la llenas y viene el crash. No es lo más normal que en un programa de arduino, una vez que llames una función, la ejecución ya no regrese nunca al bucle loop. Prueba, por ejemplo:

void pantalla1(){
// Aquí exclusivamente el código de dibujo de pantalla 1
}
void pantalla2(){
// Aquí exclusivamente el código de dibujo de pantalla 2
}

loop(){ //Aquí puedes poner tu juego de loops y delays para llamar alternativamente a pantalla1 o pantalla2 pantalla1(); //cuando el código regresa aquí, se ha vaciado la memoria de los datos de pantalla1. delay(1000); pantalla2(); //cuando el código regresa aquí, se ha vaciado la memoria de los datos de pantalla2. }



y debería funcionar sin problemas, ya que cada función termina totalmente antes de llamar a otra.
El código de control que he puesto en loop, podría ir en otra función, pero lo importante es que se "cierra" (borra de memoria) completamente la función pantalla1 o pantalla2 antes de volver a ser llamadas y crearse una "nueva copia" de las mismas.

Gracias, lo habia hecho asi por un motivo, pero me has dado una idea para ponerlo mejor y ya me funciona de 10, muchas gracias!