#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#define TRIG_PIN 6
#define ECHO_PIN 7
#define LED_GREEN 8
#define SERVO_PIN 9
const float DIST_UMBRAL = 15.0;
const unsigned long TIEMPO_ABIERTO = 3000;
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo barrera;
bool barreroAbierta = false;
unsigned long tiempoApertura = 0;
float medirDistancia() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duracion = pulseIn(ECHO_PIN, HIGH, 30000);
if (duracion == 0) return 999.0;
return duracion * 0.0343 / 2.0;
}
void abrirBarrera() {
barrera.write(90);
digitalWrite(LED_GREEN, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Acceso Permitido");
barreroAbierta = true;
tiempoApertura = millis();
}
void cerrarBarrera() {
barrera.write(0);
digitalWrite(LED_GREEN, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Esperando");
lcd.setCursor(0, 1);
lcd.print(" Usuario");
barreroAbierta = false;
}
void setup() {
Serial.begin(9600);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_GREEN, OUTPUT);
digitalWrite(LED_GREEN, LOW);
barrera.attach(SERVO_PIN);
barrera.write(0);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Barrera Acceso");
delay(1500);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Esperando");
lcd.setCursor(0, 1);
lcd.print(" Usuario");
}
void loop() {
float distancia = medirDistancia();
Serial.print("Distancia: ");
Serial.print(distancia);
Serial.println(" cm");
if (!barreroAbierta) {
if (distancia < DIST_UMBRAL) {
abrirBarrera();
}
} else {
if (millis() - tiempoApertura >= TIEMPO_ABIERTO) {
cerrarBarrera();
}
}
delay(200);
}