#include <stdio.h>
#include "pico/stdlib.h"
#include <string.h>
//definicoes globais
#define ROW 4
#define COLUM 4
#define LED_VERDE 27
#define LED_VERMELHO 28
#define SECURITY_BUZZER 26
#define BLOCK_TIME_IN_MS 10000
// O objetivo deste projeto é criar um sistema embarcado que permita o
// controle de um cofre digital por meio de uma senha de 4 dígitos. A senha
// deve ser inserida utilizando um teclado matricial, e o estado do cofre (aberto
// ou fechado) será indicado por dois LEDs: um LED verde, que acenderá
// quando o cofre estiver aberto, e um LED vermelho, que piscará em caso de
// senha incorreta. Além disso, após três tentativas incorretas consecutivas,
// o sistema deve entrar em um modo de bloqueio temporário, desativando a
// entrada de novas tentativas por um período determinado.
// Embarcatech 2024 - Projeto 7 - cofre inteligente
// autor: Luis Ferlim
// luisferlim.com
//o display de 7 seguimentos sera implementado depois
//definicao dos pinos
const uint8_t columPins[COLUM] = {2, 3, 4, 5};
const uint8_t rowPins[ROW] = {6, 7, 8, 9};
//por algum motivo tive que colocar 5 na posição porque restava lixo nas variaveis fazendo com que a
//verificacao nao fosse possivel
char keypadInput;
//coloque aqui a senha de 4 digitos que deseja
char key [5] = "3#A*";
char attempt[5] = "";
uint8_t result;
uint8_t attemptWordPos;
uint8_t TENTATIVAS = 3;
bool validacao;
const char keyMap [ROW][COLUM] = {
{'D', '#', '0', '*'},
{'C', '9', '8', '7'},
{'B', '6', '5', '4'},
{'A', '3', '2', '1'}
};
//assinaturas
void init();
char leitura();
void cicloEntrada();
bool verificacao();
int main() {
stdio_init_all();
init();
attemptWordPos = 0;
while (true) {
cicloEntrada();
}
}
void cicloEntrada() {
keypadInput = leitura();
if (keypadInput != '\0') {
//coloca na string de tentativa
attempt[attemptWordPos] = keypadInput;
printf("Numero digitado: %c\n", keypadInput);
printf("Tentativa: %s\n", attempt);
attemptWordPos++;
//verificacao
if (attemptWordPos == 4) {
validacao = verificacao();
TENTATIVAS--;
//retorno ao usuario
//a senha inserida esta correta
if (validacao) {
printf("Sistema liberado\n");
for (;;) {
gpio_put(LED_VERDE, validacao);
}
} else {
gpio_put(LED_VERMELHO, !validacao);
sleep_ms(2000);
}
gpio_put(LED_VERMELHO, 0);
if (TENTATIVAS == 0) {
printf("Sistema bloqueado\n");
gpio_put(LED_VERMELHO, 1);
gpio_put(SECURITY_BUZZER, 1);
sleep_ms(BLOCK_TIME_IN_MS);
gpio_put(LED_VERMELHO, 0);
gpio_put(SECURITY_BUZZER, 0);
//reiniciando o sistema
printf("Sistema reiniciando\n");
TENTATIVAS = 3;
}
}
sleep_ms(200);
}
}
bool verificacao() {
result = strcmp(key, attempt);
if (result == 0) {
return 1;
} else {
attemptWordPos = 0;
return 0;
}
}
char leitura() {
for (int row = 0; row < ROW; row ++) {
gpio_put(rowPins[row], 1); //coloca em nivel alto, util para quando formos verificar o pull down
for (int colum = 0; colum < COLUM; colum++) {
//verifica o estado de cada item na coluna
if (gpio_get(columPins[colum])) {
gpio_put(rowPins[row], 0);
return keyMap [row][colum];
}
}
gpio_put(rowPins[row], 0); //poe a linha atual em nivel baixo
}
return '\0';
}
//inicializacao e definicao das portas
void init () {
for (int i = 0; i < ROW; i++) {
gpio_init(rowPins[i]);
gpio_set_dir(rowPins[i], GPIO_OUT);
gpio_put(rowPins[i], 0);
}
for (int i = 0; i < COLUM; i++) {
gpio_init(columPins[i]);
gpio_set_dir(columPins[i], GPIO_IN);
gpio_pull_down(columPins[i]);
}
gpio_init(LED_VERMELHO);
gpio_init(LED_VERDE);
gpio_init(SECURITY_BUZZER);
gpio_set_dir(LED_VERMELHO, GPIO_OUT);
gpio_set_dir(LED_VERDE, GPIO_OUT);
gpio_set_dir(SECURITY_BUZZER, GPIO_OUT);
}