Sunday, June 15, 2014

Problema con delay en Arduino Nano

Trabajando últimamente con Arduino Nano y queriendo de alguna forma "explotar" a fondo sus características, me crucé un problema particular. Mi objetivo era hacer andar un display lcd de 16x2 junto con 5 sensores DHT11. El problema más clásico que sufrí fue que la aplicación se quedaba en cierto punto y no avanzaba. Haciendo diversas pruebas, llegué a que el problema se encontraba en la clásica función de Arduino delay. Esta función se encarga de pausar el controlador por X milisegundos y se suele utilizar imperativamente en ocasiones como la lectura de sensores, para que no se realicen lecturas continuamente ya que puede llegar a leerse información basura. Investigando un poco, encontré que esta función no es muy recomendable utilizar en este tipo de micro-controladores.

Era necesario encontrar una forma alternativa de "esperar" o detener el micro-procesador unos cuantos milisegundos en distintos puntos del programa. Esta es la solución para aquellos que se encuentren con este tipo de problemas:
Supongamos que estabamos utilzando delay(1000), es decir, espera de 1 segundo. Esto puede ser reemplazado por lo siguiente:

unsigned long Timer=millis();

while (!(millis()-Timer>=1000UL)){
}

La variable Timer toma los milisegundos actuales del programa. Luego se realizará la comparación de dicho valor con los milisegundos futuros y no se avanzará en la ejecución del programa hasta que haya una diferencia de 1000 entre ambos valores. UL indica que la variable es unsigned long, para tener compatibilidad de tipos.

Saludos y nos vemos pronto.