#include <Servo.h>
Servo servoMotor1;
//
#include <LiquidCrystal.h>
LiquidCrystal lcd (2,3,4,5,6,7);
//
#include <Wire.h>
#include <Keypad.h>
//
int fechadura = 51;
//
#define Password_Length 5 // Definindo o comprimento da senha, incluindo o caractere nulo '\0'
char Data[Password_Length]; // Array para a senha digitada
byte data_count = 0; // Contador de caracteres digitados
bool Pass_is_good = false;
char customKey;
// Configuração do teclado de membrana
const byte ROWS = 4; // Número de linhas no teclado
const byte COLS = 4; // Número de colunas no teclado
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {22, 23, 24, 25}; // Pinos das linhas
byte colPins[COLS] = {26, 27, 28, 29}; // Pinos das colunas
Keypad customKeypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
struct Perfil {
char nome[10]; // Nome do perfil
char senha[Password_Length]; // Senha do perfil
};
struct RegistroChave {
int numeroChave; // Número da chave
char ultimoPerfil[10]; // Nome do último perfil que pegou a chave
bool chaveRetirada; // Novo campo para indicar se a chave está retirada
};
// Lista de perfis com senhas
Perfil perfis[] = {
{"Nicole", "1105"},
{"Rafael", "0510"},
{"Amarildo", "3307"},
{"Vini CLP", "1234"}
};
const int numChaves = 9; // Número de chaves disponíveis
RegistroChave registros[numChaves]; // Array para armazenar quem pegou cada chave
// Definindo os pinos dos botões que representam as chaves
const int pinosChaves[numChaves] = {32, 33, 34, 35, 36, 37, 38, 39, 40};
const int numPerfis = sizeof(perfis) / sizeof(perfis[4]); // Número de perfis
void setup(){
lcd.begin(16,2);
Serial.begin(9600);
lcd.clear();
lcd.print("Digite sua senha");
pinMode(fechadura, OUTPUT);
servoMotor1.attach(51);
servoMotor1.write(180);
// Configurando os pinos das chaves como entrada
for (int i = 0; i < numChaves; i++) {
pinMode(pinosChaves[i], INPUT_PULLUP);
registros[i].numeroChave = i + 1;
strcpy(registros[i].ultimoPerfil, "Nenhum");
registros[i].chaveRetirada = false;
}
}
void loop(){
customKey = customKeypad.getKey();
Serial.println(customKey);
if (customKey) {
if (customKey == '#') { // '#' para verificar a senha digitada
verificarSenha();
// Limpa leituras anteriores para evitar interferência
while (customKeypad.getKey()) {
delay(50); // Aguarda para limpar qualquer tecla pressionada anteriormente
}
limparSenha(); // Limpa a entrada para a próxima tentativa
} else if (customKey == '*') { // '*' para limpar a entrada manualmente
limparSenha();
lcd.clear();
lcd.print("Digite sua senha");
delay(1500);
servoMotor1.write(180);
} else if (customKey == 'C') {
consultarRegistro();
} else if (data_count < Password_Length - 1) { // Adiciona a tecla pressionada na senha
Data[data_count] = customKey;
lcd.setCursor(data_count, 0);
lcd.setCursor(0,1);
lcd.print('*'); // Exibe '*' em vez do caractere da senha no display
data_count++;
}
}
}
void verificarSenha() {
Pass_is_good = false;
for (int i = 0; i < numPerfis; i++) {
if (strcmp(Data, perfis[i].senha) == 0) { // Verifica se a senha coincide
Pass_is_good = true;
lcd.clear();
servoMotor1.write(90);
lcd.print("Bem-vindo(a), ");
lcd.setCursor(0,1);
lcd.print(perfis[i].nome); // Exibe o nome do perfil
delay(1500);
lcd.clear();
lcd.print(" Pegue sua(s) ");
lcd.setCursor(0,1);
lcd.print(" chave(s) ");
delay(1500);
selecionarChaves(perfis[i].nome); // Função para pegar as chaves
break;
}
}
if (!Pass_is_good) {
lcd.clear();
lcd.print("Senha incorreta!");
lcd.setCursor(0,1);
lcd.print("Tente novamente.");
delay(2000);
lcd.clear();
lcd.print("Digite sua senha");
}
}
void selecionarChaves(const char* nomePerfil) {
unsigned long tempoInicial = millis();
const unsigned long tempoLimite = 15000; // Tempo para escolher as chaves (15 segundos)
// Limpa leituras anteriores para evitar interferência
while (customKeypad.getKey()) {
delay(50); // Aguarda para limpar qualquer tecla pressionada anteriormente
}
while (millis() - tempoInicial < tempoLimite) {
customKey == customKeypad.getKey(); // Monitora o teclado para verificar se 'C' foi pressionado
if (customKey) { // Apenas para depuração
Serial.print("Tecla pressionada: ");
Serial.println(customKey);
}
if (customKey =='D'){
lcd.clear();
lcd.print("Tempo expirado!");
delay(1500);
lcd.clear();
lcd.print(" Por favor, ");
lcd.setCursor(0,1);
lcd.print(" Feche a porta. ");
delay(2300);
servoMotor1.write(180);
lcd.clear();
lcd.print("Digite sua senha");
return;
}
for (int i = 0; i < numChaves; i++) {
if (digitalRead(pinosChaves[i]) == LOW) { // Verifica se o botão da chave foi pressionado
delay(50); // Debounce
if (digitalRead(pinosChaves[i]) == LOW) { // Confirma o botão pressionado
if (registros[i].chaveRetirada) { // Se a chave já foi retirada, devolve a chave
registros[i].chaveRetirada = false;
strcpy(registros[i].ultimoPerfil, "Nenhum");
lcd.clear();
lcd.print("A Chave: ");
lcd.print(i + 1);
lcd.setCursor(0, 1);
lcd.print("Foi devolvida.");
} else { // Se a chave não foi retirada, marca como retirada
registros[i].chaveRetirada = true;
strcpy(registros[i].ultimoPerfil, nomePerfil);
lcd.clear();
lcd.print("Chave: ");
lcd.print(i + 1);
lcd.setCursor(0, 1);
lcd.print("Pega por ");
lcd.print(nomePerfil);
}
delay(1000);
}
}
}
}
lcd.clear();
lcd.print("Tempo expirado!");
delay(1500);
lcd.clear();
lcd.print(" Por favor, ");
lcd.setCursor(0,1);
lcd.print(" Feche a porta. ");
delay(2300);
servoMotor1.write(180);
lcd.clear();
lcd.print("Digite sua senha");
}
void consultarRegistro() {
lcd.clear();
lcd.print("Consulta chaves.");
lcd.setCursor(0,1);
lcd.print("Chave a ver: ");
int chaveNumero = escolherNumeroChave();
if (chaveNumero != -1 && chaveNumero <= numChaves) {
lcd.clear();
lcd.print("Chave ");
lcd.print(chaveNumero);
lcd.setCursor(0, 1);
lcd.print("Ultimo: ");
lcd.print(registros[chaveNumero - 1].ultimoPerfil);
} else {
lcd.clear();
lcd.print(" Desculpe ");
lcd.setCursor(0,1);
lcd.print(" Chave invalida ");
}
delay(2500);
lcd.clear();
lcd.print("Digite sua senha");
}
int escolherNumeroChave() {
String chaveInput = "";
char tecla;
while (true) {
tecla = customKeypad.getKey();
if (tecla) {
if (tecla == '#') {
return chaveInput.toInt();
} else if (isdigit(tecla)) {
chaveInput += tecla;
lcd.print(tecla);
} else if (tecla == '*') {
return -1;
}
}
}
}
void limparSenha() {
memset(Data, 0, Password_Length); // Limpa o array Data
data_count = 0;
}