#include <Arduino_FreeRTOS.h>
#include <task.h>
#include <queue.h>
// Definimos los pines de los LEDs
#define LED1 12
#define LED2 13
#define LED3 10
// Prototipos de funciones
void TaskLEDControl(void *pvParameters);
void TaskMessageSender(void *pvParameters);
// Enumeración para los mensajes
enum LedMessages {
LED1_ON,
LED1_OFF,
LED2_ON,
LED2_OFF,
LED3_ON,
LED3_OFF
};
// Creamos la cola para enviar mensajes
QueueHandle_t xQueue;
void setup() {
Serial.begin(9600); // Iniciamos la comunicación serial
while (!Serial); // Esperamos a que esté lista la comunicación
// Inicializamos los LEDs como salidas
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
// Creamos la cola
xQueue = xQueueCreate(5, sizeof(LedMessages));
// Verificamos si la cola se creó correctamente
if (xQueue != NULL) {
// Iniciamos las tareas
xTaskCreate(TaskLEDControl, "LEDControl", 128, NULL, 1, NULL);
xTaskCreate(TaskMessageSender, "MessageSender", 128, NULL, 1, NULL);
}
}
void loop() {
// No hacemos nada en el loop principal
}
void TaskLEDControl(void *pvParameters) {
(void) pvParameters;
LedMessages msg;
while (1) {
// Esperamos a recibir un mensaje de la cola
if (xQueueReceive(xQueue, &msg, portMAX_DELAY) == pdPASS) {
// Controlamos el LED según el mensaje recibido
switch (msg) {
case LED1_ON:
digitalWrite(LED1, HIGH);
Serial.println("LED1 Encendido");
break;
case LED1_OFF:
digitalWrite(LED1, LOW);
Serial.println("LED1 Apagado");
break;
case LED2_ON:
digitalWrite(LED2, HIGH);
Serial.println("LED2 Encendido");
break;
case LED2_OFF:
digitalWrite(LED2, LOW);
Serial.println("LED2 Apagado");
break;
case LED3_ON:
digitalWrite(LED3, HIGH);
Serial.println("LED3 Encendido");
break;
case LED3_OFF:
digitalWrite(LED3, LOW);
Serial.println("LED3 Apagado");
break;
}
}
}
}
void TaskMessageSender(void *pvParameters) {
(void) pvParameters;
while (1) {
// Enviamos mensajes a la cola para controlar los LEDs
LedMessages msg = LED1_ON;
xQueueSend(xQueue, &msg, portMAX_DELAY);
Serial.println("Enviando mensaje: Juan esta siendo atendido");
vTaskDelay(1000);
msg = LED1_OFF;
xQueueSend(xQueue, &msg, portMAX_DELAY);
Serial.println("Enviando mensaje: Juan fue atendido");
vTaskDelay(1000);
msg = LED2_ON;
xQueueSend(xQueue, &msg, portMAX_DELAY);
Serial.println("Enviando mensaje: Maria esta siendo atendida");
vTaskDelay(1000);
msg = LED2_OFF;
xQueueSend(xQueue, &msg, portMAX_DELAY);
Serial.println("Enviando mensaje: Maria fue atendida");
vTaskDelay(1000);
msg = LED3_ON;
xQueueSend(xQueue, &msg, portMAX_DELAY);
Serial.println("Enviando mensaje: Rodolfo esta siendo atendido");
vTaskDelay(1000);
msg = LED3_OFF;
xQueueSend(xQueue, &msg, portMAX_DELAY);
Serial.println("Enviando mensaje: Rodolfo fue atendido");
vTaskDelay(1000);
// Eliminamos la tarea LEDControl para finalizar el programa
vTaskDelete(NULL);
}
}