Arduino: Ejecutando todo al mismo tiempo

  1. Sin Delay

Para muchos de los que inician en el mundo de Arduino, quieren que su arduino ejecute varias tareas al mismo tiempo, y la pregunta es como si tenemos nuestro código bien!, pero seguramente este tiene varios delay().

Ningún microcontrolador puede hacer varias tareas al mismo pero el no usar delay() hace ver que está ejecutando todo al mismo tiempo ya que no hay ningún retardo ni interrupciones en el codigo y la velocidad de ejecución es realmente alta lo cual nos da a persivir que todo lo hace al mismo tiempo.

Si!, el secreto esta en no usar el delay,¿Pero entonces como hacemos un retardo o como hacemos para que encienda y se apague un led y adicionalmente suene un buzzer o se ejecute cualquier otra cosa?, llevando o manteniendo el control mediante variables que almacenan el tiempo de ejecución, y verificando mediante “if” si se ha logrado o ya ha pasado el tiempo requerido para ejecutar alguna acción. Se lee algo enredado pero haciendo el código es mucho mas fácil. por eso vamos a explicar el ejemplo que tiene nuestro Arduino IDE, asi que vamos abrir el IDE y abrir el siguiente ejemplo:

archivo>ejemplos>digital>BlinkWithoutDelay

Este código encenderá y apagara un led sin usar la función delay(), ya que esta función nos genera que un retardo en el cual nuestro código se detendrá y no realizara ninguna otra función hasta que este retardo se acabe, como si empezaras a descargar un juego que pesa 1,5GB y no te movieras del frente de tu computadora hasta que se descargue sin realizar ninguna otra tarea.

depende de la necesidad de nuestro proyectos sera viable usar o no delays.

BLINK WITH OUT DELAY:

//se declara el pin 13 para el LED
const int ledPin =  13;     

// Variable que cambiara el estado del LED
int ledState = LOW;            

// la variable que tendra el dato del tiempo de millis debe ser "unsigned long" 
// ya que se incrementara rapidamente
unsigned long previousMillis = 0;  

// variable que tendra el tiempo de encendido y apagado del LED en milisegundos
const long interval = 1000;          

void setup() {
  // se configura el pin 13 como salida
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // se inicia declarando una variable con el valor que nos da la función millis()
  // millis(), no devuelve el tiempo de ejecución que ha transcurrido desde que se inicio
  // la ejecución del codigo
  unsigned long currentMillis = millis();

  // Este if tiene el secreto, pues verificara si se ha cumplido ya el tiempo de interval que
  // son 1000 milisegundos
  // currentMillis empezara a incrementarse hasta que la diferencia entre currentMillis y 
  // previousMillis sea mayor a interval
  // tan pronto esto suceda el valor se actualiza previousMillis con el valor actual de millis()
  // dado por la variable currentMillis
  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // seguido cambiara el estado del LED a LOW o HIGH
    // y se volvera a ejecutar nuevamente hasta que la diferencia entre currentMillis y 
    // previosMillis sea mayor a interval nuevamente.
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // se escribe en el pin digital el estado del led
    digitalWrite(ledPin, ledState);
  }// finaliza el if de verificación de duración if (currentMillis - previousMillis >= interval)
}

Entonces el secreto esta en ir validando el tiempo a medida que se ejecutan varias tareas, debemos utilizar variables de control y varias variables que nos mantenga cierto tiempo almacenado para poder ejecutar varias tareas. por ejemplo:

 
// En esta linea en el IF la variable de control acT1, permitira a la variable de tiempo t1 a 
//comparar con millis(), ya que al ser verdadera le asigna el valor de millis() a t1 y
//luego cambia el estado de la variable de control acT1 a false para que no se actualice, 
// hasta que se cumpla e tiempo del movimiento del servo.

 if(acT1==true){t1=millis();acT1=false;}
 
// se mueve el servo
// la variable de control volverá hacer true hasta que pasen 40 milisegundos, que es el tiempo
// que girara el servo
 if(millis()-t1>=40){
 if(serL==true){gr+=18;}
 if(serR==true){gr-=18;}
 servo1.write(gr);
 acT1=true;
}

//este es un trozo del código del robot evita obstáculos

les dejare en los siguientes links códigos donde se ejecutan varias tareas y se usan varias variables de control y de tiempo para que traten de entenderlo.

Códigos:

Robot Evita Obstaculos combina delays y ejecuta tareas sin delays, código directo descargar AQUI!.

Robot Animador, todo su código es sin delays, y ejecuta tareas como escribir en una matrix led 8×8, mueve 2 servo motores, enciende varios leds y activa un buzzer, código directo descargar AQUI!.

Cualquier duda no olviden en dejarme su comentario no dudare en contestarles

No olviden seguirme en las redes sociales y suscribirse a mi canal de youtube

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *