#include <LiquidCrystal_I2C.h>
// Definición de pines
const byte pin_lv = 5;
const byte pin_lr = 4;
const byte pin_entrada = 2;
const byte pin_salida = 3;
const byte pin_entrada_externa = 6;
const byte pin_salida_externa = 7;
// Variables globales
volatile int espacios_vacios = 60;
volatile bool entrada_activada = false;
volatile bool salida_activada = false;
// Inicialización del objeto LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
// Configuración de pines
pinMode(pin_entrada, INPUT_PULLUP);
pinMode(pin_salida, INPUT_PULLUP);
pinMode(pin_entrada_externa, INPUT_PULLUP);
pinMode(pin_salida_externa, INPUT_PULLUP);
pinMode(pin_lv, OUTPUT);
pinMode(pin_lr, OUTPUT);
digitalWrite(pin_lv, HIGH);
digitalWrite(pin_lr, HIGH);
// Configuración de interrupciones
attachInterrupt(digitalPinToInterrupt(pin_entrada), entradaInterrupt, RISING);
attachInterrupt(digitalPinToInterrupt(pin_salida), salidaInterrupt, RISING);
// Inicialización del puerto serial y del LCD
Serial.begin(9600);
lcd.init();
lcd.backlight();
}
void loop() {
actualizarLCD();
revisarEntrada();
revisarSalida();
if(espacios_vacios <= 60){
digitalWrite(pin_lv, HIGH);
digitalWrite(pin_lr, LOW);
}
if (espacios_vacios == 0) {
digitalWrite(pin_lv, LOW);
digitalWrite(pin_lr, HIGH);
}
delay(1000);
}
void entradaInterrupt() {
if (entrada_activada && espacios_vacios > 0) {
espacios_vacios--;
entrada_activada = false;
}
}
void salidaInterrupt() {
if (salida_activada && espacios_vacios < 60) {
espacios_vacios++;
salida_activada = false;
}
}
void revisarEntrada() {
if (digitalRead(pin_entrada_externa) == HIGH) {
entrada_activada = true;
}
}
void revisarSalida() {
if (digitalRead(pin_salida_externa) == HIGH) {
salida_activada = true;
}
}
void actualizarLCD() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Espacios: ");
lcd.print(espacios_vacios, 1);
}