Diferencia entre revisiones de «Blink without delay»

De ArduWiki
Saltar a: navegación, buscar
(Vea también)
Línea 1: Línea 1:
 +
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 ==
 
== Placa aplicable ==
 +
Todas.
  
 
== Código ==
 
== Código ==
 
<pre>
 
<pre>
 +
bool led = true;                //Aqui guardamos el estado del LED
 +
unsigned long hora = 0;        //Aqui guardamos la 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;
 +
  }
 +
}
 
</pre>
 
</pre>
  
 
== Comentarios ==
 
== 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()]]
  
 
== Vea también ==
 
== Vea también ==

Revisión del 23:04 20 jun 2018

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;                //Aqui guardamos el estado del LED
unsigned long hora = 0;         //Aqui guardamos la 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()

Vea también