#include <Arduino.h>
#include <ArduinoQueue.h>
#include <Arduino_FreeRTOS.h>
#include <task.h>
// Definir pines de los LEDs
#define LED_PIN_1 4
// Prototipos de las tareas
void taskLed1(void *pvParameters);
void taskLed2(void *pvParameters);
void taskProductor(void *pvParameters);
// Definir la cola
ArduinoQueue<int> cola(10); // Cola de tipo int con capacidad para 10 elementos
void setup() {
Serial.begin(9600);
// Inicializar los pines de los LEDs
pinMode(LED_PIN_1, OUTPUT);
// Crear tarea para controlar LED 1
xTaskCreate(taskLed1, "LED1", 100, NULL, 1, NULL);
// Crear tarea para producir datos para la cola
xTaskCreate(taskProductor, "Productor", 100, NULL, 2, NULL);
// Iniciar el planificador de FreeRTOS
vTaskStartScheduler();
}
void loop() {
// No se hace nada en el loop() porque las tareas se manejan por el planificador de FreeRTOS
}
void taskLed1(void *pvParameters) {
(void) pvParameters;
int ledState;
while(1) {
// Leer valor de la cola
if (cola.isEmpty()) { // Use isEmpty() from ArduinoQueue
// La cola está vacía, esperar un breve tiempo
vTaskDelay(pdMS_TO_TICKS(100));
} else {
ledState = cola.dequeue();
// Cambiar el estado del LED según el valor
digitalWrite(LED_PIN_1, ledState);
Serial.print("LED 1 State: ");
Serial.println(ledState);
}
}
}
void taskProductor(void *pvParameters) {
(void) pvParameters;
while(1) {
// Generar un solo valor aleatorio
int valor = random(0, 2); // 0 o 1
// Agregar valor a la cola
if (cola.enqueue(valor)) {
Serial.print("Valor producido: ");
Serial.println(valor);
} else {
Serial.println("Cola llena, no se pudo agregar valor");
}
// Esperar un breve tiempo antes de generar un nuevo valor
vTaskDelay(pdMS_TO_TICKS(500));
}
}