Práctica: Blink sin delay

por | 26 mayo, 2016

El uso de la función delay es muy desaconsejable usarla, puesto que el tiempo que estamos ejecutando esta función se para el microcontrolador y no es capaz de hacer nada más. Es mucho mejor usar funciones de temporización que cuenten el tiempo y ejecutar la operación cuando el temporizador se dispare, permitiendo a Arduino hacer varias tareas a la vez. Las librerías de temporizadores como MStimer2 y timer nos pueden ayudar a hacer estas funciones.

Existen librerías que permiten simular la multitarea utilizando el concepto de Thread o hilo, como por ejemplo la librería ArduinoThread y mThread. Por supuesto que no se trata de unos hilos reales (en el sentido de que funcionan como “procesos” separados), sino que lo simulan, facilitando el uso de ese paradigma de programación multitarea.

Enlace interesante sobre multitarea: http://correntino.net/wp/?p=11

Ejercicio: Hacer el ejercicio de blink pero sin usar la función delay(). Para ello se puede usar las funciones millis() o micros().

Ejemplo de ejercicio: http://arduino.cc/en/Tutorial/BlinkWithoutDelay

Después de entender el ejercicio, añadir un botón y a la vez que el LED parpadea, contar cuantas veces se pulsa el botón y mostrarlo por el puerto serie cada vez que se pulse aumentando el contador de pulsos. Comprobar la multitarea.

Hacer el mismo ejercicio con las librerías mstimer2 y la librería Timer, de forma con una de ellas temporizo cada 5 segundos el parpadeo del LED y con la otra se muestra cada 3 segundos el número de pulsaciones contadas.

Librerías:

¿Y si queremos hacerlo con dos leds?

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio19-BlinkSinDelay

Millis()

Cuando no podemos o no queremos usar delay(), entonces tenemos que usar la función millis() e introducir el concepto de máquina de estados.

Tutorial de uso de millis(): https://www.baldengineer.com/millis-tutorial.html

Blink sin delay explicación paso a paso: https://www.baldengineer.com/blink-without-delay-explained.html

La función millis() me devuelve el número de milisegundos desde que Arduino se ha reseteado, dado que millis devuelve un unsigned long puede tener un valor de hasta 4.294.967.295 que son 49 días, 17 horas, 2 minutos, 47 segundos y 292 milisegundos, por lo tanto al cabo de ese periodo el contador se resetea.

En principio no se debe resetear puesto que corremos el riesgo de que dejen de funcionar las librerías que usen la función millis() sino que hay que usar la diferencia de millis entre un evento y otro. Más información: https://www.baldengineer.com/arduino-how-do-you-reset-millis.html

Deja un comentario