#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 = 8; // Inicialmente 8 lugares disponibles
int estado_barrera = LOW;
int alarma_activada = 0;
void setup() {
Serial.begin(9600);
pinMode(led_verde, OUTPUT);
pinMode(led_rojo, OUTPUT);
pinMode(led_barrera, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(sensor_de_ingreso, INPUT_PULLUP);
pinMode(sensor_de_salida, INPUT_PULLUP);
pinMode(alarma, INPUT_PULLUP);
/*
Create 3 tasks with labels 'Task_1', 'Task_2' and 'Task_3' and
assign the priority as 1, 2 and 3 respectively.
*/
//'Neutral_Task' - the task-free function!
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);
}
// Task 1 sensor de ingreso
static void Task_1(void* pvParameters) {
while (1) {
if (alarma_activada == 0) {
if (digitalRead(sensor_de_ingreso) == LOW && cantidad_de_lugares > 0) {
cantidad_de_lugares--;
Serial.println("Vehículo ingresado, lugares disponibles: " + String(cantidad_de_lugares));
digitalWrite(led_barrera, HIGH);
delay(1000);
digitalWrite(led_barrera, LOW);
if (cantidad_de_lugares > 0) {
digitalWrite(led_verde, HIGH);
digitalWrite(led_rojo, LOW);
} else {
digitalWrite(led_verde, LOW);
digitalWrite(led_rojo, HIGH);
}
}
}
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
// Task 2 - sensor de salida
static void Task_2(void* pvParameters) {
while (1) {
if (alarma_activada == 0) {
if (digitalRead(sensor_de_salida) == LOW && cantidad_de_lugares < 8) {
cantidad_de_lugares++;
Serial.println("Vehículo salió, lugares disponibles: " + String(cantidad_de_lugares));
digitalWrite(led_barrera, HIGH);
delay(1000);
digitalWrite(led_barrera, LOW);
if (cantidad_de_lugares > 0) {
digitalWrite(led_verde, HIGH);
digitalWrite(led_rojo, LOW);
} else {
digitalWrite(led_verde, LOW);
digitalWrite(led_rojo, HIGH);
}
}
}
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
// Task 3 - alarma
static void Task_3(void* pvParameters) {
while (1) {
if (digitalRead(alarma) == LOW) {
alarma_activada = 1;
tone(buzzer, 400);
digitalWrite(led_verde, LOW);
digitalWrite(led_barrera, LOW);
digitalWrite(led_rojo, HIGH);
Serial.println("Alarma activada");
vTaskDelay(8000 / portTICK_PERIOD_MS);
noTone(buzzer);
alarma_activada = 0;
Serial.println("Alarma desactivada");
}
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
void loop() {
//We don't need to use "loop" function here!
}