Mantener un ciclo while al presionar un botón... [SOLUCIONADO]

Buenas.

Tengo un problema al momento de intentar crear mi ciclo while, consiste en activar el ciclo al presionar el botón y en poder apagarlo con el mismo botón. No me marca errores pero no puedo mantener el ciclo constante. Gracias

int estadoBoton = 0;
int residuo = 0;
int residuo3 = 0;

void setup()
{
  pinMode(2, INPUT);
  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(7, OUTPUT);
  
  Serial.begin(9600);
}

void loop()
{
  
  estadoBoton = digitalRead(2);
  while(estadoBoton == HIGH){
    digitalWrite(7, HIGH);
    delay(500);
    digitalWrite(7, LOW);
    delay(250);
      
    digitalWrite(5, HIGH);
    delay(500);
    digitalWrite(5, LOW);
    delay(250);
      
    digitalWrite(3, HIGH);
    delay(500);
    digitalWrite(3, LOW);
    delay(250);
   
    if(estadoBoton == HIGH){
      break;
    }
  }
  delay(500);
}

Veamos lo que hace tu código...

Comienza el loop, lee el puerto del botón y tenemos 2 posibilidades:

1- Está sin pulsar: Lee LOW, lo guarda en la variable, no se cumple el while porque la variable de control es LOW así que sigue de largo, está 5 segundos (5000 ms) sin hacer absolutamente nada y vuelve a empezar.

2- Está pulsado: Lee HIGH y lo almacena en la variable, entra en el while, está 2500 ms jugando con los led, vuelve a leer el estado del botón y lo guarda en la misma variable que controla el while. Otra vez hay 2 posibilidades:

A- Está pulsado: La variable es HIGH, se cumple el if, sale del ciclo, va a estar 5 seg sin hacer nada y vuelve a empezar.

B- Está sin pulsar: La variable es LOW entonces el if es falso y no se ejecuta, vuelve al while y como la variable es LOW entonces sale, va a estar 5 seg sin hacer nada y vuelve a empezar.

O sea, cuando ya está dentro del while si el botón no se pulsa antes de que se apague el led en pin 3 no entra al if porque la variable pasa a LOW y en esa condición de todos modos sale cuando "rompe" el while justamente porque el valor de la variable es LOW.

Entonces usa una variable distinta para la 2da pulsación para que no cambie el valor de la que controla el while y así haga lo que quieres, o sea salir del ciclo cuando pulsas el botón y no antes. Por ej.

   estado2Boton = digitalRead(2);
   if(estado2Boton == HIGH){
     break;
   }

Ten en cuenta los delay y pulsa el boton durante unos segundos sino no lo va a detectar.

Saludos

PD: Me olvidé... ¿Ves cómo he puesto el segmento de código? Así deberías haber incluido el tuyo, por favor edita tu post y pon el código como corresponde (Normas del Foro, punto 7)

Hola hola, Ya me dijo Mariano, gracias y no te había agradecido por si llegaba a tener otra duda agradecerte completo. Gracias en serio

P.D: No se si se te habrá dicho Mariano pero no se si nos puedas ayudar con el código sin arrays, sin mas que decir. Gracias (otra vez) :smiley:

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