/*LED_PIN_1
Author: Juan M. Gandarias
Date: 10/11/2023
Description: ejemplo_multicore_problem
*/
#define LED_PIN_1 26 // LED rojo conectado a GPIO26
#define BUTTON_PIN_1 27 // Botón rojo conectado a GPIO27
#define LED_PIN_2 4 // LED verde conectado a GPIO26
#define BUTTON_PIN_2 2 // Botón verde conectado a GPIO27
bool button_1_state = false; // Variable para guardar el estado del botón 1
bool button_2_state = false; // Variable para guardar el estado del botón 2
TaskHandle_t HandleTask1; // Handle de la tarea 1
TaskHandle_t HandleTask2; // Handle de la tarea 2
// Callback de la interrupción del botón rojo
void IRAM_ATTR c0_changeLEDStatus() // Si se ha pulsado el botón -> interrupción
{
if (button_1_state) // Si el estado anterior era encendido
{
digitalWrite(LED_PIN_1, LOW); // Apago el LED rojo
}
else // Si el estado anterior era apagado
{
digitalWrite(LED_PIN_1, HIGH); // Enciendo el LED rojo
}
button_1_state = !button_1_state; // Almaceno en button_1_state que he cambiado de estado
Serial.print("Changing LED with core: ");
Serial.println(xPortGetCoreID());
}
// Callback de la interrupción del botón verde
void IRAM_ATTR c1_changeLEDStatus() // Si se ha pulsado el botón -> interrupción
{
if (button_2_state) // Si el estado anterior era encendido
{
digitalWrite(LED_PIN_2, LOW); // Apago el LED verde
}
else // Si el estado anterior era apagado
{
digitalWrite(LED_PIN_2, HIGH); // Enciendo el LED verde
}
button_2_state = !button_2_state; // Almaceno en button_2_state que he cambiado de estado
Serial.print("Changing LED with core: ");
Serial.println(xPortGetCoreID());
}
void setup()
{
Serial.begin(115200); // Inicialización puerto serie
pinMode(LED_PIN_1, OUTPUT); // Configurar LED rojo como output
pinMode(BUTTON_PIN_1, INPUT_PULLUP); // Configurar botón rojo como input
pinMode(LED_PIN_2, OUTPUT); // Configurar LED verde como output
pinMode(BUTTON_PIN_2, INPUT_PULLUP); // Configurar botón verde como input
// Creamos la Tarea 1: CPU0
xTaskCreatePinnedToCore(
TaskCPU0, // Nombre de la función en la que se implementa la tarea
"CPU0 - rojo", // Descripción de la tarea
2048, // Memoria (en Bytes) asignados a esta tarea
NULL, // Parámetro de entrada de la tarea (no hay ningún parámetro)
5, // Prioridad de la tarea (cuanto más alto, más prioridad)
&HandleTask1, // Handle de la tarea 1
0); // Core donde va a correr la tarea 1
// Creamos la Tarea 2: CPU1
xTaskCreatePinnedToCore(
TaskCPU1, // Nombre de la función en la que se implementa la tarea
"CPU1 - verde", // Descripción de la tarea
2048, // Memoria (en Bytes) asignados a esta tarea
NULL, // Parámetro de entrada de la tarea (no hay ningún parámetro)
0, // Prioridad de la tarea (cuanto más alto, más prioridad)
&HandleTask1, // Handle de la tarea 2
1); // Core donde va a correr la tarea 2
}
void loop()
{
delay(10); // Poner un delay pequeño en el loop para que no caiga el rendimiento en wokwi
}
void TaskCPU0(void *parameter)
{
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_1), c0_changeLEDStatus, RISING); // Configurar la interrupción del botón rojo
while (1)
{
delay(10);
}
}
void TaskCPU1(void *parameter)
{
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_2), c1_changeLEDStatus, RISING); // Configurar la interrupción del botón verde
while (1)
{
delay(10);
}
}