#include <Arduino_FreeRTOS.h>
#define buzzer 4
#define led_verde 3
#define led_rojo 2
#define sensor_de_ingreso A3
#define sensor_de_salida A2
#define alarma A4
#define led_barrera 5
int cantidad_de_lugares = 3; // Inicialmente 3 lugares disponibles
int estado_barrera = LOW;
void setup() {
Serial.begin(9600);
pinMode(led_verde, OUTPUT);
pinMode(led_rojo, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(sensor_de_ingreso, INPUT_PULLUP);
pinMode(sensor_de_salida, INPUT_PULLUP);
pinMode(alarma, INPUT_PULLUP);
pinMode(led_barrera, OUTPUT); // Barrera LED violeta como salida
// Creación de las tareas
xTaskCreate(Task_1, "sensor_de_ingreso", 100, NULL, 2, NULL);
xTaskCreate(Task_2, "sensor_salida", 100, NULL, 2, NULL);
xTaskCreate(Task_3, "alarma", 100, NULL, 3, NULL);
}
static void Task_1(void* pvParameters) {
while (1) {
// Si se presiona el pulsador de ingreso y hay lugares disponibles
if (digitalRead(sensor_de_ingreso) == LOW && cantidad_de_lugares > 0) {
cantidad_de_lugares--; // Reduce el contador de lugares disponibles
Serial.println("Vehículo ingresado, lugares disponibles: " + String(cantidad_de_lugares));
// Abrir la barrera (encender LED violeta)
digitalWrite(led_barrera, HIGH);
delay(1000); // Simula que la barrera está abierta por un tiempo
digitalWrite(led_barrera, LOW); // Cierra la barrera después de 1 segundo
// Control de LEDs de disponibilidad
if (cantidad_de_lugares > 0) {
digitalWrite(led_verde, HIGH); // Hay lugares disponibles
digitalWrite(led_rojo, LOW); // No se enciende el LED rojo
} else {
digitalWrite(led_verde, LOW); // No hay lugares disponibles
digitalWrite(led_rojo, HIGH); // Se enciende el LED rojo
}
}
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
static void Task_2(void* pvParameters) {
while (1) {
// Si se presiona el pulsador de salida y hay menos de 3 lugares ocupados
if (digitalRead(sensor_de_salida) == LOW && cantidad_de_lugares < 3) {
cantidad_de_lugares++; // Aumenta el contador de lugares disponibles
Serial.println("Vehículo salió, lugares disponibles: " + String(cantidad_de_lugares));
// Abrir la barrera (encender LED violeta)
digitalWrite(led_barrera, HIGH);
delay(1000); // Simula que la barrera está abierta por un tiempo
digitalWrite(led_barrera, LOW); // Cierra la barrera después de 1 segundo
// Control de LEDs de disponibilidad
if (cantidad_de_lugares > 0) {
digitalWrite(led_verde, HIGH); // Hay lugares disponibles
digitalWrite(led_rojo, LOW); // No se enciende el LED rojo
} else {
digitalWrite(led_verde, LOW); // No hay lugares disponibles
digitalWrite(led_rojo, HIGH); // Se enciende el LED rojo
}
}
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
static void Task_3(void* pvParameters) {
while (1) {
// Si se presiona el pulsador de la alarma
if (digitalRead(alarma) == LOW) {
// Activar la alarma (buzzer) y apagar LEDs menos el rojo
tone(buzzer, 400, 10000 / portTICK_PERIOD_MS);
digitalWrite(led_verde, LOW);
digitalWrite(led_barrera, LOW); // Barrera cerrada durante la alarma
digitalWrite(led_rojo, HIGH); // El LED rojo sigue encendido durante la alarma
Serial.println("Alarma activada");
// Esperar 10 segundos (interrupción)
vTaskDelay(10000 / portTICK_PERIOD_MS);
// Apagar la alarma
noTone(buzzer);
}
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
void loop() {
// No se necesita usar loop con FreeRTOS
}