#include <Arduino_FreeRTOS.h>
#include <task.h>
// Pines de LEDs
const int ledLectura = 11;
const int ledAlarma = 12;
// Pines de botones
const int buttonStart = 2;
const int buttonStop = 3;
// Sensor LDR
const int ldrPin = A3;
// Variables globales
volatile bool lecturaActiva = false;
volatile bool alarmaActiva = false;
volatile int lightLevel = 0;
// Banderas de control desde interrupciones
volatile bool toggleStart = false;
volatile bool toggleStop = false;
// Handle de la tarea de control
TaskHandle_t handleControlSistema;
// ISR de botones
void ISR_StartButton() {
toggleStart = true;
vTaskResume(handleControlSistema);
}
void ISR_StopButton() {
toggleStop = true;
vTaskResume(handleControlSistema);
}
// Tarea: Leer el LDR constantemente
void tareaLeerLDR(void *pvParameters) {
while (1) {
if (lecturaActiva) {
lightLevel = analogRead(ldrPin);
if (lightLevel > 800) {
alarmaActiva = true;
}
}
vTaskDelay(pdMS_TO_TICKS(200));
}
}
// Tarea: Controlar el LED 11 (parpadeo si lectura activa)
void tareaParpadeoLectura(void *pvParameters) {
pinMode(ledLectura, OUTPUT);
while (1) {
if (lecturaActiva) {
digitalWrite(ledLectura, HIGH);
vTaskDelay(pdMS_TO_TICKS(1000));
digitalWrite(ledLectura, LOW);
vTaskDelay(pdMS_TO_TICKS(1000));
} else {
digitalWrite(ledLectura, LOW);
vTaskDelay(pdMS_TO_TICKS(100));
}
}
}
// Tarea: Controlar el LED 12 (alarma)
void tareaParpadeoAlarma(void *pvParameters) {
pinMode(ledAlarma, OUTPUT);
while (1) {
if (alarmaActiva) {
digitalWrite(ledAlarma, HIGH);
vTaskDelay(pdMS_TO_TICKS(100));
digitalWrite(ledAlarma, LOW);
vTaskDelay(pdMS_TO_TICKS(100));
} else {
digitalWrite(ledAlarma, LOW);
vTaskDelay(pdMS_TO_TICKS(200));
}
}
}
// Tarea: Control del sistema (activación/desactivación)
void tareaControlSistema(void *pvParameters) {
while (1) {
// Esperar suspensión
vTaskSuspend(NULL);
// Al reanudarse, revisar las banderas
if (toggleStart) {
lecturaActiva = true;
Serial.println("BOTÓN START PRESIONADO");
toggleStart = false;
}
if (toggleStop) {
lecturaActiva = false;
alarmaActiva = false;
Serial.println("BOTÓN STOP PRESIONADO");
toggleStop = false;
}
vTaskDelay(pdMS_TO_TICKS(200));
}
}
// Tarea: Enviar lectura Serial
void tareaEnviarSerial(void *pvParameters) {
while (1) {
if (lecturaActiva) {
Serial.print("Luz (LDR): ");
Serial.println(lightLevel);
}
vTaskDelay(pdMS_TO_TICKS(3000));
}
}
// Tarea: Recepción de comandos desde Serial
void tareaRecepcionSerial(void *pvParameters) {
String comando = "";
while (1) {
while (Serial.available() > 0) {
char c = Serial.read();
if (c == '\n') {
comando.trim();
if (comando.equalsIgnoreCase("START")) {
lecturaActiva = true;
Serial.println("Comando START recibido desde la aplicación.");
} else if (comando.equalsIgnoreCase("STOP")) {
lecturaActiva = false;
alarmaActiva = false;
Serial.println("Comando STOP recibido desde la aplicación.");
}
comando = "";
} else {
comando += c;
}
}
vTaskDelay(pdMS_TO_TICKS(100));
}
}
void setup() {
Serial.begin(9600);
// Configurar pines
pinMode(buttonStart, INPUT);
pinMode(buttonStop, INPUT);
pinMode(ledLectura, OUTPUT);
pinMode(ledAlarma, OUTPUT);
// Asociar interrupciones
attachInterrupt(digitalPinToInterrupt(buttonStart), ISR_StartButton, FALLING);
attachInterrupt(digitalPinToInterrupt(buttonStop), ISR_StopButton, FALLING);
// Crear tareas
xTaskCreate(tareaLeerLDR, "LeerLDR", 64, NULL, 1, NULL);
xTaskCreate(tareaParpadeoLectura, "LedLectura", 64, NULL, 1, NULL);
xTaskCreate(tareaParpadeoAlarma, "LedAlarma", 64, NULL, 1, NULL);
xTaskCreate(tareaControlSistema, "ControlSistema", 64, NULL, 2, &handleControlSistema);
xTaskCreate(tareaEnviarSerial, "EnviarSerial", 128, NULL, 3, NULL);
xTaskCreate(tareaRecepcionSerial, "RecibirSerial", 128, NULL, 2, NULL);
// Iniciar el scheduler
vTaskStartScheduler();
}
void loop() {
// Nunca se ejecuta con FreeRTOS
}