//PROJETO CLAVICULÁRIO - ALUNOS SENAI HERMENEGILDO - MECM3 - 2022//
//NATHAN GARCEZ 
//SAMUEL SANTOS
//YAGO MIRANDA
//SAMUEL SOUZA

/************************ INCLUSÃO DE BIBLIIOTECAS *****************************************/

#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <SPI.h>
#include <MFRC522.h>

/*************************************************************************/

 
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.
 int x = -1;
 
char st[20];

/************************ DEFINIÇÃO DE SENHA ******************************* */

char* senha1 = "ABC123";  // defina a senha aqui, ela deve conter seis dígitos
char* senha2 = "147852";
char* senha3 = "111111";
char* senha4 = "222222";

/************************ CONFIGURAÇÕES TECLADO ******************************* */

const byte LINHAS = 4; // quantidade de linhas do teclado
const byte COLUNAS = 4; // quantidade de colunas do teclado

char digitos[LINHAS][COLUNAS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}}; // todos os caracteres do teclado

byte pinosLinha[LINHAS] = { 30, 31, 32, 33}; // pinos de conexão das linhas no arduino 
byte pinosColuna[COLUNAS] = { 34, 35, 36, 37 }; // pinos de conexão das colunas no arduino 

Keypad keypad = Keypad( makeKeymap(digitos), pinosLinha, pinosColuna, LINHAS, COLUNAS ); // objeto de leitura das teclas com os parâmetros lidos
 
LiquidCrystal_I2C lcd(0x27, 20, 4);


/************************ VARIÁVEIS AUXILIARES ******************************* */

int position1 = 0;
int position2 = 0;
int position3 = 0;
int position4 = 0;

int ledVermelho;
int ledVerde;
int releFechadura; //led azul substituir por módulo relé
int buzzer;
int tempoBuzz = 50;
int tempoAberto = 2000;


int estadoVermelho;
int estadoVerde;
int estadoAzul;

/***************************************************************************** */

void setup()
{ 

  lcd.init(); // Inicia o display
  SPI.begin();  // Inicia  SPI bus
  mfrc522.PCD_Init(); // Inicia MFRC522

  lcd.setBacklight(HIGH); // liga luz de fundo do display
  
  estadoPorta(true); // diz se a porta está ou não trancada

  pinMode(ledVermelho,OUTPUT); // define os pinos de saída do arduino
  pinMode(ledVerde,OUTPUT);
  pinMode(releFechadura,OUTPUT);
  pinMode(buzzer,OUTPUT); 
  pinMode(8, OUTPUT);

  Serial.begin(9600);   // Inicia a serial
  Serial.println("Aproxime o seu cartao do leitor...");
  Serial.println();
   
}

void loop()
{
 
 lcd.setCursor(2, 0);
 lcd.print("Digite a senha");

 }

char digito = keypad.getKey(); // faz a leitura das teclas

if (digito != 0)
{
  x = x + 1;
  lcd.setCursor(x, 3);
  lcd.print("*");
  Serial.print(digito);
 
  tone(buzzer, 200, 100);
  delay(tempoBuzz);
  digitalWrite(buzzer, LOW); // acionamento do buzzer ao apertar qualquer tecla

if(digito == '#' || digito == '*'){

  position1 = 0;
  position2 = 0;
  position3 = 0;
  position4 = 0;

  x = -1;
  lcd.clear();
}

if (digito == senha1[position1]) // verifica se o dígito apertado corresponde ao equivalente da senha
{
position1 ++;

}
else { // retorna a leitura para a primeira posição de leitura da senha quando o dígito apertado não corresponde ao correto 
position1 = 0;

}

if (digito == senha2[position2]) // verifica se o dígito apertado corresponde ao equivalente da senha
{
position2 ++;

}
else { // retorna a leitura para a primeira posição de leitura da senha quando o dígito apertado não corresponde ao correto 
position2 = 0;

}
if (digito == senha3[position3]) // verifica se o dígito apertado corresponde ao equivalente da senha
{
position3 ++;

}
else { // retorna a leitura para a primeira posição de leitura da senha quando o dígito apertado não corresponde ao correto 
position3 = 0;

}
if (digito == senha4[position4]) // verifica se o dígito apertado corresponde ao equivalente da senha
{
position4 ++;

}
else { // retorna a leitura para a primeira posição de leitura da senha quando o dígito apertado não corresponde ao correto 
position4 = 0;

}

if(position1 > 5 && x == 5){

lcd.home();
lcd.clear();
lcd.print("senha correta");
delay(350);
lcd.clear();
x = -1;
}
if(position2 > 5 && x == 5){

lcd.home();
lcd.clear();
lcd.print("senha correta");
delay(350);
lcd.clear();
x = -1;
}
if(position3 > 5 && x == 5){

lcd.home();
lcd.clear();
lcd.print("senha correta");
delay(350);
lcd.clear();
x = -1;
}
if(position4 > 5 && x == 5){

lcd.home();
lcd.clear();
lcd.print("senha correta");
delay(350);
lcd.clear();
x = -1;
}

if(x == 5 && position1 == 0 || x == 5 && position2 == 0 || x == 5 && position3 == 0 || x == 5 && position4 == 0)
{

  x = -1;
   digitalWrite(ledVermelho, LOW);
  lcd.clear();
  lcd.home();
  lcd.print("senha incorreta");
  delay(200);
  lcd.clear();
  digitalWrite(ledVermelho, HIGH);
}

if (position1 == 6 ) // altera estado da porta  
{
estadoPorta(false);

}
if (position2 == 6 ) // altera estado da porta  
{
estadoPorta(false);

}
if (position3 == 6 ) // altera estado da porta  
{
estadoPorta(false);

}
if (position4 == 6 ) // altera estado da porta  
{
estadoPorta(false);

}

//PARTE RFID********************************************************************************//

}
if ( ! mfrc522.PICC_IsNewCardPresent()) 
  {
   return;
  
  }
  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial()) 
  {
    return;
  }
   Serial.print("UID da tag :");
  String conteudo= "";
  byte letra;
  for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
     Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
     Serial.print(mfrc522.uid.uidByte[i], HEX);
     conteudo.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
     conteudo.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  Serial.println();
  Serial.print("Mensagem : ");
  conteudo.toUpperCase();
  if (conteudo.substring(1) == "13 82 72 A7") //UID 1 - Chaveiro
  {
    estadoPorta(false);
  }
 if (conteudo.substring(1) == "") //UID 2 - Chaveiro
  {
    estadoPorta(false);
  
    
  }
   if (conteudo.substring(1) == "") //UID 3 - Chaveiro
  {
    estadoPorta(false);
  
    
  }
   if (conteudo.substring(1) == "") //UID 4 - Chaveiro
  {
    estadoPorta(false);
  
  }
  
}

//DESTRAVAMENTO DA PORTA********************************************************//

void estadoPorta(int trancado)
{
  
if (trancado) // trancamento da porta
{
digitalWrite(ledVermelho, HIGH);
digitalWrite(ledVerde, LOW);
digitalWrite(releFechadura, LOW); // importante: para uso com rele de acionamento da fechadura LOW deve ser subsstituído por HIGH
}

else // abertura da porta
{

lcd.clear();
lcd.home();
lcd.print("Tenha um Bom Dia");
delay(100); 
digitalWrite(ledVermelho, LOW);
digitalWrite(ledVerde, HIGH);
digitalWrite(releFechadura, HIGH); // importante: para uso com rele de acionamento da fechadura HIGH deve ser subsstituído por LOW
digitalWrite(buzzer, HIGH);
delay(tempoBuzz*10);
digitalWrite(buzzer, LOW); // buzzer indica o acerto da senha 
delay(tempoAberto);
position1 = 0;
digitalWrite(releFechadura, HIGH);
estadoPorta(true); // tranca a porta novamente 
lcd.clear();
}
}