Archivo de la categoría: Multitarea

Multitarea Arduino

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.

En el curso avanzado se profundizará en el uso de estas librerías 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 3 segundos las pulsaciones. 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:

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

Millis()

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

Manejar el rollover de millis(): http://pastebin.com/vYYtZAbb

EXTRA – Programación Arduino

Muchos más ejemplos y prácticas para hacer: http://arduino.cc/en/Tutorial/HomePage

Más código:

Ver este ejemplo de programa y fijarse en la estructura: https://github.com/jecrespo/Home_Power_Meter/blob/master/Home_Power_Meter.ino