SIMULA el MULTITASKING en ARDUINO


millisarduino.jpg

Video

En esta práctica aprenderemos a usar la función MILLIS que trae Wiring para que simulemos un Arduino multitareas.

SIMULA EL MULTITASKING EN ARDUINO CON MILLIS



- Materiales:


Para realizar el circuito necesitas:

• 1 Arduino UNO,
• 1 Potenciómetro 10K,
• 3 LEDS,
• 3 resistencias de 330 Ohms,
• 1 protoboard y jumpers.

- Código


Comenzamos el código inicializando los pines de los LEDS y del POT. Después inicializamos todas las variables para cambiar el estado de cada uno de los LEDs, los tiempos medidos y el intervalo en que se van a ejecutar los bloques de código.

#define LED1 12
#define LED2 11
#define LED3 10
int POT = A0;

int ledState1 = LOW;
int ledState2 = LOW;
int ledState3 = LOW;

unsigned long previousMillisLed1 = 0;
unsigned long currentMillisLed1 = 0;
const long intervalLed1 = 1000;

unsigned long previousMillisLed2 = 0;
unsigned long currentMillisLed2 = 0;
const long intervalLed2 = 500;

unsigned long previousMillisLed3 = 0;
unsigned long currentMillisLed3 = 0;
const long intervalLed3 = 100;

unsigned long previousMillisPot1 = 0;
unsigned long currentMillisPot1 = 0;
const long intervalPot1 = 1000;

En el void setup() declaramos los pines de los LEDs como salidas e iniciamos el puerto serial a 9600 baudios para imprimir los valores del potenciómetro.

void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(POT, INPUT);
Serial.begin(9600);
}

En el void loop() empezamos a guardar en las variables currentMillis, el tiempo actual desde que se empezó a ejecutar el programa.
Usando condicionales if, comparamos ambos tiempos (currentMillis y previousMillis) y si la resta de estos datos es mayor o igual al intervalo definido en un principio, que ejecute el bloque de código.

Dentro de cada bloque de código será lo que queramos hacer con los componentes, en este caso será encender y apagar un LED y leer el valor de un potenciómetro. En los bloques guardamos el valor de currentMillis en previousMillis para que el loop no se rompa.
En los LEDs tenemos que saber el estado en que se encuentra el LED, con la variable ledState estaremos cambiando de HIGH a LOW y de LOW a HIGH usando condicionales if. Y con el potenciómetro solo obtenemos el valor con analogRead y lo imprimimos en el monitor Serial. Por último, con digitalWrite mandamos los estados de cada uno de los LEDS.

void loop() {
currentMillisLed1 = millis();
currentMillisLed2 = millis();
currentMillisLed3 = millis();
currentMillisPot1 = millis();
if (currentMillisLed1 - previousMillisLed1 >= intervalLed1) {
previousMillisLed1 = currentMillisLed1;

if (ledState1 == LOW) {
ledState1 = HIGH;
} else {
ledState1 = LOW;
}
}

if (currentMillisLed2 - previousMillisLed2 >= intervalLed2) {
previousMillisLed2 = currentMillisLed2;

if (ledState2 == LOW) {
ledState2 = HIGH;
} else {
ledState2 = LOW;
}
}

if (currentMillisLed3 - previousMillisLed3 >= intervalLed3) {
previousMillisLed3 = currentMillisLed3;

if (ledState3 == LOW) {
ledState3 = HIGH;
} else {
ledState3 = LOW;
}
}

if (currentMillisPot1 - previousMillisPot1 >= intervalPot1) {
previousMillisPot1 = currentMillisPot1;

int potValue = analogRead(POT);
Serial.println(potValue);
}

digitalWrite(LED1, ledState1);
digitalWrite(LED2, ledState2);
digitalWrite(LED3, ledState3);
}

- Versión del código con funciones (PRO)



Se puede hacer el mismo objetivo haciendo menos código implementando las funciones. Para este caso usamos una función vacía, en sus atributos usamos apuntadores para dirigirnos a donde se encuentra la variable mandada y no utilizar un array para el manejo de datos. Aquí se muestra el código final:

#define LED1 10
#define LED2 9
#define LED3 8
int POT = A0;

unsigned long previousMillisLed1 = 0;
const long intervalLed1 = 1000;
int ledState1 = LOW;

unsigned long previousMillisLed2 = 0;
const long intervalLed2 = 500;
int ledState2 = LOW;

unsigned long previousMillisLed3 = 0;
const long intervalLed3 = 100;
int ledState3 = LOW;

unsigned long previousMillisPot1 = 0;
const long intervalPot1 = 1000;

unsigned long currentMillis = 0;
void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(POT, INPUT);
Serial.begin(9600);
}

void loop() {
currentMillis = millis();
ledBlink(&currentMillis, &previousMillisLed1, intervalLed1, &ledState1, LED1);
ledBlink(&currentMillis, &previousMillisLed2, intervalLed2, &ledState2, LED2);
ledBlink(&currentMillis, &previousMillisLed3, intervalLed3, &ledState3, LED3);

// if (currentMillisPot1 - previousMillisPot1 >= intervalPot1) {
// previousMillisPot1 = currentMillisPot1;
//
// int potValue = analogRead(POT);
// Serial.println(potValue);
// }

}

void ledBlink(unsigned long *cMillis, unsigned long *pMillis, const long interval, int *ledState, int LED){ //utilizar apuntadores - pasar la direccion de memoria de cada variable
if (*cMillis - *pMillis >= interval) {
*pMillis = *cMillis;

if (*ledState == LOW) {
*ledState = HIGH;
} else {
*ledState = LOW;
}
}
digitalWrite(LED, *ledState);
}

- Instrumentación


Colocaremos todos los LEDs haciendo una línea. Conectamos los ánodos con las resistencias y está conectada a los pines digitales de la placa y los cátodos conectados a la tierra del Arduino.
Cargamos el sketch a la placa y enlazamos el módulo bluetooth desde nuestro smartphone en las configuraciones bluetooth, para que cuando abramos la app de “Serial Bluetooth Terminal” nos reconozca y habilite la opción de vincular entre smartphone y módulo.

Con el potenciómetro, conectamos las tres patas a 3 pistas de la protoboard, no importa en qué dirección esté la perilla. Realizaremos un puente de conexión entre la pata de en medio del potenciómetro al pin A0 del Arduino UNO mediante jumpers. Posteriormente conectaremos las patas extremas a 5v del Arduino y a tierra por el pin GND, como se muestra en la imagen.

DESCARGAS


SIMULA EL MULTITASKING EN ARDUINO CON MILLIS

Imágenes

millisarduino.jpg

APRENDE LO QUE NECESITAS

NUESTROS CURSOS


cursoarduinoyandroid.jpg

Creación de un HMI en Android Studio y Arduino

Nivel: Básico 2 horas y 30 min (146 min.)

Diseña, maqueta y programa un HMI completo en Android Studio vinculado a un Arduino mediante Bluetooth.

cursodispensadorautomatico.jpg

CONSTRUYE un DISPENSADOR AUTOMÁTICO CASERO sin ARDUINO desde CERO

Nivel: Básico 27 minutos

Construye desde cero un dispensador automático casero sin Arduino desde cero, utilizando pura electrónica.

cursocarritorobot4wd.jpg

Creación de carrito robot desde cero usando mando de PS4

Nivel: Básico 2 horas y 19 min (139 min.)

Construye desde cero un carrito robot con arduino manipulado por un control de PS4 y un teléfono Android.