Blink without delay

De Arduino
Saltar a: navegación, buscar

A veces necesitas hacer dos cosas a la vez. Por ejemplo, es posible que desee parpadear un LED mientras lee un pulsador o sensor. En este caso, no puede usar delay(), porque Arduino pausa su programa durante el delay(). Si se presiona el pulsador o cambia el valor del sensor o llega algo por el puerto serie mientras Arduino está en pausa esperando que delay() termine, su programa perderá dicho evento.

Este boceto muestra cómo hacer parpadear un LED sin usar delay(). Enciende el LED y luego toma nota de la hora. Luego, cada vez que termina loop() se vuelve a ejecutar y verifica si ha pasado el intervalo de parpadeo deseado. Si paso, enciende o apaga el LED y toma nota de la nueva hora. De esta forma, el LED parpadea continuamente mientras que la ejecución del boceto nunca se detiene en una sola instrucción.

Una analogía sería calentar una pizza en un microondas y también ver un partido por TV. Pones la pizza en el microondas para calentar durante 10 minutos. La analogía del uso delay() sería sentarse frente al microondas mirando la cuenta atrás del temporizador desde 10 minutos hasta que el temporizador llegue a cero. Mientras tanto puede que ya metieran un gol y te lo perderás.

Lo que harías en la vida real sería encender el microondas y luego regresar a ver el partido. Hasta que la alarma suena avisandote que la pizza esta lista.

Placa aplicable

Todas.

Código

bool led = true;                //Estado del LED
unsigned long hora = 0;         //Hora de cambio de estado
const int intervalo = 500;      //Intervalo de parpadeo (millisegundos)

void setup() {
   pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
   if (millis() - hora >= intervalo) {
      hora = millis();
      digitalWrite(LED_BUILTIN, led);
      led = !led;
   }
}

Comentarios

  • Nuevamente comentarte que verdadero es sinónimo de HIGH y falso es sinónimo de LOW.
  • La variable hora debe ser del tipo unsigned long para poder soportar el retorno de la función millis()
  • Ya que intervalo no cambiara durante la ejecucion la hacemos const para no ocupar RAM.

Vea también

Referencias