Arduino: librería para usar uno o varios temporizadores sin la función delay()

ESP8266 usando la librería mlTemporizador para poder usar temporizadores sin el uso de la función delay()

En los programas de Arduino, ESP8266, ESP32 y familia, se usa la función delay() para mantener al microprocesador en espera. En la documentación oficial se indica que no deberíamos usar tiempos máximos de varias decenas de milisegundos, o lo que es lo mismo, menos de 100 milisegundos o 0,1 segundo.

Sin embargo, en la práctica, he llegado a ver sketchs con delays de varios días…

via GIPHY

Este uso inadecuado puede hacer que el programa tenga resultados inesperados, y que se quede colgado.

Como alternativas, hay distintas aproximaciones, aquí algunos ejemplos:

https://randomnerdtutorials.com/why-you-shouldnt-always-use-the-arduino-delay-function/
https://rudysarduinoprojects.wordpress.com/2019/02/10/fun-with-arduino-13-timer-with-millis-no-delay-multitasking/

Pero finalmente se me ocurrió hacer una librería, simple pero que nos permita manejar temporizadores de manera sencilla, mediante la creación de objetos.

En este video se puede ver el funcionamiento de la librería, con un temporizador donde vemos la cuenta atrás y otro donde se ve la cuenta hacia delante.

Aquí tenéis el enlace a mi GitHub -> https://github.com/miguelangellopezharillo/mlTemporizador

Y aquí tenemos el código actual del fichero mlTemporizador.cpp con el contenido de las funciones y el constructor asociado.

Como resumen de las funciones podemos ver que creamos el temporizador simplemente pasando como parámetro el tiempo en milisegundos que queremos que dure. Internamente además tendremos los atributos que nos indican si dicho temporizador está activado y si ha finalizado.

Al usar la función de activación, ponemos a TRUE el atributo correspondiente y cogemos desde el sistema el tiempo actual con la función millis().

Para resetear, volvemos los atributos de estado de activación y de finalización del plazo al estado inicial, es decir, FALSE.

La función de EstaActivado() es simplemente un getter del atributo.

Para comprobar si el plazo ha pasado, la siguiente función compara si el momento actual (recuperado mediante la función millis()) es superior al momento de inicio del temporizador más el tiempo de duración del temporizador. En ese caso, significa que se ha cumplido el tiempo del temporizador.

La función TiempoRestanteEnSeg() nos devuelve algo muy útil, que son los segundos que faltan para se cumpla el plazo solicitado al temporizador.

Y por último la función TiempoDesdeInicioEnSeg() nos indica los segundos que han pasado desde el inicio del temporizador.

En el ejemplo que he incluído en la librería podemos ver el uso de dos temporizadores, mostrando el tiempo hasta el que se cumpla el plazo del primero y mostrando el tiempo pasado desde el inicio del segundo.

Espero que lo uses en tus proyectos. Si tienes dudas sobre cómo instalarlo en tu IDE de Arduino, te dejo los siguientes enlaces, donde lo explican de maravilla:

https://programarfacil.com/blog/arduino-blog/instalar-una-libreria-de-arduino/
https://aprendiendoarduino.wordpress.com/2016/06/27/librerias-3/

Y por cierto, los adaptadores impresos en 3D del ESP8266 y la pantalla LCD son diseños propios y los puedes descargar e incluso modificar desde aquí y aquí. Espero que te sean de utilidad.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.