LED-s parpadenates sin utilizar la función delay()

A veces es necesario hacer parpadear un LED (o realizar cualquier otro tipo de función en relación al tiempo) al mismo tiempo que cualquier otra cosa (como por ejemplo comprobar si un botón es pulsado). Eso significa que no se puede utilizar la función delay(), o sería necesario parar cualquier otra cosa que el programa estuviese haciendo mientras el LED parpadea. Aquí hay un trozo de código que demuestra cómo hacer parpadear un LED sin utilizar la función delay(). Lo que hace es simplemente controlar cuando fué la última vez que el LED fué encendido o apagado. Entonces, en cada iteración del loop() comprueba si ha pasado el tiempo suficiente, y en caso positivo, enciende el LED si estaba apagado o viceversa.

Esquema

Código fuente

/* LED parpadeante sin utilizar la función delay()

 * -----------------------------------------------
 *
 * Enciende y apaga un diodo emisor de luz (Led) conectado a un pin 
 * digital, sin utilizar la función delay(). Esto significa que otro 
 * código puede ser ejecutado el mismo tiempo sin interrumpir el
 * código que hace parpadear al LED.
 *
 * Created 14 February 2006
 * David A. Mellis
 * traduccion por I. Gonzalez y A. Ramos
 * http://www.arduino.cc - http://www.arduino.es
 */

 int ledPin = 13;                // LED conectado al pin digital número 13
 long previousMillis = 0;         // Almacena la última vez que el LED fué modificado
 int value = LOW;                // Estado anterior del LED
 long interval = 1000;            // Intervalo de parpadeo (milisegundos)

void setup() {

  pinMode(ledPin, OUTPUT);      // Configura como salida el pin digital

}

void loop() {

  // Aquí hay que colocar el código que es necesario ejecutar continuamente.

  // Comprueba si es hora de cambiar el estado del LED. Esto es, si la diferencia
  // entre el tiempo actual y la última vez que se produjo el cambio en el estado
  // del LED es mayor que el intervalo en el que queremos hacer parpadear el LED.

  if (millis() - previousMillis > interval) {
    previousMillis = millis();   // Recuerda la última vez que el estado del LED cambió
    if (value == LOW)            // Si el LED está apagado lo enciende y viceversa.
      value = HIGH;
    else
      value = LOW;
    digitalWrite(ledPin, value);
  }

}