|     Inicio    |   |         |  |   FOROS      |  |      |      
   Elastix - VoIP B4A (Basic4Android) App inventor 2 PHP - MySQL
  Estación meteorológica B4J (Basic4Java) ADB Shell - Android Arduino
  AutoIt (Programación) Visual Basic Script (VBS) FireBase (BD autoactualizable) NodeMCU como Arduino
  Teleco - Emisora de A.M. Visual Basic Cosas de Windows Webs interesantes
Translate:
Búsqueda en este sitio:


.

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

nucleo.ino

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)

doble_nucleo.ino

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.

 

Cuatro_loops.ino

// 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.
}

_______________________________

- Mi correo:
juana1991@yahoo.com
- KIO4.COM - Política de cookies. Textos e imágenes propiedad del autor:
© Juan A. Villalpando
No se permite la copia de información ni imágenes.
Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación y realizan análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. Acepto    Más información