Tutorial de Arduino: Usar millis () En lugar de delay()

Una función Arduino bien conocida es delay() que detiene el programa durante una cantidad de milisegundos especificada como parámetro.

millis(), por otro lado, es una función que devuelve la cantidad de milisegundos que han pasado desde el inicio del programa.

A primera vista puede dudar de la utilidad de esta función. El hecho es que es extremadamente útil en muchos escenarios, a menudo «reemplazando» delay() por completo. Veamos primero cómo podemos usar millis() casi exactamente como delay().

Los problemas de tiempo a menudo están presentes en la programación.

Usando retardo similar a millis() ()

int period = 1000;unsigned long time_now = 0;void setup() {Serial.begin(115200);}void loop() {time_now = millis(); Serial.println("Hello"); while(millis() < time_now + period){//wait approx. ms}}

Si desea que su código se detenga por 1000 ms al final de cada iteración de bucle, el código anterior es un poco tonto. Puedes usar delay(1000) en su lugar. La única diferencia entre el código anterior y un código con delay(1000) al final es que el bucle en el código anterior se ejecutará con bastante precisión una vez por segundo. El bucle en un código con delay(1000) se ejecutará con un poco menos de frecuencia, ya que también lleva algún tiempo ejecutar Serial.println("Hello").

¿Por qué usar millis() En lugar de delay()?

Ahora veremos dos ventajas con millis() en comparación con delay().

Sincronización precisa

La primera ventaja que discutiremos es la sincronización precisa. En cuanto al código, lo cubrimos en el último capítulo. Con millis() podemos asegurarnos de que el bucle se ejecute con la frecuencia que queramos, independientemente del tiempo de ejecución (obviamente, siempre y cuando el tiempo de ejecución sea menor que el período deseado). Con delay() esto no es posible ya que no sabemos cuánto tiempo es el tiempo de ejecución del bucle.

Una sincronización precisa como esta es muy útil cuando se muestrea a una frecuencia determinada o se ejecutan filtros, entre otras cosas.

Sin bloqueo

La otra ventaja de millis() es que no nos impedirá ejecutar código mientras «esperamos».

Digamos que queremos imprimir «Hola» en serie una vez por segundo mientras hacemos otras cosas mientras tanto. Esto no es posible con delay() ya que detiene todo el código. Aquí hay una forma de hacerlo:

int period = 1000;unsigned long time_now = 0;void setup() {Serial.begin(115200);}void loop() {if(millis() >= time_now + period){time_now += period;Serial.println("Hello");} //Run other code}

Este fragmento de código es bastante similar al primer fragmento, excepto que no bloquea el resto del programa cuando no se imprime en serie.

Ejemplo: un programador simple

Escribamos un ejemplo simple donde creamos un programador que imprime ciertos bits de texto a diferentes intervalos.

#define INTERVAL_MESSAGE1 5000#define INTERVAL_MESSAGE2 7000#define INTERVAL_MESSAGE3 11000#define INTERVAL_MESSAGE4 13000unsigned long time_1 = 0;unsigned long time_2 = 0;unsigned long time_3 = 0;unsigned long time_4 = 0;void print_time(unsigned long time_millis);void setup() {Serial.begin(115200);}void loop() {if(millis() >= time_1 + INTERVAL_MESSAGE1){time_1 +=INTERVAL_MESSAGE1;print_time(time_1);Serial.println("I'm message number one!");} if(millis() >= time_2 + INTERVAL_MESSAGE2){time_2 +=INTERVAL_MESSAGE2;print_time(time_2);Serial.println("Hello, I'm the second message.");} if(millis() >= time_3 + INTERVAL_MESSAGE3){time_3 +=INTERVAL_MESSAGE3;print_time(time_3);Serial.println("My name is Message the third.");} if(millis() >= time_4 + INTERVAL_MESSAGE4){time_4 += INTERVAL_MESSAGE4;print_time(time_4);Serial.println("Message four is in the house!");}}void print_time(unsigned long time_millis){Serial.print("Time: ");Serial.print(time_millis/1000);Serial.print("s - ");}

Así es como se ven los primeros 60 segundos en el monitor serie:

Esta es una forma agradable y fácil de sincronizar ejecuciones en su código. También puede ejecutar otro código simultáneamente.

micros () y Desbordamiento

Al igual que delay() tiene una versión de microsegundos llamada delayMicroseconds(), millis() tiene micros(). Si necesita una mejor resolución, micros() puede ser el camino a seguir.

Sin embargo, tenga en cuenta que micros() se desbordará después de aproximadamente 70 minutos, en comparación con los 50 días de millis(). Esto significa que los valores de retorno de las funciones comenzarán de nuevo desde cero.

Más importante aún: para saber cómo puedes evitar el problema de desbordamiento en conjunto, lee esta publicación de blog.

Resumen

millis() y micros() son funciones muy útiles para usar cuando se trata de tareas de sincronización. Si no eres consciente de esto, es posible que termines usando delay() en su lugar, lo que no siempre funcionará tan bien (si es que funciona).

Para obtener más consejos de Arduino & trucos, consulta nuestra categoría de blog de Tutoriales de Arduino. ¡Manténgase atento para obtener más contenido relacionado con Arduino en el futuro también!

Deja una respuesta

Tu dirección de correo electrónico no será publicada.