// Incluir la biblioteca de FreeRTOS para Arduino
#include <Arduino_FreeRTOS.h>
// Incluir la biblioteca de colas
#include <queue.h>
// Incluir la biblioteca para controlar pantallas LCD
#include <LiquidCrystal.h>
// Declarar una cola
QueueHandle_t queue_1;
// Inicializar el objeto de la pantalla LCD
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
void setup()
{
// Iniciar la comunicación serial
Serial.begin(9600);
// Inicializar la pantalla LCD
lcd.begin(16, 2);
// Crear la cola con capacidad para 4 enteros
queue_1 = xQueueCreate(4, sizeof(int));
// Verificar si la cola se creó correctamente
if (queue_1 == NULL)
{
Serial.println("Queue can not be created");
}
// Crear la tarea de visualización
xTaskCreate(
TaskDisplay, // Función de la tarea de visualización
"Display_task", // Nombre de la tarea de visualización
128, // Tamaño de la pila de la tarea
NULL, // Parámetro de la tarea
1, // Prioridad de la tarea
NULL // Manejador de la tarea
);
// Crear la tarea de lectura del sensor LDR
xTaskCreate(
TaskLDR, // Función de la tarea del sensor LDR
"LDR_task", // Nombre de la tarea del sensor LDR
128, // Tamaño de la pila de la tarea
NULL, // Parámetro de la tarea
1, // Prioridad de la tarea
NULL // Manejador de la tarea
);
// Iniciar el planificador de FreeRTOS
vTaskStartScheduler();
}
// Función de la tarea del sensor LDR
void TaskLDR(void * pvParameters) {
int current_intensity;
while(1) {
// Leer la intensidad actual del sensor LDR
Serial.println("Tarea1");
current_intensity = analogRead(A0);
Serial.println(current_intensity);
// Enviar la intensidad a la cola
xQueueSend(queue_1, ¤t_intensity, portMAX_DELAY);
// Esperar 1 segundo antes de leer de nuevo el sensor
vTaskDelay( 1000 / portTICK_PERIOD_MS );
}
}
// Función de la tarea de visualización en la pantalla LCD
void TaskDisplay(void * pvParameters) {
int intensity = 0;
while(1) {
// Leer la intensidad de la cola
Serial.println("Tarea2");
if (xQueueReceive(queue_1, &intensity, portMAX_DELAY) == pdPASS) {
// Limpiar la pantalla LCD y mostrar la intensidad
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Intensidad:");
lcd.setCursor(11, 0);
lcd.print(intensity);
}
}
}
// No es necesario el loop ya que estamos utilizando FreeRTOS
void loop()
{
// No hay código aquí
}