Como salir de un ciclo con un caracter?

Buenas, sere breve en mi explicacion: Quiero salir de un ciclo (en realidad no importa si es for, while o if) presionando un caracter de un teclado matricial pero no puedo y no se porque sea, ya intente con todos los ciclos y ninguno funciona y si, busque en Google como solucionar este problema pero ninguna respuesta me funciono. Este es el que tengo en este momento:

while (1) //500ms 
      { 
        if (lts ==10)
        {digitalWrite(13, LOW);
        digitalWrite(10, LOW);
        delay(500);
        digitalWrite(10, HIGH);
        delay(28500);
        tecla = teclado.getKey();
      }
      if (tecla == '*')
        {
          break;
        }}

El codigo debe tener varias opciones para la variable lts (de 10-100 con aumentos de 10 en 10) y por el momento solo tengo la opcion de lts = 10 una vez que pueda salir de este ciclo pondre las demas opciones. De igual manera ya adjunte el codigo completo por si necesitan mas informacion. De antemano agradezco la ayuda :smiley:

CodigoBueno2.ino (3.04 KB)

hola Pabloneitor buen dia, al ver la parte del código que pusiste veo rapidamente veo algunos errores, principalmente:
1.- No usas la sintaxis corecta en el While... lo que tu estas escribiendo en tu "while" podriamos traducirlo como: "mientras 1"... ¿mientras uno que?. Tienes que hacer una comparacion: "mientras la variable X sea igual a 1". Esto quiere decir que mientras el valor de x sea uno, todo lo que este dentro de las llaves del while se repetira continuamente hasta que el valor de x sea distinto a 1
hecha un vistaso a esto

2.- Diariamente en el foro se repite lo mismo: Evitar el uso de "delay" tienes un delay de 28.5 segundos con los cuales ningun boton, sensor, teclado etc. funcionara hasta que pase ese tiempo. Tendras que quitarlos definitivamente .

RIG:
hola Pabloneitor buen dia, al ver la parte del código que pusiste veo rapidamente veo algunos errores, principalmente:
1.- No usas la sintaxis corecta en el While... lo que tu estas escribiendo en tu "while" podriamos traducirlo como: "mientras 1"... ¿mientras uno que?. Tienes que hacer una comparacion: "mientras la variable X sea igual a 1". Esto quiere decir que mientras el valor de x sea uno, todo lo que este dentro de las llaves del while se repetira continuamente hasta que el valor de x sea distinto a 1
hecha un vistaso a esto

2.- Diariamente en el foro se repite lo mismo: Evitar el uso de "delay" tienes un delay de 28.5 segundos con los cuales ningun boton, sensor, teclado etc. funcionara hasta que pase ese tiempo. Tendras que quitarlos definitivamente .

Hola RIG! primero que nada gracias por tomarte el tiempo de responder mi post :smiley: el while no es el problema porque si se repite y de hecho si le quito los delays funciona como deberia pero el problema es que necesito los delays ya que es para el control de una bomba.

No entiendo lo que quieres lograr. Que representa lts ?

Tu problema son los delay() porque detienen todo el proceso. Tienes que lograr que continuamente se vigile el teclado en el loop algo asi:

unsigned long t1,t2,...tn;
bool led1,led2;
void loop(){
   tecla = teclado.getKey();
   switch (tecla){
   case '1':
         led1 = true;
         break;
   case '2':
         led1 = true;
         break;
   case '*':
         t1 = 0;
         t2 = 0;
   }
   //Prende leds
   if (led1){
      digitalWrite(10, HIGH);
      t1 = millis();
      led1 = false;
   }
   if (led2){
      digitalWrite(11, HIGH);
      t2 = millis();
      led2 = false;
   }
   //Apaga leds luego de un tiempo
   if (millis()-t1 > 100000){
      digitalWrite(10, LOW);
   }
   if (millis()-t2 > 300000){
      digitalWrite(11, LOW);
   }
}

Hola Kike_GL, gracias por contestar el post :smiley: el codigo es para el control de una bomba hidraulica, lts representa la cantidad de litros que inyecta al dia variando de 10 en 10 hasta 100. En el caso de lts=10 cada minuto debe haber 2 ciclos y por eso debe encenderse 500ms y por eso los delays (500ms de tiempo encendido, 28500ms de tiempo apagado y 1000ms extra para saber cuando esta cerca de completarse el ciclo aunque eso no lo puse en el post)

Moderador: No repitas lo que se lee en el post anterior.

Ve a Documentación => Indice de temas tutoriales => millis() y Maquina de estados.

La solución son ambas items. millis() te permitirá controlar tiempos.
La Maquina de estado hacer que el código fluya de un estado a otro pero sin el uso de delay() y por ende sin demoras en atender teclado.

Hola Surbyte, gracias! ya resolvi el problema, desde ahora tratare de no usar delays.