#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// RFID
#define RST_PIN 9
#define SS_PIN 53
MFRC522 mfrc522(SS_PIN, RST_PIN);
byte tag1[4] = {0xA4, 0x98, 0x39, 0xA5};
byte tag2[4] = {0x70, 0x78, 0x70, 0xA4};
byte tagActual[4];
// LCD
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Servo
Servo Puerta;
// LEDs
#define ledVerde 4
#define ledRojo 5
// Buzzer
#define Buzzer 12
// Botón físico
#define BotonPuerta A0
// TECLADO
char password1[] = "1201";
char password2[] = "2805";
char clave[4];
int conteo = 0;
const byte FILAS = 4;
const byte COLUMNAS = 4;
char mapaTeclas[FILAS][COLUMNAS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte pinesFilas[FILAS] = {7, 6, 5, 4};
byte pinesColumnas[COLUMNAS] = {2, A1, A2, A3};
Keypad teclapad = Keypad(makeKeymap(mapaTeclas), pinesFilas, pinesColumnas, FILAS, COLUMNAS);
// --- SETUP ---
void setup() {
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(3,0);
lcd.print("Sistema Activo");
Puerta.attach(3);
Puerta.write(90); // posición cerrada
pinMode(ledVerde, OUTPUT);
pinMode(ledRojo, OUTPUT);
pinMode(Buzzer, OUTPUT);
pinMode(BotonPuerta, INPUT_PULLUP);
digitalWrite(ledVerde, LOW);
digitalWrite(ledRojo, LOW);
delay(2000);
Inicio();
}
// --- LOOP ---
void loop() {
// BOTÓN ABRE
if (digitalRead(BotonPuerta) == LOW) {
AbrirPuerta();
}
// RFID
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
for (byte i = 0; i < 4; i++) {
tagActual[i] = mfrc522.uid.uidByte[i];
}
if (compararArray(tagActual, tag1) || compararArray(tagActual, tag2)) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Tarjeta Aceptada");
AbrirPuerta();
} else {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Tarjeta Denegada");
bip(200); bip(200);
digitalWrite(ledRojo, HIGH);
delay(2000);
digitalWrite(ledRojo, LOW);
Inicio();
}
mfrc522.PICC_HaltA();
}
// TECLADO
char tecla = teclapad.getKey();
if (tecla != NO_KEY) {
clave[conteo] = tecla