#include <Keypad.h> //Importamos la libreria Keypad
#include"RTClib.h" //Importamos la libreria RTC DS1307: Reloj de Tiempo Real (Real Time Clock)
const byte ROWS = 4; //Definimos numero de filas
const byte COLS = 4; //Definimos numero de columnas
//Definimos la distribucion de teclas con sus valores
char keys[ROWS][COLS] = {
{'1', '2', '3', ' '},
{'4', '5', '6', ' '},
{'7', '8', '9', ' '},
{' ', '0', ' ', ' '}
};
byte rowPins[] = {5, 4, 3, 2}; //Pines conectados correspondientes a las filas
byte colPins[] = {9, 8, 7, 6}; //Pines conectados correspondientes a las columnas
//Declaramos las variables y se inicializan
int posicion = 0;
String keyadd = "";
String user_key = "";
String pass_key = "";
int validacion = 0;
//Declaramos las 2 matrices con 5 usuarios y sus 5 passwords, de 3 posiciones
String user_val[5] = { "001" , "002" , "003" , "004" , "005" };
String pass_val[5] = { "101" , "102" , "103" , "104" , "105" };
String name_val[5] = { "Robert Downey Jr." , "Chris Evans" , "Scarlett Johansson" , "Samuel L. Jackson" , "Tom Hiddleston" };
String name_valid = "";
//Creamos el objeto Teclado con los parametros definidos previamente
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
//Creamos un objeto llamado RTC para nombrar a nuestro reloj
RTC_DS1307 RTC;
//Con esta sentecia obtenemos el dia de la semana
char daysOfTheWeek[7][12] = {"Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"};
void setup() {
Serial.begin(9600);
pinMode(11, OUTPUT); //Pin de salida de Buzzer
RTC.begin();
RTC.adjust(DateTime(__DATE__, __TIME__)); //Sincronitzar la fecha y hora con el PC
Serial.print("Enter your user code: ");
}
//Iniciamos la funcion bucle que se repetira indefinidamente
void loop() {
char key = keypad.getKey(); //Obtenemos el valor de la tecla presionada en la variable key
if (key>='0' && key<='9' && posicion < 6)
{
beep(); //Realiza un sonido en cada pulsación
posicion ++; //Aumentamos el número de la posición cada vez que se presiona una tecla
keyadd = keyadd + String(key); //Guardamos el acumulado de cada pulsación
if (posicion < 4){
Serial.print(key); //Las 3 primera posiciones muestra los numeros pulsados
}
else{
Serial.print("*"); //A partir de al 3 posición muestra asteriscos para la contraseña
}
//Hasta la posición 3 guarda el valor de usuario en user_key
if (posicion == 3){
user_key = keyadd; //Recogemos y guardamos el valor del usuario
keyadd = "";
Serial.println("");
Serial.print("Enter your password: ");
}
//Hasta la posición 6 guarda el valor de la password en pass_key
if (posicion == 6){
pass_key = keyadd; //Recogemos y guardamos el valor de la password
keyadd = "";
//Recorre todos los valores de la matriz para compararlos con los valores recogidos en user_key y pass_key
for (int i =0; i< 5; i++) {
//Detecta si coincide el usuario y password de la misma posición en la matriz
if (user_val[i] == user_key && pass_val[i] == pass_key){
validacion = 1;
name_valid = name_val[i]; //Guardamos el nombre del usuario
}
}
//Imprime el resultado segun la validación anterior
Serial.println("");
Serial.println("*****************************************");
if (validacion == 0){
Serial.println("INCORRECT LOGIN");
}
else {
Serial.println("CORRECT LOGIN");
//Obtiene el valor de la Fecha/Hora del PC
DateTime now = RTC.now();
//Imprime en el monitor serie la fecha y la hora actual
Serial.print("Now: ");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial.print(' ');
Serial.print(now.day(), DEC);
Serial.print("/");
Serial.print(now.month(), DEC);
Serial.print("/");
Serial.print(now.year(), DEC);
Serial.print(" ");
Serial.print(now.hour(), DEC);
Serial.print(":");
Serial.print(now.minute(), DEC);
Serial.print(":");
Serial.print(now.second(), DEC);
Serial.println();
//Imprime en el monitor el nombre completo del usuario
Serial.print("WELCOME: ");
Serial.println(name_valid);
}
Serial.println("*****************************************");
}
}
}
//Realiza el sonido
void beep() {
tone(11,1000,50);
}