Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio

El 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);
}
quiz iconPonte a prueba

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