//PROJETO CLAVICU´LARIO - SENAI HERMENEGILDO - 2022 - MEC- M3//
//NATHAN GARCEZ
//SAMUEL SANTOS
//YAGO MIRANDA
//SAMUEL SOUZA

//*************************INCLUSÃO DE BIBLIOTECAS*******************************************//

#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include "RTClib.h"

//************************ RTC *********************************************//
  

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

char* senha1 = "ABC123";  // defina a senha aqui, ela deve conter seis dígitos
char* senha2 = "147852";
char* senha3 = "111111";  // defina a senha aqui, ela deve conter seis dígitos
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
 

//******************************* PARAMETRIZAÇÃO DO DISPLAY LCD ****************************//

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; 
int buzzer = 11;
int tempoBuzz = 50;
int tempoAberto = 2000;

int x = -1;

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

void setup()
{    

lcd.init(); //INICIA O DISPLAY
lcd.setBacklight(HIGH);// LIGA LUZ DE FUNDO
  
estadoPorta(true); // diz se a porta está ou não trancada

pinMode(ledVermelho,OUTPUT); 
pinMode(ledVerde,OUTPUT);
pinMode(releFechadura,OUTPUT);
pinMode(buzzer,OUTPUT); // define os pinos de saída do arduino
Serial.begin(9600);
}

void loop()
{

lcd.setCursor(0, 1);
lcd.print("--------------------");
 
lcd.setCursor(0, 2);
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("*");
 
  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;
  lcd.clear();
  lcd.home();
  lcd.print("senha incorreta");
  delay(200);
  lcd.clear();
}

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);

}
}
}
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;
position2 = 0;
position3 = 0;
position4 = 0;
digitalWrite(releFechadura, HIGH);
estadoPorta(true); // tranca a porta novamente 
lcd.clear();
}
}
mega:SCL
mega:SDA
mega:AREF
mega:GND.1
mega:13
mega:12
mega:11
mega:10
mega:9
mega:8
mega:7
mega:6
mega:5
mega:4
mega:3
mega:2
mega:1
mega:0
mega:14
mega:15
mega:16
mega:17
mega:18
mega:19
mega:20
mega:21
mega:5V.1
mega:5V.2
mega:22
mega:23
mega:24
mega:25
mega:26
mega:27
mega:28
mega:29
mega:30
mega:31
mega:32
mega:33
mega:34
mega:35
mega:36
mega:37
mega:38
mega:39
mega:40
mega:41
mega:42
mega:43
mega:44
mega:45
mega:46
mega:47
mega:48
mega:49
mega:50
mega:51
mega:52
mega:53
mega:GND.4
mega:GND.5
mega:IOREF
mega:RESET
mega:3.3V
mega:5V
mega:GND.2
mega:GND.3
mega:VIN
mega:A0
mega:A1
mega:A2
mega:A3
mega:A4
mega:A5
mega:A6
mega:A7
mega:A8
mega:A9
mega:A10
mega:A11
mega:A12
mega:A13
mega:A14
mega:A15
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
keypad1:R1
keypad1:R2
keypad1:R3
keypad1:R4
keypad1:C1
keypad1:C2
keypad1:C3
keypad1:C4
GND5VSDASCLSQWRTCDS1307+
rtc1:GND
rtc1:5V
rtc1:SDA
rtc1:SCL
rtc1:SQW