En este tutorial voy a Explicar con un ejemplo como «utilizar» arduino como multitarea (multitasking), sabiendo que la programación es secuencial y su microcontrolador no es multitarea, sin el uso de ninguna librería. Simularemos que si lo es, gracias al manejo de los tiempos dentro de nuestro código y a la frecuencia de trabajo de nuestra placa.
Suscribite al Canal!!!
Este es un proyecto muy interesante. Es simple de hacer, fácil de programar el arduino y también un gran proyecto para todos los «MAKERS» como yo. Así que a no perder el tiempo y a hacer este proyecto.
Concepto:
Un led enciende y apaga cada 1 segundo, otro led enciende y apaga cada 0,5 segundos y el último enciende y se apaga mientras esta pulsado el pulsador. siendo cada led independiente de los otros. Lo que observamos es «multitarea», porque cada tiempo es independiente y se realiza independientemente de lo que le pase a otro. Aclaro nuevamente, Arduino no es multitarea, es secuencial, pero hay formas en las cuales simular y desarrollar esta multitarea gracias a la frecuencia con lo que se repite el loop y el manejo del tiempo.
Lista de materiales:
- Arduino UNO/Nano.
- 3 Led (cualquier color).
- 3 Resistencia de 330 ohm.
- 1 Resistencia 10 Kohm.
- 1 Pulsador
Diagrama de cableado / diagrama de circuito:
Link de Tinkercad
https://www.tinkercad.com/things/6qmys0hopmt
El SECRETO:
No utilizar en el código la función DELAY().
DELAY(milisegundos): Espera este tiempo declarado en milisegundo (1 segundo = 1000 Milisegundo) y no permite que el microcontrolador continúe ejecutando nada, lo «frena» ese tiempo.
Entonces utilizamos Millis(), variables y operaciones básicas matemáticas para calcular el tiempo que necesitamos.
Cargar el código:
Código totalmente modificable y adaptable a nuevas necesidades futuras, como por ejemplo, añadir más leds, otro pulsador, etc.
#define LED_1 3 //definimos los puertos donde conectaremos los leds y el pulsador. #define LED_2 4 #define LED_3 5 #define PULSADOR 6 #define ON 1 //definimos variables globales. #define OFF 0 #define TRUE 1 #define FALSE 0 void setup() { pinMode(LED_1, OUTPUT); //declaramos los leds como salida. pinMode(LED_2, OUTPUT); //si uno no declara como salida, arduino pinMode(LED_3, OUTPUT); //por defecto tiene declarado todo como entrada. } void loop() { ciclo_led_1(); //llamamos a cada función. ciclo_led_2(); ciclo_led_3(); } void ciclo_led_1() //creamos función para controlar el led_1 { static long ultimo_cambio = 0; static int Estado_LED = OFF; long hora = millis(); if (hora - ultimo_cambio > 1000) { ultimo_cambio = hora; if (Estado_LED == ON) { digitalWrite(LED_1, LOW); Estado_LED = OFF; } else { digitalWrite(LED_1, HIGH); Estado_LED = ON; } } } void ciclo_led_2() //creamos función para controlar el led_2 { static long ultimo_cambio = 0; static int Estado_LED = OFF; long hora = millis(); if (hora - ultimo_cambio > 500) { ultimo_cambio = hora; Estado_LED = !Estado_LED; digitalWrite(LED_2, Estado_LED); } } void ciclo_led_3() //creamos función para controlar el led_3 { //encenderá y apagará cuando se pulse el pulsador digitalWrite(LED_3, digitalRead(PULSADOR)); }