Introducción
Es muy común en proyectos de automatización industrial programar secuencias repetitivas en intervalos de tiempo específicos. El lenguaje de programación Arduino proporciona algunas funciones de tiempo para controlar el Panel Arduino de tu controlador PLC industrial y realizar cálculos para lograr esto. Las funciones más habituales para trabajar con tiempo son millis () y delay (), pero ¿cuáles son las diferencias entre ellas y qué función es mejor utilizar en cada caso? En este post hablaremos de ellos y veremos algunos ejemplos de su uso.
Requisitos para programar las funciones Millis () y Delay ()
Para ejecutar este programa necesitaremos lo siguiente:
2 LEDs
2 Resistencias de 220 ohmios
Alambres
Funciones temporales de Millis () y Delay ()
Usando Arduino IDE hay funciones definidas por defecto como funciones de tiempo como Millis () y Delay (). Te permitirán controlar.
Función Millis ()
En primer lugar, necesitas saber lo que hace la función millis(). Esta te devulve el número de milisegundos que han pasado desde que la placa Arduino ha empezado a ejecutar el programa actual. Tiene un límite de tiempo de aproximadamente 50 días; después de este tiempo, se desborda y vuelve a cero. Si el programa necesita ejecutarse más tiempo, puede necesites un contador adicional. Si se necesitas una cantidad de tiempo más precisa, hay una función llamada micros(), que tiene la misma funcionalidad que la función millis() pero funciona con microsegundos.
Función Delay ()
Por otro lado, la función delay() detendrá el programa por la cantidad específica en milisegundos que estará especificada en los parámetros. Aunque es fácil de usar esta función, tiene la desventaja de que cualquier otra acción puede ser realizada durante su uso. Si necesitas una cantidad de tiempo más precisa, existe la función llamada DelayMicroseconds(), que tiene la misma funcionalidad que Delay() pero funciona con microsegundos.
Delay () vs Millis ()
La primera diferencia que puede ver es que millis () no tiene parámetro pero devuelve la cantidad de tiempo que ha pasado; mientras que delay () requerirá la cantidad de milisegundos que queremos para pausar el programa pero no devolverá nada.
Aunque ambas funciones funcionarán con milisegundos y podrían utilizarse para controlar el tiempo, a diferencia de millis(), el delay() es una función de bloqueo. Una función de bloqueo es una función que impide que un programa haga algo más hasta que esa tarea haya sido completada. Esto significa que al usar delay() no puedes ejecutar ninguna otra tarea durante el tiempo que hayas especificado.
¿Qué función debo utilizar?
Ambas funciones pueden utilizarse en la mayoría de casos, pero a veces una es mejor que la otra. Por ejemplo, si quieres imprimir un mensaje cada 5 segundos sin ninguna otra condición, ambas pueden funcionar perfectamente:
Ejemplo de Millis()
unsigned long time;void setup() {Serial.begin(9600);}void loop() {time = millis();Serial.println("Hello World");while(millis() < time+5000);}
Ejemplo de Delay()
void setup() {Serial.begin(9600);}void loop() {Serial.println("Hello World");delay(5000);}
En caso de que sólo quieras realizar una acción, delay() es más fácil de implementar como puedes ver en los códigos anteriores. Sólo tendrás que llamar a la función, bloqueando el programa durante el tiempo especificado.
Por otro lado, quieres realizar una operación en la que se deben ejecutar dos acciones simultáneamente, no debes utilizar la función delay() ya que el programa se bloqueará en su llamada. Si esto ocurre, ambas acciones se detendrán el tiempo especificado en la función. En un programa complejo, esto podría causar un error significativo que podría estropearlo. En el siguiente ejemplo, puedes ver cómo parpadear dos LEDs usando diferentes intervalos de tiempo con la función millis(). Usando la función delay() no será posible hacerlo simultáneamente.
Los LED parpadean con la función millis ()
int Led1,Led2;int Period1, Period2;unsigned long Time1, Time2;void setup() {pinMode(13,OUTPUT);pinMode(12,OUTPUT);Time1 = Time2 = millis();Period1 = 1000;Period2 = 2000;}void loop() {if(millis()-Time1>=Period1){Led1=!Led1;digitalWrite(13,Led1);Time1=millis();}if(millis()-Time2>=Period2){Led2=!Led2;digitalWrite(12,Led2);Time2=millis();}}
En conclusión, la función millis() es mejor en general y es muy recomendable utilizarla antes de la función delay(). Te permitirá programar usando diferentes hilos al mismo tiempo y es más precisa. La función delay() sólo se recomienda utilizarla en programas simples si necesitas una acción de bloqueo del programa.