Tutorial del Internet de las Cosas y Bluetooth con el ESP32
Juan Antonio Villalpando
Volver al índice del tutorial
____________________________
232.- Wemos D1 R32 ESP32. Doble núcleo. Parpadeo de tres LED con distintos periodos.
- El ESP32 tiene doble núcleo. Sin embargo cuando trabaja con el IDE de Arduino solo utiliza un núcleo.

________________________________
1.- Veamos con qué núcleo funciona el ESP32 con el IDE de Arduino.
- Cargamos este programa y observeremos que tanto la parte de setup como la parte de loop está trabajando con el Núcleo 1
|
void setup() {
Serial.println();
Serial.begin(115200);
Serial.print("Núcleo en el setup ... ");
Serial.println(xPortGetCoreID());
}
void loop() {
Serial.print("Núcleo en el loop ... ");
Serial.println(xPortGetCoreID());
}
|
________________________________
2.- Tareas. Dos núcleos. Parpadeo de dos LED a distinta velocidad.
Vamos a seguir este tutorial: https://randomnerdtutorials.com/esp32-dual-core-arduino-ide/
- Ponemos un LED2 en el terminal IO2 y otro LED14 en el IO14.
- El LED2 parpadeará con una secuencia de 1000 ms y el LED14 con 700 ms.
- El LED2 funcionará con el Núcleo 0 y el LED14 con el Núcleo 1.
- Esto se realizará estableciendo tareas (Task)
|
TaskHandle_t Task1;
TaskHandle_t Task2;
// LED pins
const int led2 = 2;
const int led14 = 14;
void setup() {
Serial.begin(115200);
pinMode(led2, OUTPUT);
pinMode(led14, OUTPUT);
//create a task that will be executed in the Task1code() function, with priority 1 and executed on core 0
xTaskCreatePinnedToCore(
Task1code, /* Task function. */
"Task1", /* name of task. */
10000, /* Stack size of task */
NULL, /* parameter of the task */
1, /* priority of the task */
&Task1, /* Task handle to keep track of created task */
0); /* Núcleo 0 */
delay(500);
//create a task that will be executed in the Task2code() function, with priority 1 and executed on core 1
xTaskCreatePinnedToCore(
Task2code, /* Task function. */
"Task2", /* name of task. */
10000, /* Stack size of task */
NULL, /* parameter of the task */
1, /* priority of the task */
&Task2, /* Task handle to keep track of created task */
1); /* Núcleo 1 */
delay(500);
}
//Task1code: blinks an LED every 1000 ms
void Task1code( void * pvParameters ){
Serial.print("Task1 running on core ");
Serial.println(xPortGetCoreID());
for(;;){
digitalWrite(led2, HIGH);
delay(1000);
digitalWrite(led2, LOW);
delay(1000);
}
}
//Task2code: blinks an LED every 700 ms
void Task2code( void * pvParameters ){
Serial.print("Task2 running on core ");
Serial.println(xPortGetCoreID());
for(;;){
digitalWrite(led14, HIGH);
delay(700);
digitalWrite(led14, LOW);
delay(700);
}
}
void loop() {
// Esto trabaja en el Núcleo 1
}
|
________________________________
- Comentarios.
- Se crean dos tareas. Se establece en qué Núcleo trabajará la tarea, en el Núcleo 0 o el 1.
- El código se pone dentro de un for(;;) infinito que actúa como un loop.
- Se podría hacer que el Núcleo 0 trabajara con un sensor, por ejemplo y el Núcleo 1 se encargara de presenta su valor.
________________________________
3.- Aquí está mejor explicado. Tres LED parpadean en distintos periodos.
- Ponemos un LED2, otro en el terminal 12, LED12 y otro en el terminal 14, LED14.
- Cada uno parpadeará a una frecuencia distinta: 500, 1000 y 1500.
- Observa que el loop() principal queda libre, ahí podemos poner más código.
- Este programa funciona como si tuviera 4 loops distintos, ya que las tareas actuan como tres loops.
|
// Juan Antonio Villalpando
// Tres tareas. KIO4.COM
TaskHandle_t Tarea1;
TaskHandle_t Tarea2;
TaskHandle_t Tarea3;
const int led2 = 2;
const int led12 = 12;
const int led14 = 14;
void setup() {
Serial.begin(115200);
pinMode(led2, OUTPUT);
pinMode(led12, OUTPUT);
pinMode(led14, OUTPUT);
xTaskCreatePinnedToCore(Ejecuta_Tarea1,"Tarea1",10000,NULL,1,&Tarea1,1);
xTaskCreatePinnedToCore(Ejecuta_Tarea2,"Tarea2",10000,NULL,1,&Tarea2,1);
xTaskCreatePinnedToCore(Ejecuta_Tarea3,"Tarea3",10000,NULL,1,&Tarea3,1);
}
void Ejecuta_Tarea1( void * pvParameters ){
for(;;){
digitalWrite(led2, HIGH);
delay(500);
digitalWrite(led2, LOW);
delay(500);
}
}
void Ejecuta_Tarea2( void * pvParameters ){
for(;;){
digitalWrite(led12, HIGH);
delay(1000);
digitalWrite(led12, LOW);
delay(1000);
}
}
void Ejecuta_Tarea3( void * pvParameters ){
for(;;){
digitalWrite(led14, HIGH);
delay(1500);
digitalWrite(led14, LOW);
delay(1500);
}
}
void loop() {
// Aquí podemos poner más códigos.
}
|
_______________________________
|