Retardos de tiempo en Arduino: Delay, Millis y Micros

Los retrasos en Arduino son muy importantes. Sin ellos, incluso el ejemplo m谩s simple de Blink, que parpadea con un LED en un momento dado, no funcionar铆a. Pero la mayor铆a de los programadores novatos saben poco acerca de los retardos de tiempo y s贸lo usan el retardo de Arduino, sin conocer los efectos secundarios de este comando. En este art铆culo analizaremos en detalle las funciones temporales y las peculiaridades de su uso en el IDE de Arduino.

Funciones de tiempo en Arduino

Hay varios comandos diferentes en el Arduino que son responsables de trabajar con tiempo y pausas:

  • delay()
  • delayMicroseconds()
  • millis()
  • micros()

Cada una de ellas difiere en su precisi贸n y tienen sus propias peculiaridades que deben tenerse en cuenta al escribir el c贸digo.

Usando la funci贸n de retardo de arduino

Sintaxis

El delay de Arduino es el comando m谩s f谩cil y el m谩s utilizado por los principiantes. De hecho, es un retardo que detiene la operaci贸n del programa por el n煤mero de milisegundos especificado entre par茅ntesis. (Un segundo tiene 1000 milisegundos.) El valor m谩ximo puede ser 4294967295 ms, que es aproximadamente el equivalente a 50 d铆as. Veamos un ejemplo sencillo que muestra c贸mo funciona este comando.

En la configuraci贸n del m茅todo escribimos que el pin 13 se usar谩 como salida. En la parte principal del programa, primero se da una se帽al alta al pin, luego hacemos un retardo de 10 segundos. En este momento, el programa se suspende. Entonces se da una se帽al baja y se repite el retardo y todo vuelve a empezar. Como resultado, obtenemos que el pin se alimenta alternativamente 5 V y luegocon 0 V, encend铆endose y apag谩ndose.

Debemos tener claro que durante la pausa con la funcion delay el programa se suspende, la aplicaci贸n no recibir谩 ning煤n dato de los sensores. Esta es la mayor desventaja de usar la funci贸n de retardo en Arduino. Este problema se puede eludir con la ayuda de interrupciones, de las que hablamos en este art铆culo.

Funci贸n DelayMicroseconds

Esta funci贸n funciona igual que Delay, salvo que su unidad de medida es en microsegundos en lugar de milisegundos (10000000000 microsegundos en 1 segundo). El valor m谩ximo es 16383, que es de 16 milisegundos. La resoluci贸n es 4, es decir, el n煤mero siempre ser谩 m煤ltiplo de cuatro. Un ejemplo se ver谩 as铆:

El problema con delayMicroseconds es exactamente el mismo que con delay – estas funciones “cuelgan” completamente el programa y literalmente se detiene por un tiempo. En este momento es imposible trabajar con puertos, leer informaci贸n de sensores y realizar operaciones matem谩ticas. Esta opci贸n es adecuada para hacer parpadear un led, pero no se utilizan en proyectos grandes o avanzados, ya que no hay necesidad de limitarse de tal forma. Por lo tanto, es mucho mejor utilizar las funciones que describimos a continuaci贸n.

Funci贸n millis() en lugar de delay()

La funci贸n millis() nos permite hacer un retraso sin detener el programa de Arduino, evitando as铆 las desventajas de los m茅todos anteriores. El valor m谩ximo del par谩metro millis es el mismo que para la funci贸n delay (4294967295ms o 50 d铆as). Cuando se produce un desbordamiento, el valor se restablece a 0.

Con millis, no detenemos la ejecuci贸n de todo el sketch, s贸lo especificamos cu谩nto tiempo Arduino deber谩 “puentear” el bloque exacto聽 de c贸digo que queremos pausar. A diferencia de delay, millis no detiene nada.

Este comando simplemente devuelve el n煤mero de milisegundos transcurridos desde el inicio del microcontrolador desde el temporizador incorporado. Medimos el tiempo transcurrido desde la 煤ltima llamada de nuestro c贸digo y si la diferencia horaria es menor que la pausa deseada, ignoramos el c贸digo.

Tan pronto como la diferencia sea mayor que la pausa requerida, ejecutamos el c贸digo, obtenemos la hora actual con la ayuda de los mismos milis y la recordamos – esta vez ser谩 un nuevo punto de referencia. En el siguiente bucle la cuenta atr谩s ser谩 desde el nuevo punto y volveremos a ignorar el c贸digo hasta que la nueva diferencia entre milis y nuestro valor previamente guardado alcance la pausa deseada.

El uso de millis requiere m谩s c贸digo que delay, pero se puede utilizar para hacer parpadear el LED y pausar el sketch sin detener todo el sistema.

Aqu铆 puedes ver un ejemplo de como funciona:

Primero introducimos una variable, que almacenar谩 el n煤mero de milisegundos. Por defecto, el valor de la variable es 0. En la parte principal del programa comprobamos la siguiente condici贸n: si el n煤mero de milisegundos desde el inicio del microcontrolador menos el n煤mero guardado en la variable de tiempo es m谩s de 10000, entonces la acci贸n de emitir el mensaje al monitor del puerto se realiza y el valor de tiempo actual se escribe en la variable. Como resultado de la operaci贸n del programa, cada 10 segundos se mostrar谩 el mensaje en el monitor del puerto. Este m茅todo permite que el LED parpadee sin detener la ejecuci贸n del programa.

La funci贸n micros() en lugar de delay()

Esta funci贸n tambi茅n puede ejecutar un retraso sin utilizar la funci贸n delay. Funciona de la misma manera que millis, pero no cuenta en milisegundos, sino en microsegundos con una resoluci贸n de 4渭s. Su valor m谩ximo es de 4294967295 microsegundos o 70 minutos. En caso de un desbordamiento, el valor se restablece a 0.

En Resumen

Arduino nos proporciona varias formas de realizar los retardos en nuestros proyectos. Con el delay se puede detener r谩pidamente la ejecuci贸n de un sketch, pero al mismo tiempo bloquear el microcontrolador. El uso del comando millis permite pausar un bloque de c贸digo sin detener completamente todo el programa, pero necesitaremos un poco m谩s de programaci贸n. Elije la mejor opci贸n dependiendo de la complejidad de tu proyecto. Por lo general, en los programas simples y con un retraso de menos de 10 segundos se utiliza delay. Si nuestro proyecto es m谩s complejo y requiere m谩s retardo, ser谩 mejor usar la funci贸n millis.