Controlar tiempos en Arduino sin utilizar un RTC ni librería Deja un comentario

Cuando estamos trabajando en algún proyecto, en ocasiones queremos controlar los tiempos en Arduino. Por ejemplo, queremos que cada X minutos se ejecute alguna acción. Tenemos diferentes posibilidades dentro de la API. Una de ellas, quizás la más conocida, sea la función delay(ms), donde ms son los milisegundos que queremos que espere antes de ejecutar la siguiente acción.

Vamos a tratar un caso real que me ha ocurrido. Controlar una serie de servomotores para que se muevan en diferentes momentos. Vamos a suponer que tenemos dos servomotores, su movimiento va a ser de 0º a 180º y viceversa, de 180º a 0º. El primer motor se tiene que mover cada minuto y el segundo motor se tiene que mover cada tres minutos.

Lo lógico y normal es que en el primer impulso utilicemos alguna función que nos de la hora exacta en la que estamos por ejemplo utilizando la librería times. Esa librería nos dice la hora, minuto y segundo en la que estamos. Aquí nos metemos en un laberinto que a veces no tiene salida, trabajar con fechas en programación a veces se vuelve un verdadero dolor de cabeza.

Hay otras funciones como millis() que nos dice el número de milisegundos que han transcurrido desde que se inició Arduino. Devuelve un número del tipo unsigned long con un rango de 0 to 4.294.967.295, aproximadamente 50 días, esta sería una buena opción.

Pero quizás una manera muy sencilla de contar ese tiempo sería utilizar la ya mencionada función delay(). Esta función nos permite parar la ejecución del sketch o programa un número de milisegundos. El gran inconveniente es que solo admite valores int es decir, un rango de entre -32.768 to 32.767 para un Arduino UNO (16 bit de precisión) o -2.147.483.648 to 2.147.483.647 para un Arduino MEGA (32 bit de precisión). Si eliminamos la parte negativa ya que el retardo negativo no tiene sentido, podríamos hacer una pausa de 32.767 milisegundos en un Arduino UNO y 2.147.483.647 milisegundos en un Arduino MEGA.

Tomemos de ejemplo el Arduino UNO. Queremos hacer una pausa de 1 minuto que equivale a 60.000 milisegundos. Como podrás comprobar se sale de rango entonces ¿cuál es la solución? Muy fácil, hacemos dos pausas de medio segundo (30.000 milisegundos) y a correr. Así podríamos hacer retardos del tiempo que quisiéramos.

La segunda parte sería controlar el tiempo que ha pasado es decir, cuando llegue al minuto que mueva el primer servomotor y cuando llegue al tercer minuto. Para esto se utiliza una función muy útil, el módulo. Lo podrás ver en diferentes lenguajes de programación como mod y con el operador %. Así es como se representa en el código nativo de Arduino, como %. Esta función te devuelve el resto de una división. Pongamos un ejemplo si hacemos la operación 4 % 2, el resto será 0 y eso precisamente es lo que nos devolverá esta función. En cambio si hacemos 5 % 2 el resto de dividir 5 entre 2 es 1 y la función módulo nos dará ese resultado.

Con esta información ya podemos saber si ha pasado un minuto o han pasado tres minutos. Teniendo un contador que cuente los minutos que llevamos y dividiendo esos minutos por el tiempo que hemos marcado para que se muevan los motores, sería relativamente sencillo.

A continuación te dejo un código de ejemplo para que compruebes como hacerlo. Puedes hacer las conexiones de los servomotores como lo hice en el artículo dedicado a este componente.

Por lo tanto, siempre y cuando nos enfrentemos a algún problema a resolver, tenemos que ver las opciones que nos ofrece la API de Arduino y utilizar las matemáticas para resolverlo. Es fundamental tener conocimientos básicos de esta materia para resolver los rompecabezas que podamos encontrar en nuestros proyectos. En este caso hemos visto como resolver el control de tiempos en Arduino.

 

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.

Enviar Whatsapp
Hola 👋
¿En qué podemos ayudarte?