#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// Pines RFID
#define RST_PIN 9
#define SS_PIN 53
// LEDs y otros
#define ledVerde 12
#define ledRojo 13
#define buzzer 11
// Objetos
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal_I2C lcd(0x27, 20, 4);
Servo puerta;
// RFID tags autorizados
byte tag1[4] = {0xA4, 0x98, 0x39, 0xA5};
byte tag2[4] = {0x70, 0x78, 0x70, 0xA4};
byte tagActual[4];
// Claves para Keypad
char clave[4];
char password1[] = "1201";
char password2[] = "2805";
int conteo = 0;
// Keypad
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] = {37, 35, 33, 31};
byte pinesColumnas[COLUMNAS] = {41, 43, 45, 47};
Keypad teclado = 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("BIENVENIDOS A MADRE LINDA");
delay(3000);
lcd.clear();
lcd.print("Bienvenidos");
delay(3000);
puerta.attach(46);
puerta.write(0); // Cerrado
pinMode(ledVerde, OUTPUT);
pinMode(ledRojo, OUTPUT);
pinMode(buzzer, OUTPUT);
digitalWrite(ledVerde, LOW);
digitalWrite(ledRojo, HIGH);
Inicio();
}
// LOOP
void loop() {
AbrirPuerta();
// Teclado
char tecla = teclado.getKey();
if (tecla != NO_KEY) {
clave[conteo] = tecla;
lcd.setCursor(7 + conteo, 1);
lcd.print("*");
conteo++;
if (conteo == 4) {
if (compararClave(clave, password1) || compararClave(clave, password2)) {
bip(100);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Passw correcta");
AbrirPuerta();
} else {
bip(150); bip(150);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Plassw incorrecta");
delay(2000);
}
conteo = 0;
Inicio();
}
}
// RFID
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
for (int i = 0; i < 4; i++) {
tagActual[i] = mfrc522.uid.uidByte[i];
}
if (compararTag(tagActual, tag1) || compararTag(tagActual, tag2)) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tarjeta aceptada");
bip(100);
AbrirPuerta();
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tarjeta denegada");
bip(150); bip(150);
digitalWrite(ledRojo, HIGH); digitalWrite(ledVerde, LOW);
delay(2000);
digitalWrite(ledRojo, LOW);
}
mfrc522.PICC_HaltA();
Inicio();
}
}
// FUNCIONES
void bip(int duracion) {
digitalWrite(buzzer, HIGH);
delay(duracion);
digitalWrite(buzzer, LOW);
delay(duracion);
}
void AbrirPuerta() {
digitalWrite(ledVerde, HIGH);
digitalWrite(ledRojo, LOW);
puerta.write(0);
lcd.setCursor(0, 1);
lcd.print("Puerta abierta");
delay(5000);
puerta.write(90);
lcd.setCursor(0, 1);
lcd.print("Puerta cerrada ");
digitalWrite(ledVerde, LOW);
digitalWrite(ledRojo, HIGH);
delay(1000);
Inicio();
}
void Inicio() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Escanee o clave:");
lcd.setCursor(0, 1);
//lcd.print("Password: ");
}
bool compararTag(byte a[], byte b[]) {
for (int i = 0; i < 4; i++) {
if (a[i] != b[i]) return false;
}
return true;
}
bool compararClave(char a[], char b[]) {
for (int i = 0; i < 4; i++) {
if (a[i] != b[i]) return false;
}
return true;
}