Parpadear sin esperas
Parte de la sección Temporización sin delay del Journey de Arduino de Coddy. Lección 3 de 18.
delay() detiene todo el sketch. Mientras un parpadeo espera sus 500 ms, no se ejecuta nada más en loop(): si se pulsa un botón durante ese tiempo, no se detecta hasta que termina la espera.
La solución es no esperar nunca. Deja que loop() se ejecute una y otra vez, muy rápido, y compara cada vez el reloj con el momento en que el LED cambió por última vez. Hasta que hayan pasado 500 ms, no hagas nada. Después, cambia el LED y guarda el nuevo momento:
const unsigned long interval = 500;
unsigned long previousMillis = 0; // cuándo cambió el LED por última vez
void loop() {
unsigned long now = millis();
if (now - previousMillis >= interval) {
previousMillis = now; // recuerda este momento
// cambia el estado del LED aquí
}
// cualquier otra cosa aquí se ejecuta miles de veces por segundo
}now - previousMillis es el tiempo transcurrido desde el último cambio. Para cambiar el LED, guarda su estado en una variable, int redState = LOW;, inviértelo con if/else y escríbelo con digitalWrite(redLed, redState);.
Si olvidas actualizar previousMillis, la condición seguirá siendo verdadera después de los primeros 500 ms, así que el LED cambiará en cada iteración del bucle y parecerá medio encendido.
Desafío
IntermedioEl LED amarillo debe seguir el botón, pero reacciona tarde porque las llamadas a delay() del LED rojo detienen el bucle. Reescribe el parpadeo del LED rojo con millis():
- mantén la parte del botón tal como está
- cada 500 ms, enciende y apaga el LED rojo del pin 13
- no uses
delay()en ninguna parte
Pulsa Run, mantén pulsado el botón y observa ambos LED; después, pulsa Check.
Pruébalo tú mismo
const int redLed = 13;
const int yellowLed = 12;
const int buttonPin = 2;
void setup() {
pinMode(redLed, OUTPUT);
pinMode(yellowLed, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
// El LED amarillo responde al botón. Conserva esta parte.
if (digitalRead(buttonPin) == LOW) {
digitalWrite(yellowLed, HIGH);
} else {
digitalWrite(yellowLed, LOW);
}
// El LED rojo parpadea, pero cada delay() detiene las líneas anteriores
// durante medio segundo. Reescribe esta parte con millis().
digitalWrite(redLed, HIGH);
delay(500);
digitalWrite(redLed, LOW);
delay(500);
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Temporización sin delay
Practica por tu cuenta: Playground de Arduino