#include <LiquidCrystal_I2C.h>
#define DIRECCION_LCD 0x27
#define ANCHO_LCD 16
#define ALTO_LCD 2
LiquidCrystal_I2C pantalla(DIRECCION_LCD, ANCHO_LCD, ALTO_LCD);
const int SERVO_PIN = 9;
const int LED_STATUS = 8;
const int BTN_INPUT = 7;
const int PULSO_MIN = 500;
const int PULSO_MAX = 2400;
String password = "1234";
String input = "";
bool accesoPermitido = false;
bool estaAbierta = false;
void setup() {
Serial.begin(115200);
pinMode(SERVO_PIN, OUTPUT);
pinMode(LED_STATUS, OUTPUT);
pinMode(BTN_INPUT, INPUT_PULLUP);
pantalla.init();
pantalla.backlight();
pantalla.clear();
pantalla.setCursor(0,0);
pantalla.print("Ingrese clave");
pantalla.setCursor(0,1);
pantalla.print("Serial...");
accionarMecanismo(0);
digitalWrite(LED_STATUS, LOW);
}
void loop() {
// Leer contraseña desde serial
if (!accesoPermitido) {
while (Serial.available()) {
char c = Serial.read();
if (c == '\n') {
if (input == password) {
accesoPermitido = true;
pantalla.clear();
pantalla.setCursor(0,0);
pantalla.print("Clave correcta");
delay(1500);
pantalla.clear();
pantalla.print("Puerta lista");
} else {
pantalla.clear();
pantalla.print("Clave incorrecta");
delay(2000);
pantalla.clear();
pantalla.print("Ingrese clave");
}
input = "";
}
else {
input += c;
}
}
return;
}
// Control de puerta
if (digitalRead(BTN_INPUT) == LOW) {
delay(50);
if (digitalRead(BTN_INPUT) == LOW) {
estaAbierta = !estaAbierta;
pantalla.clear();
pantalla.setCursor(0,0);
if (estaAbierta) {
accionarMecanismo(90);
digitalWrite(LED_STATUS, HIGH);
pantalla.print("Puerta: ABIERTA");
}
else {
accionarMecanismo(0);
digitalWrite(LED_STATUS, LOW);
pantalla.print("Puerta: CERRADA");
}
while (digitalRead(BTN_INPUT) == LOW) {
delay(10);
}
}
}
}
void accionarMecanismo(int grados) {
int anchoPulso = map(grados, 0, 180, PULSO_MIN, PULSO_MAX);
for (int ciclo = 0; ciclo < 50; ciclo++) {
digitalWrite(SERVO_PIN, HIGH);
delayMicroseconds(anchoPulso);
digitalWrite(SERVO_PIN, LOW);
delay(20 - (anchoPulso / 1000));
}
}