#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_ROWS 2
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_ROWS);
// Pines (ajusta si usaste otros)
const int pinServo = 9; // D9: señal del servo
const int pinLed = 8; // D8: LED
const int minPulseWidth = 500;
const int maxPulseWidth = 2400;
bool puertaAbierta = false;
// -------- Keypad 4x4 --------
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
// Usa los mismos pines que ya cableaste en Wokwi
byte rowPins[ROWS] = { /*R1*/2, /*R2*/3, /*R3*/4, /*R4*/5 };
byte colPins[COLS] = { /*C1*/6, /*C2*/7, /*C3*/10, /*C4*/11 };
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// contraseña fija
const String password = "123";
String input = "";
void setup() {
Serial.begin(115200);
pinMode(pinServo, OUTPUT);
pinMode(pinLed, OUTPUT);
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Puerta cerrada");
moverServo(0);
digitalWrite(pinLed, LOW);
}
void loop() {
char key = keypad.getKey();
if (key != NO_KEY) {
Serial.println(key);
if (key == '*') { // borrar entrada
input = "";
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Clave:");
lcd.setCursor(0,1);
lcd.print("de new");
delay(500);
lcd.clear();
mostrarEstado();
}
else if (key == '#') { // confirmar
if (input == password) {
puertaAbierta = true;
moverServo(90);
digitalWrite(pinLed, HIGH);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Puerta abierta");
}
else if (input == "0000") { // ¡NUEVA! Contraseña para cerrar
puertaAbierta = false;
moverServo(0);
digitalWrite(pinLed, LOW);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Puerta cerrada");
}
else {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("incorrecto");
delay(1000);
lcd.clear();
mostrarEstado();
}
input = "";
}
else { // agregar dígito
if (input.length() < 4) {
input += key;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Contraseña:");
lcd.setCursor(0,1);
for (int i = 0; i < input.length(); i++) lcd.print('*');
}
}
}
}
// muestra "Puerta abierta/cerrada"
void mostrarEstado() {
lcd.setCursor(0,0);
if (puertaAbierta) lcd.print("Puerta abierta");
else lcd.print("Puerta cerrada");
}
// PWM manual para el servo
void moverServo(int angulo) {
int pulseWidth = map(angulo, 0, 180, minPulseWidth, maxPulseWidth);
for (int i = 0; i < 50; i++) {
digitalWrite(pinServo, HIGH);
delayMicroseconds(pulseWidth);
digitalWrite(pinServo, LOW);
delay(20 - pulseWidth / 1000);
}
}