Hola, soy nuevo por aquí, a ver si me podéis ayudar, quiero detener el loop. Es una secuencia de leds, llegado al final de la secuencia he puesto un While para esperar que pulsando un pulsador PULSADORW este While se ejecute llegándole al pin PULSADORW 3,3 V y el loop vuelva a empezar por la primera linea del loop. El programa ignora el While como si no existiera y vuelve a empezar el programa. Gracias de antemano.
Moderador:
Por favor, lee las Normas del foro y publica/edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado/editado, lo cortas y click en (<CODE/>)
No uses capturas.
Publica tu código para ver dónde hay que modificarlo…
Sin ver el código no podemos saber por qué ocurre eso, podemos suponer que está mal el código o que tienes mal conectado el pulsador pero sin verlo...
Sube el código y un esquema de como tienes conectado el pulsador (puedes hacerlo a mano y subir una foto)
Ahí va el código, se ha comprobado que el pin 10 no tiene tensión y al pulsar el pulsador le llegan 3,3v. Como comento la idea seria que se parara el programa al llegar al while y al cumplirse la condición PULSADORW == HIGH y ser esta la ultima línea el programa volviera a empezar hasta volver a llegar al while. Gracias:
int LED1 = 3;
int LED2 = 4;
int LED3 = 5;
int LED4 = 6;
int LED5 = 7;
int SONIDO = 8;
int REPLAY = 9;
int PULSADORW = 10; //entrada high al pulsar pulsador
int LINEOUT = 16; //salida 3,3v a pulsador
void setup() {
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, INPUT);
pinMode(16, OUTPUT);
}
void loop() {
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LINEOUT, HIGH);
digitalWrite(SONIDO, HIGH); // primera vuelta velx1
delay(1000);
digitalWrite(SONIDO, LOW);
digitalWrite(LED1, HIGH);
delay(3000);
digitalWrite(LED2, HIGH);
delay(300);
digitalWrite(LED3, HIGH);
digitalWrite(LED1, LOW);
delay(300);
digitalWrite(LED4, HIGH);
digitalWrite(LED2, LOW);
delay(300);
digitalWrite(LED5, HIGH);
digitalWrite(LED3, LOW);
delay(300);
digitalWrite(LED4, LOW);
delay(2700);
digitalWrite(LED5, LOW);
digitalWrite(LED1, HIGH); //segunda vuela velx2 replay
delay(500);
digitalWrite(REPLAY, HIGH);
delay(500);
digitalWrite(REPLAY, LOW);
delay(500);
digitalWrite(REPLAY, HIGH);
digitalWrite(LED2, HIGH);
delay(500);
digitalWrite(REPLAY, LOW);
delay(100);
digitalWrite(LED1, LOW);
digitalWrite(LED3, HIGH);
delay(400);
digitalWrite(REPLAY, HIGH);
delay(200);
digitalWrite(LED4, HIGH);
digitalWrite(LED2, LOW);
delay(300);
digitalWrite(REPLAY, LOW);
delay(300);
digitalWrite(LED5, HIGH);
digitalWrite(LED3, LOW);
delay(200);
digitalWrite(REPLAY, HIGH);
delay(400);
digitalWrite(LED4, LOW);
delay(100);
digitalWrite(REPLAY, LOW);
delay(500);
digitalWrite(REPLAY, HIGH);
delay(300);
digitalWrite(LED5, LOW);
delay(200);
digitalWrite(REPLAY, LOW);
digitalWrite(LED1, HIGH); //tercera vuela velx4 replay
delay(500);
digitalWrite(REPLAY, HIGH);
delay(500);
digitalWrite(REPLAY, LOW);
delay(500);
digitalWrite(REPLAY, HIGH);
digitalWrite(LED2, HIGH);
delay(500);
digitalWrite(REPLAY, LOW);
delay(500);
digitalWrite(REPLAY, HIGH);
delay(200);
digitalWrite(LED1, LOW);
digitalWrite(LED3, HIGH);
delay(300);
digitalWrite(REPLAY, LOW);
delay(500);
digitalWrite(REPLAY, HIGH);
delay(400);
digitalWrite(LED4, HIGH);
digitalWrite(LED2, LOW);
delay(100);
digitalWrite(REPLAY, LOW);
delay(500);
digitalWrite(REPLAY, HIGH);
delay(500);
digitalWrite(REPLAY, LOW);
delay(100);
digitalWrite(LED5, HIGH);
digitalWrite(LED3, LOW);
delay(400);
digitalWrite(REPLAY, HIGH);
delay(500);
digitalWrite(REPLAY, LOW);
delay(300);
digitalWrite(LED4, LOW);
delay(200);
digitalWrite(REPLAY, HIGH);
delay(500);
digitalWrite(REPLAY, LOW);
delay(500);
digitalWrite(LED5, LOW);
digitalWrite(REPLAY, HIGH);
delay(500);
digitalWrite(REPLAY, LOW);
digitalWrite(LED1, HIGH); //cuarta vuela velx16 replay
delay(500);
digitalWrite(REPLAY, HIGH);
delay(500);
digitalWrite(REPLAY, LOW);
delay(500);
digitalWrite(REPLAY, HIGH);
digitalWrite(LED2, HIGH);
delay(500);
digitalWrite(REPLAY, LOW);
delay(500);
digitalWrite(REPLAY, HIGH);
delay(500);
digitalWrite(REPLAY, LOW);
delay(500);
digitalWrite(REPLAY, HIGH);
delay(400);
digitalWrite(LED1, LOW);
digitalWrite(LED3, HIGH);
delay(100);
digitalWrite(REPLAY, LOW);
delay(500);
digitalWrite(REPLAY, HIGH);
delay(500);
digitalWrite(REPLAY, LOW);
delay(500);
digitalWrite(REPLAY, HIGH);
delay(300);
digitalWrite(LED4, HIGH);
digitalWrite(LED2, LOW);
delay(200);
digitalWrite(REPLAY, LOW);
delay(500);
digitalWrite(REPLAY, HIGH);
delay(500);
digitalWrite(REPLAY, LOW);
delay(500);
digitalWrite(REPLAY, HIGH);
delay(500);
digitalWrite(REPLAY, LOW);
delay(200);
digitalWrite(LED5, HIGH);
digitalWrite(LED3, LOW);
delay(300);
digitalWrite(REPLAY, HIGH);
delay(500);
digitalWrite(REPLAY, LOW);
delay(500);
digitalWrite(REPLAY, HIGH);
delay(500);
digitalWrite(REPLAY, LOW);
delay(100);
digitalWrite(LED4, LOW);
delay(400);
digitalWrite(REPLAY, HIGH);
delay(500);
digitalWrite(REPLAY, LOW);
delay(500);
digitalWrite(REPLAY, HIGH);
delay(500);
digitalWrite(REPLAY, LOW);
delay(500);
digitalWrite(LED5, LOW);
delay(500);
digitalWrite(REPLAY, LOW);
digitalWrite(LED1, HIGH); //fin1
delay(3000);
digitalWrite(LED2, HIGH);
delay(300);
digitalWrite(LED3, HIGH);
digitalWrite(LED1, LOW);
delay(300);
digitalWrite(LED4, HIGH);
digitalWrite(LED2, LOW);
delay(300);
digitalWrite(LED5, HIGH);
digitalWrite(LED3, LOW);
delay(300);
digitalWrite(LED4, LOW);
delay(2700);
digitalWrite(LED5, LOW);
digitalWrite(LED1, HIGH); //fin2
delay(3000);
digitalWrite(LED2, HIGH);
delay(300);
digitalWrite(LED3, HIGH);
digitalWrite(LED1, LOW);
delay(300);
digitalWrite(LED4, HIGH);
digitalWrite(LED2, LOW);
delay(300);
digitalWrite(LED5, HIGH);
digitalWrite(LED3, LOW);
delay(300);
digitalWrite(LED4, LOW);
delay(2700);
digitalWrite(LED5, LOW);
digitalWrite(LED1, HIGH); //fin3
delay(3000);
digitalWrite(LED2, HIGH);
delay(300);
digitalWrite(LED3, HIGH);
digitalWrite(LED1, LOW);
delay(300);
digitalWrite(LED4, HIGH);
digitalWrite(LED2, LOW);
delay(300);
digitalWrite(LED5, HIGH);
digitalWrite(LED3, LOW);
delay(300);
digitalWrite(LED4, LOW);
delay(2700);
digitalWrite(LED5, LOW);
digitalWrite(LED1, HIGH); //todo on
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, HIGH);
digitalWrite(LED5, HIGH);
delay(2700);
while(digitalRead(PULSADORW) == HIGH){
}
}
Si quieres que el while() se ejecute hasta que pulses el botón, el código debería ser
while (digitalRead(PULSADORW) == LOW) {
}
porque quieres que se detenga en el lazo mientras la entrada está en LOW y que al pasar a HIGH, salga.
Primero lo probé con PULSADOR == LOW como comentas y pasaba lo mismo, lo he vuelto a probar e igual, cambiaré a otro pin a ver si este estuviera dañado. Por que no entiendo que pasa.

Cuando paso el código a la placa indica cosas en rojo que no se lo que quiere decir, pero todo el código va bien menos e while.
Ya te dije
sino no podemos saber si el error está en el conexionado en lugar de en el código.
Otra cosa que recién noto, ¿Cuál es el sentido de tomar los 3.3V del pulsador de un pin digital?
Tienes 48400 mseg hasta llegar al while, supongo que eso lo sabes no?
he modificado tu código y funciona bien así que no se que problema tienes.
Yo no comparto eluso de delay() asi que esta modificado con una máquina de estado pero tienes tantos pasos que te los dejo a ti para que los hagas o completes.
int LED1 = 3;
int LED2 = 4;
int LED3 = 5;
int LED4 = 6;
int LED5 = 7;
int SONIDO = 8;
int REPLAY = 9;
int PULSADORW = 10; //entrada high al pulsar pulsador
int LINEOUT = 16; //salida 3,3v a pulsador
enum Estado {
INICIO,
PRIMERA_VUELTA_VEL1,
PRIMERA_VUELTA_VEL2,
PRIMERA_VUELTA_VEL3,
PRIMERA_VUELTA_VEL4,
PRIMERA_VUELTA_VEL5,
PRIMERA_VUELTA_VEL6,
PRIMERA_VUELTA_VEL7,
PRIMERA_VUELTA_VEL8,
PRIMERA_VUELTA_VEL9,
PRIMERA_VUELTA_VEL10,
ENCENDER_LED1_V1,
// ... otros estados para la primera vuelta ...
SEGUNDA_VUELTA_VEL1,
// ... estados para las demás vueltas ...
FIN
};
unsigned long tiempoAnterior = 0;
Estado estadoActual = INICIO;
void setup() {
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, INPUT);
pinMode(16, OUTPUT);
Serial.begin(9600);
Serial.println("Iniciando programa.");
}
void loop() {
// digitalWrite(LED1, LOW);
// digitalWrite(LED2, LOW);
// digitalWrite(LED3, LOW);
// digitalWrite(LED4, LOW);
// digitalWrite(LED5, LOW);
// digitalWrite(LINEOUT, HIGH);
// digitalWrite(SONIDO, HIGH); // primera vuelta velx1
// delay(1000);
// digitalWrite(SONIDO, LOW);
// digitalWrite(LED1, HIGH);
// delay(3000);
// digitalWrite(LED2, HIGH);
// delay(300);
// digitalWrite(LED3, HIGH);
// digitalWrite(LED1, LOW);
// delay(300);
// digitalWrite(LED4, HIGH);
// digitalWrite(LED2, LOW);
// delay(300);
// digitalWrite(LED5, HIGH);
// digitalWrite(LED3, LOW);
// delay(300);
// digitalWrite(LED4, LOW);
// delay(2700);
// digitalWrite(LED5, LOW);
// digitalWrite(LED1, HIGH); //segunda vuela velx2 replay
// delay(500);
// digitalWrite(REPLAY, HIGH);
// delay(500);
// digitalWrite(REPLAY, LOW);
// delay(500);
// digitalWrite(REPLAY, HIGH);
// digitalWrite(LED2, HIGH);
// delay(500);
// digitalWrite(REPLAY, LOW);
// delay(100);
// digitalWrite(LED1, LOW);
// digitalWrite(LED3, HIGH);
// delay(400);
// digitalWrite(REPLAY, HIGH);
// delay(200);
// digitalWrite(LED4, HIGH);
// digitalWrite(LED2, LOW);
// delay(300);
// digitalWrite(REPLAY, LOW);
// delay(300);
// digitalWrite(LED5, HIGH);
// digitalWrite(LED3, LOW);
// delay(200);
// digitalWrite(REPLAY, HIGH);
// delay(400);
// digitalWrite(LED4, LOW);
// delay(100);
// digitalWrite(REPLAY, LOW);
// delay(500);
// digitalWrite(REPLAY, HIGH);
// delay(300);
// digitalWrite(LED5, LOW);
// delay(200);
// digitalWrite(REPLAY, LOW);
// digitalWrite(LED1, HIGH); //tercera vuela velx4 replay
// delay(500);
// digitalWrite(REPLAY, HIGH);
// delay(500);
// digitalWrite(REPLAY, LOW);
// delay(500);
// digitalWrite(REPLAY, HIGH);
// digitalWrite(LED2, HIGH);
// delay(500);
// digitalWrite(REPLAY, LOW);
// delay(500);
// digitalWrite(REPLAY, HIGH);
// delay(200);
// digitalWrite(LED1, LOW);
// digitalWrite(LED3, HIGH);
// delay(300);
// digitalWrite(REPLAY, LOW);
// delay(500);
// digitalWrite(REPLAY, HIGH);
// delay(400);
// digitalWrite(LED4, HIGH);
// digitalWrite(LED2, LOW);
// delay(100);
// digitalWrite(REPLAY, LOW);
// delay(500);
// digitalWrite(REPLAY, HIGH);
// delay(500);
// digitalWrite(REPLAY, LOW);
// delay(100);
// digitalWrite(LED5, HIGH);
// digitalWrite(LED3, LOW);
// delay(400);
// digitalWrite(REPLAY, HIGH);
// delay(500);
// digitalWrite(REPLAY, LOW);
// delay(300);
// digitalWrite(LED4, LOW);
// delay(200);
// digitalWrite(REPLAY, HIGH);
// delay(500);
// digitalWrite(REPLAY, LOW);
// delay(500);
// digitalWrite(LED5, LOW);
// digitalWrite(REPLAY, HIGH);
// delay(500);
// digitalWrite(REPLAY, LOW);
// digitalWrite(LED1, HIGH); //cuarta vuela velx16 replay
// delay(500);
// digitalWrite(REPLAY, HIGH);
// delay(500);
// digitalWrite(REPLAY, LOW);
// delay(500);
// digitalWrite(REPLAY, HIGH);
// digitalWrite(LED2, HIGH);
// delay(500);
// digitalWrite(REPLAY, LOW);
// delay(500);
// digitalWrite(REPLAY, HIGH);
// delay(500);
// digitalWrite(REPLAY, LOW);
// delay(500);
// digitalWrite(REPLAY, HIGH);
// delay(400);
// digitalWrite(LED1, LOW);
// digitalWrite(LED3, HIGH);
// delay(100);
// digitalWrite(REPLAY, LOW);
// delay(500);
// digitalWrite(REPLAY, HIGH);
// delay(500);
// digitalWrite(REPLAY, LOW);
// delay(500);
// digitalWrite(REPLAY, HIGH);
// delay(300);
// digitalWrite(LED4, HIGH);
// digitalWrite(LED2, LOW);
// delay(200);
// digitalWrite(REPLAY, LOW);
// delay(500);
// digitalWrite(REPLAY, HIGH);
// delay(500);
// digitalWrite(REPLAY, LOW);
// delay(500);
// digitalWrite(REPLAY, HIGH);
// delay(500);
// digitalWrite(REPLAY, LOW);
// delay(200);
// digitalWrite(LED5, HIGH);
// digitalWrite(LED3, LOW);
// delay(300);
// digitalWrite(REPLAY, HIGH);
// delay(500);
// digitalWrite(REPLAY, LOW);
// delay(500);
// digitalWrite(REPLAY, HIGH);
// delay(500);
// digitalWrite(REPLAY, LOW);
// delay(100);
// digitalWrite(LED4, LOW);
// delay(400);
// digitalWrite(REPLAY, HIGH);
// delay(500);
// digitalWrite(REPLAY, LOW);
// delay(500);
// digitalWrite(REPLAY, HIGH);
// delay(500);
// digitalWrite(REPLAY, LOW);
// delay(500);
// digitalWrite(LED5, LOW);
// delay(500);
// digitalWrite(REPLAY, LOW);
// digitalWrite(LED1, HIGH); //fin1
// delay(3000);
// digitalWrite(LED2, HIGH);
// delay(300);
// digitalWrite(LED3, HIGH);
// digitalWrite(LED1, LOW);
// delay(300);
// digitalWrite(LED4, HIGH);
// digitalWrite(LED2, LOW);
// delay(300);
// digitalWrite(LED5, HIGH);
// digitalWrite(LED3, LOW);
// delay(300);
// digitalWrite(LED4, LOW);
// delay(2700);
// digitalWrite(LED5, LOW);
// digitalWrite(LED1, HIGH); //fin2
// delay(3000);
// digitalWrite(LED2, HIGH);
// delay(300);
// digitalWrite(LED3, HIGH);
// digitalWrite(LED1, LOW);
// delay(300);
// digitalWrite(LED4, HIGH);
// digitalWrite(LED2, LOW);
// delay(300);
// digitalWrite(LED5, HIGH);
// digitalWrite(LED3, LOW);
// delay(300);
// digitalWrite(LED4, LOW);
// delay(2700);
// digitalWrite(LED5, LOW);
// digitalWrite(LED1, HIGH); //fin3
// delay(3000);
// digitalWrite(LED2, HIGH);
// delay(300);
// digitalWrite(LED3, HIGH);
// digitalWrite(LED1, LOW);
// delay(300);
// digitalWrite(LED4, HIGH);
// digitalWrite(LED2, LOW);
// delay(300);
// digitalWrite(LED5, HIGH);
// digitalWrite(LED3, LOW);
// delay(300);
// digitalWrite(LED4, LOW);
// delay(2700);
// digitalWrite(LED5, LOW);
// digitalWrite(LED1, HIGH); //todo on
// digitalWrite(LED2, HIGH);
// digitalWrite(LED3, HIGH);
// digitalWrite(LED4, HIGH);
// digitalWrite(LED5, HIGH);
// delay(2700);
// while (digitalRead(PULSADORW) == HIGH) {
// }
unsigned long tiempoActual = millis();
switch (estadoActual) {
case INICIO:
// ... código de inicialización ...
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LINEOUT, HIGH);
digitalWrite(SONIDO, HIGH); // primera vuelta velx1
estadoActual = PRIMERA_VUELTA_VEL1;
break;
case PRIMERA_VUELTA_VEL1:
// ... lógica para la primera vuelta, velocidad 1 ...
if (tiempoActual - tiempoAnterior >= 1000) {
// Cambiar al siguiente estado o repetir el patrón
digitalWrite(SONIDO, LOW);
digitalWrite(LED1, HIGH);
tiempoActual = millis();
estadoActual = PRIMERA_VUELTA_VEL2;
}
break;
case PRIMERA_VUELTA_VEL2:
if (tiempoActual - tiempoAnterior >= 3000) {
// Cambiar al siguiente estado o repetir el patrón
digitalWrite(LED2, HIGH);
tiempoActual = millis();
estadoActual = PRIMERA_VUELTA_VEL3;
}
break;
case PRIMERA_VUELTA_VEL3:
if (tiempoActual - tiempoAnterior >= 300) {
// Cambiar al siguiente estado o repetir el patrón
digitalWrite(LED3, HIGH);
digitalWrite(LED1, LOW);
tiempoActual = millis();
estadoActual = FIN;
}
break;
// digitalWrite(LED2, HIGH);
case FIN:
// Esperar a que se presione el botón
while (digitalRead(PULSADORW) == HIGH) {
}
Serial.println("Alguien presionó y vuelve a comenzar la secuencia.");
// Reiniciar la máquina de estados
estadoActual = INICIO;
break;
}
}
Acá esta el código, mira si es similar al tuyo y prueba
Ciertamente no me esforcé mucho pero te doy la pauta de por donde ir.
Con esta forma de programar en cuanto toques el pulsador se reinicia y conservas toda la secuencia que querías hacer (pero debes completarla).
Estas instrucciones (dentro de switch/case)
tiempoActual = millis();
¿Deberían ser
tiempoAnterior = millis();?
Corregido, gracias @mancera1979.
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.

