Ciclo while como romperlo

buenas tardes , soy LUISFER, deseo crear este hilo para salir de la duda en cuanto a romper el ciclo o bucle WHILE, preciso cargar una variable con un valor( podría ser temperatura), y al pulsar el botón de inicio, (utilizo un pulsador como interruptor) , entra en el ciclo White, para calentar, pero al pulsar nuevamente el botón debería parar el calentamiento (salir del ciclo) y no lo logro, al entrar al ciclo no ve el estado del boton, ni con break, continue, ni nada sale del bucle.
si alguien le ha pasado y ha solucionado por fa comenten su experiencia y nutran el foro,

while(tu_condicion && (lectura_boton == estado_no_pulsado) {

o

while(tu_condicion){
  // lo que haga
  if(lectura_boton == estado_pulsado) {
    break;
  }
}

lectura_boton remplazalo por el método que uses para leer el boton sea una función o directamente la lectura del pin.
estado_pulsado y estado_no_pulsado remplazalo por LOW o HIGH según corresponda.

Saludos

const byte BOTON = 2;     //al pin 2 lo llamo BOTON
const byte LED = 13;      //al pín 13 lo llamo LED
const byte LED1 = 12;     //al pin 12 lo llamo LED1
boolean ESTADO = LOW;     //creo variable interna ESTADO

void setup() 
{
  pinMode(BOTON,INPUT);   //configuro BOTON como entrada
  pinMode(LED,OUTPUT);    //configuro LED como salida
  pinMode(LED1,OUTPUT);   //configuro LED1 como salida
  
}

void loop() 
{
 while(digitalRead(BOTON) == LOW)       //creo un bucle con el BOTON sin pulsar
 {      
 }                                      //si BOTON no pulsado no se hace nada      
 ESTADO = !ESTADO ;                     //igualo la variable ESTADO con su inverso
 digitalWrite(LED,ESTADO);              //cargo LED con el valor de la variable ESTADO
 while(digitalRead(BOTON) == HIGH)      //creo bucle while para eliminar rebotes en BOTON
 {
 }                                      //mientras el BOTON este en alto, no se hace nada

  while (LED == HIGH)                   //creo bucle while que mientras LED sea alto
  {
    digitalWrite(LED2,HIGH);
    delay(200);                         // se ejecuta este blink
    digitalWrite(LED2,LOW);             // y si LED estuviera bajo pararía el blink
    delay(200);
    
  }
}

Muchas gracias.

Curiosa forma de "BLINK", en fin ..... Mira bientu codigo has cometido unos errores al llamar a variables y no has seguido el consejo de @anon90500195 de leer el boton dentro del while del que quieres salir.
Vamos a ver si es esto lo que quieres hacer:

const byte BOTON = 2; //al pin 2 lo llamo BOTON
const byte LED = 13; //al pín 13 lo llamo LED
const byte LED1 = 12; //al pin 12 lo llamo LED1
boolean ESTADO = LOW; //creo variable interna ESTADO

void setup() {
  pinMode(BOTON, INPUT); //configuro BOTON como entrada
  pinMode(LED, OUTPUT); //configuro LED como salida
  pinMode(LED1, OUTPUT); //configuro LED1 como salida
}

void loop() {
  while (digitalRead(BOTON) == LOW) { //creo un bucle con el BOTON sin pulsar
  } //si BOTON no pulsado no se hace nada

  while (digitalRead(BOTON) == HIGH) { //creo bucle while para eliminar rebotes en BOTON
  } //mientras el BOTON este en alto, no se hace nada
  // IMPORTANTE: el antirrebote ha de ir antes de la accion a realizar, por eso el cambio de sitio
  ESTADO = !ESTADO ; //igualo la variable ESTADO con su inverso
  digitalWrite(LED, ESTADO); //cargo LED con elvalor de la variable ESTADO

  while (ESTADO == HIGH) { //creo bucle while que mientras LED sea alto
    if (digitalRead(BOTON) == HIGH) { // Lectura del boton para salir
      ESTADO = !ESTADO ;
      break;
    }
    digitalWrite(LED1, HIGH);
    delay(200); // se ejecuta este blink
    digitalWrite(LED1, LOW); // y si LED estubiera bajo pararia el blink
    delay(200);
  }
}

Saludos.

En principio el código está mal presentado, por favor lee las Normas del foro para hacerlo correctamente.

No veo que hayas implementado en tu código nada parecido lo que te sugerí así que no voy a debatir si funciona o no. Tu sabrás.

Saludos

Moderador:
Por favor, lee las Normas del foro y edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>


buenas noches foro, gatul, gonpezzi y surbyte, tenias razón gonpezzi, la opción que me sugirió si funciona, y es prácticamente la tuya, ayer por descuido segui mal lo enviado por gatul, por eso no funciono, honor a quien honor merece, gatul tu recomendacion funciona bien, igual que la tuya gonpezzi, muchas gracias por sus aportes.
Surbyte, saludos gracias por la instrucción de como enviar al foro el código en cuestión, ese error será subsanado en lo sucesivo.

Les comento que mi proyecto es hacerle un control de temperatura a un horno a gas de mi casa, para ello he comprado, un arduino nano, un modulo de dos reles, un modulo sensor de llama, un modulo max6675 con termocupla j, un lcd 16x2 con modulo I2C, un buzer y un encoder giratorio.
Sin mucho detalle, escojo la temperatura girando el encoder, luego pulso su pulsador incorporado, en el lcd se muestra la temperatura escogida y comienza el proceso de calentar, primero se acciona la electro válvula de gas, en seguida se activa el piloto de alta tención se espera 2 segundos y si el sensor de llama ve la llama se apaga el piloto y sigue calentando, el programa tiene una histéresis de +/- 3 grados, por decir se escoge 220 grados el horno calienta hasta 223 grados y apaga el quemador al llegar la temperatura a 217 grados comienza el ciclo de calentar otra vez.

/* amigo gracias por su sugerencia, apreciada, pero no me funcionó, sigo 
 *  sin poder salir del bucle while para el blink, estoy utilizando un solo
 *  pulsador (BOTON) como interruptor, la idea y proposito es que al pulsar 
 *  el BOTON encendiera el lLED y comenzara a parpadear el LED1, al volver 
 *  a presionar el BOTON sesara todo, pero este es la dificultad una vez en 
 *  el ciclo while no logro salir de el.
 */
const byte BOTON = 2;     //al pin 2 lo llamo BOTON
const byte LED = 13;      //al pín 13 lo llamo LED
const byte LED1 = 12;     //al pin 12 lo llamo LED1
boolean ESTADO = LOW;     //creo variable interna ESTADO

void setup() 
{
  pinMode(BOTON,INPUT);   //configuro BOTON como entrada
  pinMode(LED,OUTPUT);    //configuro LED como salida
  pinMode(LED1,OUTPUT);   //configuro LED1 como salida
  
}

void loop() 
{
 while(digitalRead(BOTON) == LOW)       //creo un bucle con el BOTON sin pulsar
 {      
 }                                      //si BOTON no pulsado no se hace nada      
 ESTADO = !ESTADO ;                     //igualo la variable ESTADO con su inverso
 digitalWrite(LED,ESTADO);              //cargo LED con elvalor de la variable ESTADO
 while(digitalRead(BOTON) == HIGH)      //creo bucle while para eliminar rebotes en BOTON
 {
 }                                      //mientras el BOTON este en alto, no se hace nada

  while (LED == HIGH)                   //creo bucle while que mientras LED sea alto
  {
    digitalWrite(LED2,HIGH);
    delay(200);                         // se ejecuta este blink
    digitalWrite(LED2,LOW);             // y si LED estubiera bajo pararia el blink
    delay(200);
    
  }
} 

Buenas noches compañeros del foro, soy nuevo en esto de foros, acabo de volver a subir el código de un proyecto que estoy diseñando, esta vez con los parámetros requeridos, en lo sucesivo les estaré colgando los avances de mi proyecto, gracias.

Pero de ese código que presentas a lo que quieres lograr hay un paso enorme!

Ahora vamos por partes
Imagino que

  while (LED == HIGH)                   //creo bucle while que mientras LED sea alto

tiene un error de tipeo y debería ser

  while (digitalRead(LED) == HIGH)                   

De otro modo significaría
Mientras 13 = 1...
ya que la variable LED contiene 13 y HIGH se define con valor 0x01 (o sea 1).
En definitiva, tal como está nunca se ejecutaría el while() porque no se cumple la igualdad ya que 13 es claramente distinto a 1.

Ahora bien, si fuese el segundo caso (el corregido), cuando pulsas el botón pones ESTADO en true y LED en HIGH siguiendo el valor de ESTADO.
Luego liberas el botón y al salir del segundo while() entra a éste y ya no sale más porque el estado del pin LED (13) no va a cambiar dentro del lazo, solo cambia LED2.

Y por cierto, LED2 no está definido así que ese código, tal como está, no compila.

Saludos

Y sobre todo si no sigue las recomendaciones que le hemos hecho. ¡Es en mismo codigo del principio!. ¡No ha cabiado nada!.
Totalmente de acuerdo con lo que le explicas, (a ver si te hace caso), Pero recuerda que la variable ESTADO ya contiene el vaalor del pin, ¿para que leerlo?. Para mi debería declarar:

while (ESTADO == HIGH) {

y claro esta que confude definiciones debe cambiar LED2 por LED1
saludos

Buenas noches Gatul, de ante mano gracias por tus comentarios , si en la definiciones de variable no existe LED2, fue error de tipeo y ahí va es LED1, lo que mencionas de una vez estando en el ciclo white de blink el no ve el estado de pulsador ni el estado del LED, solo hace el ciclo. Con respecto al código que colgué hace poco, si es el mismo código del principio, solo que por sugerencia de Surbyte, cuando me menciona que debo corregir de inmediato como subí el código que reenvié como debería . saludos Gonpezzi, estoy probando ambas sugerencias de uds, y la tuya ciertamente parece funcionar, pero al volver a pulsar y debería apagar tanto el LED como en LED1, solo mientras mantengo pulsado el botón el LED1 se apaga , no sale del bucle y continua encendido el LED y parpadeando el LED1. A continuación subo el código modificado como lo sugiere Gonpezz.

onst byte BOTON = 2; //al pin 2 lo llamo BOTON
const byte LED = 13; //al pín 13 lo llamo LED
const byte LED1 = 12; //al pin 12 lo llamo LED1
boolean ESTADO = LOW; //creo variable interna ESTADO

void setup() {
  pinMode(BOTON, INPUT); //configuro BOTON como entrada
  pinMode(LED, OUTPUT); //configuro LED como salida
  pinMode(LED1, OUTPUT); //configuro LED1 como salida
}

void loop() {
  while (digitalRead(BOTON) == LOW) 
  { //creo un bucle con el BOTON sin pulsar
  } //si BOTON no pulsado no se hace nada

  while (digitalRead(BOTON) == HIGH) { //creo bucle while para eliminar rebotes en BOTON
  } //mientras el BOTON este en alto, no se hace nada
  // IMPORTANTE: el antirrebote ha de ir antes de la accion a realizar, por eso el cambio de sitio
  ESTADO = !ESTADO ; //igualo la variable ESTADO con su inverso
  digitalWrite(LED, ESTADO); //cargo LED con elvalor de la variable ESTADO

  while (ESTADO == HIGH) { //creo bucle while que mientras LED sea alto
    if (digitalRead(BOTON) == HIGH) { // Lectura del boton para salir
      ESTADO = !ESTADO ;
      break;
    }
    digitalWrite(LED1, HIGH);
    delay(200); // se ejecuta este blink
    digitalWrite(LED1, LOW); // y si LED estubiera bajo pararia el blink
    delay(200);
  }

Coincido totalmente pero igual se va a quedar bloqueado esperando que ESTADO cambie su valor.

Saludos

Estoy suponiendo que hara caso y dentro de ese while pondra el if de salida. algo parecido a lo que le propuse en el post #4.

if (digitalRead(BOTON) == HIGH) { // Lectura del boton para salir
      ESTADO = !ESTADO ;
      break;
    }

He estado haciendo pruebas con sus sugerencia que son buenas opciones, pero aun sigo si salir del ciclo, pero debo acotar que al principio, había hecho la misma tarea pero utilizando la sentencia IF en vez de la sentencia WHILE, pero la cambie a esta ultima por haberla visto en otra pagina de internet , a partir de ahí no he podido salir de while. Por otro lado, he estado investigando la maquina de estados en arduino , y para mis varias tareas me parece viable.

No solo viable, te diría que es la forma correcta de hacerlo.

Saludos

Buenas noches, saludos foro, Gatul, Gonpezzi y Surbyte, mis deseos de un año nuevo prospero .
Dificultades en mi trabajo me ocupo en demasía y no pude volver a escribir, pero les comento que tengo avances en mi proyecto, los cuales les hare llegar, por este medio, he estado implementando una maquina de estados finitos, para mi proyecto, estoy ensamblado el codigo y pronto se los muestro.

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