// 5to Sistemas de Telecomunicaciones A - Grupos 1 y 2
//Proyecto: Control de Acceso para residencial (2 casas)
//Integrantes:
// Abril Corporan Mateo
// Charlotte J. Baez Estrella
// Danisha M. García Vizcaíno
// Elayza S. Silva Hernandez
// Emely M. García Aguasvivas
// Emely J. Batista Abad
// Franchely Arias
//Variables a utilizar:
#include <Servo.h>
Servo Puerta;
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include <Keypad.h>
char password[]="7845"; // Contraseña de 4 dígitos de mes de cumpleaños de cada integrante del grupo 1
char password2[]="5670"; // Contraseña de 4 dígitos de mes de cumpleaños de cada integrante del grupo 2
char pass[4]; //Aquí almacenamos las teclas que se han presionado en el teclado
int conteo=0; //Esta variable se aumenta en 1 por cada tecla precionada
const byte FILAS = 4; //Numero de filas del teclado en uso
const byte COLUMNAS = 4; //Numero de columnas del teclado en uso
char mapaTeclas[FILAS][COLUMNAS] = //Mapa del teclado en uso
{
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte pinesFilas[FILAS] = {37, 35, 33, 31}; //Aqui estan los pines asignados para las filas del teclado
byte pinesColumnas[COLUMNAS] = {41, 43, 45, 47}; ///Aqui estan los pines asignados para las columnas del teclado
Keypad teclapad = Keypad(makeKeymap(mapaTeclas), pinesFilas, pinesColumnas, FILAS, COLUMNAS); //Inicializamos el teclado matricial
//Asignaciòn de pines:
void setup(){
Serial.begin(9600);
pinMode(11, OUTPUT); // pin 11 positivo del buzzer
pinMode(12, OUTPUT); //Pin 12 positivo del led verde
// Pantalla LCD:
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(2,0);
lcd.print("Bienvenidos a la villa de ST-A"); // Bienvenida al residencial
delay(2000);
Inicio();
pinMode(13, OUTPUT); //Pin 13 positivo del led rojo
digitalWrite(13, HIGH); // Mantiene el led rojo prendido, indicando que el acceso esta bloqueado
Puerta.attach(46); // Pin PWM del servo motor
Puerta.write(90); // Gira 90 grados para abrir el porton
}
//Iniciacion del control de acceso
void loop() {
char tecla = teclapad.getKey(); //Con esta variable se guarda el caracter presionado
if (tecla != NO_KEY) //¿Se ha presionado alguna tecla?
{
pass[conteo]=tecla; // Se guarda digito por digito en la creacion del password []
lcd.setCursor(7+conteo,1); // Indica el inicio de la posicion del password
lcd.print("*"); // Indica el numero presionado incognitamente
conteo=conteo+1; //Se aumenta en 1 la variable conteo
if(conteo==4) //Si 4 teclas fueron presionadas se verifica si la clave es la correcta o no
{
if (strncmp(pass, password, 4) == 0 || strncmp(pass, password2, 4) == 0) // Compara hasta n caracteres de las cadenas password y password2
{
bip(100); // Sonara un solo bip en el buzzer cuando el password es correcto
digitalWrite(12,HIGH); // Se encendera cuando el password ingresado sea el correcto
Abrir(); // acceso concedido
digitalWrite(12,LOW); // Se apagara indicando ya el ingreso
delay(2000);
conteo=0;//se reinicia la variable conteo al valor 0
}
//Si el password es incorrecto sonará dos veces el buzzer
if (conteo!=0){
bip(100);
bip(100);
lcd.setCursor(2,1);
lcd.print("Passw incorrecta"); // Password incorrecto
delay(1000);
Inicio(); // Vuelve al inicio
}
conteo=0; //Se reinicia la variable conteo al valor 0
}
}
}
//Sonido del buzzer (Es la parte que controla los bip del buzzer)
void bip(int retraso){
digitalWrite(11, HIGH);
delay(retraso);
digitalWrite(11, LOW);
delay(retraso);
}
//Es la parte principal donde indica el ingreso a la residencia
void Inicio(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Ingrese el Password:"); // Indica que debes de poner el password
}
//Es cuando se logra poner el password correcto, da el aviso de ingreso y bloqueo del control
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9 //Pin 9 para el reset del RC522
#define SS_PIN 53 //Pin 53 para el SS (SDA) del RC522
MFRC522 mfrc522(SS_PIN, RST_PIN); ///Creamos el objeto para el RC522
void setup() {
Serial.begin(9600); //Iniciamos La comunicacion serial
SPI.begin(); //Iniciamos el Bus SPI
mfrc522.PCD_Init(); // Iniciamos el MFRC522
}
byte ActualUID[4]; //almacenará el código del Tag leído
byte Usuario1[4]= {0x4D, 0x5C, 0x6A, 0x45} ; //código del usuario 1
byte Usuario2[4]= {0xC1, 0x2F, 0xD6, 0x0E} ; //código del usuario 2
void loop() {
// Revisamos si hay nuevas tarjetas presentes
if ( mfrc522.PICC_IsNewCardPresent())
{
//Seleccionamos una tarjeta
if ( mfrc522.PICC_ReadCardSerial())
{
// Enviamos serialemente su UID
for (byte i = 0; i < mfrc522.uid.size; i++) {
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
ActualUID[i]=mfrc522.uid.uidByte[i];
}
//comparamos los UID para determinar si es uno de nuestros usuarios
if(compareArray(ActualUID,Usuario1))
lcd.clear();
lcd.setCursor(1,1);
lcd.print("Carnet Autorizado!");
delay(1000);
else if(compareArray(ActualUID,Usuario2))
lcd.clear();
lcd.setCursor(1,1);
lcd.print("Carnet Autorizado!");
delay(1000);
else
lcd.clear();
lcd.setCursor(1,1);
lcd.print("Carnet Denegado!");
delay(1000);
// Terminamos la lectura de la tarjeta tarjeta actual
mfrc522.PICC_HaltA();
}
}
}
//Función para comparar dos vectores
boolean compareArray(byte array1[],byte array2[])
{
if(array1[0] != array2[0])return(false);
if(array1[1] != array2[1])return(false);
if(array1[2] != array2[2])return(false);
if(array1[3] != array2[3])return(false);
return(true);
}
void Abrir(){
Puerta.write(0);
digitalWrite(13, LOW); // led rojo permanece apagado
digitalWrite(12, HIGH); // led verde se enciende
lcd.clear();
lcd.setCursor(2,1);
lcd.print("Puerta Abierta!"); // Indica que el acceso esta permitido
delay(4000);
digitalWrite(12, LOW); // se apaga el led verde
lcd.clear();
lcd.setCursor(2,1);
lcd.print("Puerta Cerrada!"); // Indica que el acceso vuelve a bloquearse
Puerta.write(90);
digitalWrite(13, HIGH); // Vuelve a encenderse el led rojo
delay(1000);
Inicio(); //despues de todo el proceso vuelve al inicio
}