#include <Arduino_FreeRTOS.h>
int led_rojo = 2; // LED Rojo
int led_verde = 4; // LED Verde
int emergencia = 8; // LED Blanco para emergencia
#define sensor_i A0
#define sensor_s A1
#define p_eme A2
int cantidad_de_lugares = 4;
int emergencia_activada = 0; // 0 inactiva, 1 activa
int a = 0;
void setup() {
Serial.begin(9600);
// Inicialización de LEDs
pinMode(led_rojo, OUTPUT);
pinMode(led_verde, OUTPUT);
pinMode(emergencia, OUTPUT);
pinMode(sensor_i, INPUT_PULLUP);
pinMode(sensor_s, INPUT_PULLUP);
pinMode(p_eme, INPUT);
xTaskCreate(Task_Ing, "Tarea ingreso", 100, NULL, 1, NULL);
xTaskCreate(Task_Sal, "Tarea salida", 100, NULL, 2, NULL);
xTaskCreate(Task_Eme, "Tarea emergencia", 100, NULL, 3, NULL);
xTaskCreate(Task_actualizarLEDs, "Actualizar LEDs", 100, NULL, 1, NULL);
}
// Tarea emergencia
static void Task_Eme(void* pvParameters) {
while (1) {
if (digitalRead(p_eme) == HIGH) {
digitalWrite(led_verde, LOW);
digitalWrite(led_rojo, LOW);
digitalWrite(emergencia, HIGH);
Serial.println("Emergencia activada");
emergencia_activada = 1;
} else {
digitalWrite(emergencia, LOW);
emergencia_activada = 0;
}
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
// Tarea sensor de salida
static void Task_Sal(void* pvParameters) {
while (1) {
if (emergencia_activada == 0) { // Ejecuta solo si no hay emergencia
a++;
if (digitalRead(sensor_s) == LOW && cantidad_de_lugares < 4) {
cantidad_de_lugares++; // Incrementa la cantidad de lugares disponibles
Serial.println("Lugares disponibles: " + String(cantidad_de_lugares));
// Espera a que el sensor de salida se libere
while (digitalRead(sensor_s) == LOW) {
vTaskDelay(50 / portTICK_PERIOD_MS);
}
}
}
vTaskDelay(90 / portTICK_PERIOD_MS); // Espera breve antes de revisar de nuevo
}
}
// Tarea sensor de ingreso
static void Task_Ing(void* pvParameters) {
while (1) {
if (emergencia_activada == 0) {
a++; // Incrementara solo si no hay emergencia
if (digitalRead(sensor_i) == LOW && cantidad_de_lugares > 0) {
cantidad_de_lugares--;
Serial.println("Lugares disponibles: " + String(cantidad_de_lugares));
// Espera a que el sensor de ingreso se libere
while (digitalRead(sensor_i) == LOW) {
vTaskDelay(50 / portTICK_PERIOD_MS);
}
}
}
vTaskDelay(80 / portTICK_PERIOD_MS); // Espera breve antes de revisar de nuevo
}
}
// Tarea para gestionar los LEDs según la disponibilidad de lugares
static void Task_actualizarLEDs(void* pvParameters) {
while (1) {
if (emergencia_activada == 0) { // Ejecuta solo si no hay emergencia
if (cantidad_de_lugares > 0) {
digitalWrite(led_verde, HIGH); // Encender LED verde si hay lugares disponibles
digitalWrite(led_rojo, LOW); // Apagar LED rojo
} else {
digitalWrite(led_verde, LOW); // Apagar LED verde si no hay lugares
digitalWrite(led_rojo, HIGH); // Encender LED rojo
}
}
vTaskDelay(70 / portTICK_PERIOD_MS); // Actualiza el estado de los LEDs cada 200 ms
}
}
void loop() {}