#include <Keypad.h>
#define ROW_NUM 4 // four rows
#define COLUMN_NUM 4 // four columns
char keys[ROW_NUM][COLUMN_NUM] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte pin_rows[ROW_NUM] = {19, 18, 5, 17}; // GPIO19, GPIO18, GPIO5, GPIO17 connect to the row pins
byte pin_column[COLUMN_NUM] = {27, 26, 25, 33}; // GPIO16, GPIO4, GPIO0, GPIO2 connect to the column pins
Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );
// Defina um estado inicial
enum State {
WAIT_FOR_RFID,
WAIT_FOR_PASSWORD,
DOOR_OPEN
};
State currentState = WAIT_FOR_RFID;
bool rfidMessageReceived = true; // Variável para confirmar a mensagem do RFID
void setup() {
Serial.begin(9600);
}
void loop() {
if (rfidMessageReceived) {
Teclado();
}
// Outras partes do seu código
}
void Teclado() {
char key = keypad.getKey();
switch (currentState) {
case WAIT_FOR_RFID:
if (rfidMessageReceived) {
currentState = WAIT_FOR_PASSWORD;
Serial.println("Aguardando senha...");
}
break;
case WAIT_FOR_PASSWORD:
static String enteredPassword = ""; // Variável para armazenar a senha digitada
if (key) {
if (key == '#') {
// Se o usuário pressionar '#', a senha está completa
if (VerificarSenha(enteredPassword)) {
Serial.println("Senha correta. Abrindo a porta...");
// Senha correta, envie mensagem para o Servomotor
// Solicite a abertura da catraca/porta e envie o nome do usuário
// ou o índice do array com as informações, conforme acordado
// Exemplo: EnviarMensagemServomotor(nomeDoUsuario);
currentState = DOOR_OPEN;
} else {
Serial.println("Senha incorreta. Tente novamente.");
// Senha incorreta, envie mensagem para o display LCD informando o erro
// e volte ao estado WAIT_FOR_RFID
// Exemplo: lcd.print("Senha incorreta. Tente novamente.");
currentState = WAIT_FOR_RFID;
}
// Limpe a senha
enteredPassword = "";
} else {
// Capture o dígito
enteredPassword += key;
Serial.print("Senha atual: ");
Serial.println(enteredPassword);
}
}
break;
case DOOR_OPEN:
// Simulando estado de porta aberta
Serial.println("Porta aberta. Aguardando novo evento...");
// Aguarde nova mensagem de validação da senha ou outro evento
// Se necessário, adicione lógica para lidar com isso
currentState = WAIT_FOR_RFID;
break;
}
}
// Função para verificar a senha
bool VerificarSenha(String password) {
// Implemente a lógica para verificar se a senha está correta
// Compare a senha com a senha cadastrada com base no ID do cartão
// Retorne true se a senha estiver correta, caso contrário, retorne false
if (password == "1234") {
return true;
} else {
return false;
}
}
// Função para enviar mensagem ao Servomotor (simulada)
void EnviarMensagemServomotor(String nomeDoUsuario) {
// Implemente a lógica para enviar a mensagem ao Servomotor
// Pode ser uma simulação, dependendo do seu hardware real
// Exemplo: Serial.println("Servomotor: Abrir porta para " + nomeDoUsuario);
}