Cómo Ejecutar Tareas Simultáneas con ESP32 para Multitareas y Aplicaciones IoT

La ESP32 es una potente herramienta para proyectos de electrónica e IoT gracias a su capacidad para manejar tareas simultáneas mediante programación multihilo. Este microcontrolador cuenta con un procesador de dos núcleos que permite dividir eficientemente los procesos, logrando que aplicaciones complejas como la sensorización y el envío de datos a la nube funcionen de manera fluida y eficiente.

¿Qué es la Multitarea en la ESP32?

La multitarea consiste en ejecutar varios procesos al mismo tiempo, aprovechando los recursos disponibles. La ESP32 cuenta con un procesador de dos núcleos, llamados PRO_CPU y APP_CPU, que pueden operar de manera independiente o en conjunto. Esto permite asignar tareas específicas a cada núcleo, como sensar datos en uno mientras el otro se encarga de transmitirlos a la nube o ejecutar cálculos complejos.  

Ventajas de la Multitarea en Proyectos IoT 

1. Mayor eficiencia: Los procesos se ejecutan simultáneamente, reduciendo el tiempo de respuesta.  

2. Optimización de recursos: Cada núcleo puede especializarse en tareas específicas, maximizando el rendimiento.  

3. Aplicaciones más complejas: Permite crear sistemas IoT avanzados, como redes de sensores o dispositivos inteligentes.  

Programación de ESP32 Para Ejecutar Multitareas [PARTE 1]


Programar ESP32 Para Ejecutar Multitareas [PARTE 2]


Aquí les comparto también el código utilizado en el ejemplo, recuerda que puedes tenerlo como modelo para que implementes tus proyectos.

//#include <Arduino.h>
//Nucleo principal (1) manejo de todas conexiones 
//y envios de información en la nube

//Nucleo secundario (0) lectura sensores

TaskHandle_t taskCore0, taskLed;
int dataSensor = 0;

void setup() {
  xTaskCreatePinnedToCore(
    readSensor,    //Nombre del loop creado
    "readSensor", //Nombre
    10000,     //Tamaño de la pila
    NULL,     //Parametro casi siempre Nulo
    1,        //Prioridad de la tarea
    &taskCore0,   //Nombre de la tarea
    0);       //Nucleo donde se ejecuta

    xTaskCreatePinnedToCore(
    ledFunction,    //Nombre del loop creado
    "ledFunction", //Nombre
    10000,     //Tamaño de la pila
    NULL,     //Parametro casi siempre Nulo
    1,        //Prioridad de la tarea
    &taskLed,   //Nombre de la tarea
    0);       //Nucleo donde se ejecuta

 pinMode(2,OUTPUT);
 Serial.begin(115200);
}

void loop() {
  Serial.println("***********************");
  Serial.println("Núcleo [loop] = " + String(xPortGetCoreID()));
  Serial.println("***********************");
  delay(500);
}

void readSensor(void *parameter){
  while(true){
    Serial.println("***********************");
    Serial.println("Núcleo [readSensor] = " + String(xPortGetCoreID()));
    
    dataSensor=analogRead(36);
    dataSensor=map(dataSensor,0,4095,0,255);
    Serial.println("dataSensor = " + String(dataSensor));
    Serial.println("***********************");
    delay(500);
  }
  vTaskDelay(10); //Evitar advertencia de watchdog
}

void ledFunction(void *parameter){
  while(true){
    Serial.println("***********************");
    Serial.println("Núcleo [ledFunction] = " + String(xPortGetCoreID()));
    if(dataSensor>=0 && dataSensor<100)
    {
      digitalWrite(2,LOW);
    }
    if(dataSensor>=100)
    {
      digitalWrite(2,HIGH);
    }
    Serial.println("***********************");
    delay(500);
  }
  vTaskDelay(10); //Evitar advertencia de watchdog
}



Preparativos para la Programación Multitarea

1. Herramientas Necesarias 

- Una ESP32 (preferiblemente un modelo DevKit).  

- Software de programación como el Arduino IDE o PlatformIO.  

- Conexión a internet para realizar pruebas con servicios en la nube.  

 

2. Instalar Librerías y Configuración

- Descarga e instala las librerías de la ESP32 en tu entorno de desarrollo.  

- Configura el puerto COM correcto para tu ESP32 y asegúrate de que el controlador esté instalado.  

 

Programación Multitarea en la ESP32 

La multitarea en la ESP32 se puede manejar utilizando el sistema operativo FreeRTOS, que está integrado en su firmware. FreeRTOS permite crear "hilos" o "tareas" que se ejecutan de manera concurrente.  

 

Ejemplo Básico de Multitarea 

#include <Arduino.h> 

// Definimos las tareas para cada núcleo

void Task1(void *pvParameters) {

  for (;;) {

    Serial.println("Tarea 1 ejecutándose en PRO_CPU");

    delay(1000); // Simula una tarea como sensar datos

  }

}

void Task2(void *pvParameters) {

  for (;;) {

    Serial.println("Tarea 2 ejecutándose en APP_CPU");

    delay(1500); // Simula una tarea como enviar datos a la nube

  }

}

 

void setup() {

  Serial.begin(115200);

  // Crear tareas en núcleos diferentes

  xTaskCreatePinnedToCore(Task1, "Tarea 1", 1000, NULL, 1, NULL, 0); // Núcleo 0

  xTaskCreatePinnedToCore(Task2, "Tarea 2", 1000, NULL, 1, NULL, 1); // Núcleo 1

}

void loop() {

  // El loop principal puede quedar vacío o ejecutar tareas de baja prioridad

}

  

Explicación del Código  

1. xTaskCreatePinnedToCore: Esta función asigna una tarea a un núcleo específico.  

2. Núcleo 0 y Núcleo 1: Se utilizan para dividir las tareas entre el PRO_CPU y el APP_CPU.  

3. Simulación: Cada tarea imprime un mensaje para verificar su ejecución en paralelo.  

 

Aplicaciones Avanzadas con IoT  

División de Tareas en Proyectos IoT  

1. Núcleo 0: Sensar datos de sensores como temperatura, humedad o presión.  

2. Núcleo 1: Procesar y enviar los datos a plataformas en la nube como Firebase, AWS o Google Cloud.  

 

Ejemplo con Sensor DHT11 y Envío a Firebase  

Puedes integrar un sensor DHT11 para medir temperatura y humedad, mientras el segundo núcleo transmite los datos a Firebase. Esto mejora la eficiencia y evita retrasos en la transmisión de datos.  

Optimización y Buenas Prácticas  

1. Prioridades: Asigna prioridades a las tareas para garantizar que procesos críticos tengan preferencia.  

2. Uso de memoria: Monitorea el consumo de memoria para evitar desbordamientos.  

3. Pruebas: Realiza pruebas exhaustivas para garantizar que las tareas no interfieran entre sí.  

  

La capacidad multitarea de la ESP32 abre un mundo de posibilidades para proyectos IoT, permitiendo desarrollar aplicaciones complejas y eficientes. Ya sea que estés trabajando en redes de sensores o dispositivos inteligentes, la división de tareas entre los núcleos de la ESP32 te ayudará a optimizar tus proyectos. 

 Como siempre, espero que estos videos e información les sea muy útil, no olvides suscribirte a mi canal en YouTube. Saludos 😎


Alex7 Tutoriales

Tutoriales que en algún momento te pueden ser útiles.... Suscribete!

Publicar un comentario

Artículo Anterior Artículo Siguiente