#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// Configurações do teclado 4x4
const byte LINHAS = 4; // número de linhas do teclado
const byte COLUNAS = 4; // número de colunas do teclado
// Define uma matriz com os símbolos que deseja ser lido do teclado
char SIMBOLOS[LINHAS][COLUNAS] = {
{'A','1','2','3'},
{'B','4','5','6'},
{'C','7','8','9'},
{'D','c','0','e'}
};
byte PINOS_LINHA[LINHAS] = {8, 9, 10, 11}; // pinos que indicam as linhas do teclado
byte PINOS_COLUNA[COLUNAS] = {4, 5, 6, 7}; // pinos que indicam as colunas do teclado
// Instancia de Keypad, responsável por capturar a tecla pressionada
Keypad customKeypad = Keypad(makeKeymap(SIMBOLOS), PINOS_LINHA, PINOS_COLUNA, LINHAS, COLUNAS);
// Variáveis responsáveis por armazenar as senhas
const String SENHA_ESPERADA = "1234ABCD";
String SENHA_DIGITADA = "";
// Configuração do display LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // Endereço I2C do LCD pode variar
// Pino do buzzer
const int buzzerPin = 12;
void setup() {
Serial.begin(9600);
// Inicializando a comunicação com o display LCD I2C
lcd.init();
lcd.backlight();
// Configura o pino do buzzer como saída
pinMode(buzzerPin, OUTPUT);
// Seta a configuração inicial do display
inicio();
}
void loop() {
// Captura a tecla pressionada do teclado
char customKey = customKeypad.getKey();
// Caso alguma tecla tenha sido pressionada
if (customKey) {
Serial.println(customKey);
switch (customKey) {
// Caso alguma das teclas imprimíveis tenha sido pressionada
case 'A':
case 'B':
case 'C':
case 'D':
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
// Concatena o novo símbolo à senha que está sendo digitada
SENHA_DIGITADA += customKey;
Serial.println(SENHA_DIGITADA);
// Imprime na tela o símbolo pressionado
lcd.print(customKey);
break;
// Caso a tecla CLEAR tenha sido pressionada
case 'c':
// Limpa a variável que guarda a senha que está sendo digitada
SENHA_DIGITADA = "";
// Chama o comando para limpar a tela
lcd.clear();
// Configura a mensagem para digitar a senha
inicio();
break;
// Caso a tecla ENTER seja pressionada, devemos comparar as senhas
case 'e':
// Limpa a tela
lcd.clear();
// Se a senha digitada for igual a ESPERADA
if (SENHA_ESPERADA == SENHA_DIGITADA) {
Serial.println("Senha Correta!");
// Imprime mensagem de senha correta
lcd.print("Senha Correta!!!");
// Toca o buzzer três vezes
tocarBuzzer(3);
}
// Caso senha esteja errada
else {
Serial.println("Senha Incorreta!");
// Imprime mensagem de senha incorreta
lcd.print("Senha Incorreta!");
}
// Aguarda 2 segundos para limpar a tela novamente e esperar uma nova senha ser digitada
delay(2000);
lcd.clear();
SENHA_DIGITADA = "";
inicio();
break;
default: break;
}
}
}
// Função responsável por imprimir na tela a mensagem para digitar a senha
// É chamada toda vez que a senha foi digitada e comparada, também quando
// a tecla limpar display foi pressionada.
void inicio() {
lcd.print("Senha:");
}
// Função para tocar o buzzer um número específico de vezes
void tocarBuzzer(int vezes) {
for (int i = 0; i < vezes; i++) {
tone(buzzerPin, 1000); // Toca o buzzer a 1000 Hz
delay(200); // Espera 200 ms
noTone(buzzerPin); // Para de tocar
delay(200); // Espera 200 ms antes de tocar novamente
}
}