//Declaração das bibliotecas
#include "pico/stdlib.h"
#include <stdio.h>
#include <string.h>
//Definição das variáveis globais, GPIO e constantes
#define ROWS 4
#define COLS 4
#define TAM_SENHA 4
#define LED_R_PIN 28
#define LED_G_PIN 27
const uint8_t row_pins[ROWS]={8,7,6,5};
const uint8_t col_pins[COLS]={4,3,2,9};
const char key_map[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
const uint8_t segment_pins[] = {22,21,20,19,18,17,16};
const uint8_t display_pins[] = {13,12,11,10};
const uint8_t digits[22][7] = {
{1, 1, 1, 1, 1, 1, 0},//0
{0, 1, 1, 0, 0, 0, 0},//1
{1, 1, 0, 1, 1, 0, 1},//2
{1, 1, 1, 1, 0, 0, 1},//3
{0, 1, 1, 0, 0, 1, 1},//4
{1, 0, 1, 1, 0, 1, 1},//5
{1, 0, 1, 1, 1, 1, 1},//6
{1, 1, 1, 0, 0, 0, 0},//7
{1, 1, 1, 1, 1, 1, 1},//8
{1, 1, 1, 0, 0, 1, 1},//9
{1, 1, 0, 0, 0, 1, 1},//*
{0, 1, 1, 0, 1, 1, 0},//#
{0, 0, 1, 1, 1, 0, 1},//o
{1, 1, 0, 0, 1, 1, 1},//P
{1, 0, 0, 1, 1, 1, 1},//E
{1, 1, 1, 0, 1, 1, 0},//N
{0, 0, 0, 0, 0, 0, 1},//-
{1, 1, 1, 0, 1, 1, 1},//A
{0, 0, 1, 1, 1, 1, 1},//b
{1, 0, 0, 1, 1, 1, 0},//C
{0, 1, 1, 1, 1, 0, 1},//d
{0, 0, 0, 0, 1, 0, 1}//r
};
char senha_cad[TAM_SENHA+1]={'1','2','3','4'};
char senha[TAM_SENHA+1]={'@','@','@','@'};
int tentativa=1;
int flag=0;
//Definição dos protótipos de funções
void seg_init();
void show_digit(int display, int digit);
void keypad_init();
void leds_init();
char read_keypad();
void ler_senha(char senha[]);
int verificar_senha(char senha_cad[], char senha[]);
void set_leds(int red, int green);
void reset_senha(char senha[]);
void display_open();
void display_erro();
void entrada_permitida(char senha[]);
void entrada_negada(int tentativa, char senha[]);
void bloqueio_erros();
//Função main
void main(){
stdio_init_all();
//Inicializacao dos GPIO's que controlam o display de 7 segmentos, keypad e leds
seg_init();
keypad_init();
leds_init();
while(true){
ler_senha(senha);
flag=verificar_senha(senha_cad,senha);
if(flag==1){//Entrada permitida
entrada_permitida(senha);
tentativa=1;
}
else if(flag==0 && tentativa<3){//Entrada negada e menos de 3 tentativas
entrada_negada(tentativa,senha);
tentativa++;
}
else if(flag==0 && tentativa==3){//Entrada negada e bloqueio por 3 tentativas incorretas
entrada_negada(tentativa,senha);
bloqueio_erros();
tentativa=1;
}
}
}
//Funções implementadas
void keypad_init(){
for (int i = 0; i<ROWS; i++){
gpio_init(row_pins[i]);
gpio_set_dir(row_pins[i], GPIO_OUT);
gpio_put(row_pins[i],0);
}
for (int i = 0; i<COLS; i++){
gpio_init(col_pins[i]);
gpio_set_dir(col_pins[i], GPIO_IN);
gpio_pull_down(col_pins[i]);
}
}
char read_keypad(){
for (int row = 0; row < ROWS; row++){
gpio_put(row_pins[row], 1);
for (int col = 0; col < COLS; col++){
if (gpio_get(col_pins[col])){
gpio_put(row_pins[row],0);
return key_map[row][col];
}
}
gpio_put(row_pins[row],0);
}
return '\0';
}
void ler_senha(char senha[]){
int i=0;
printf("Digite a senha!\n");
while(true){
if(i<TAM_SENHA){
char var = read_keypad(); //variavel que recebe o valor lido pelo keypad
if (var != '\0'){//Armazena a variavel no vetor senha se ela for diferente do valor definido
senha[i] = var;
}
if (senha[i] != '@'){//Se o valor armazenado na posicao observada de senha for diferente do padrão ("@") entra no if
int k=0;
for (int j=3;j>=0;j--){
int digito = senha[k]-'0';//Conversao de caractere para inteiro (vide tabela ASCII)
//Na conversao "*" e "#" geram valores negativos, sequencia de if else utilizada para identificar e direcionar para o valor no display 7 segmentos que corresponde
if (digito==-6){
digito=10;
}
else if(digito==-13){
digito=11;
}
show_digit(j,digito);//Mostra o digito correspondente no display de 7 segmentos selecionado
sleep_ms(5);
k++;
}
sleep_ms(150);
i++;
}
else{//Senao mostra os digitos armazenados em todas as posicoes. Serve para não perceber o display de 7 segmentos apagado.
int k=0;
for (int j=3;j>=0;j--){
sleep_ms(5);
int digito = senha[k]-'0';//Conversao de caractere para inteiro (vide tabela ASCII)
//Na conversao "*" e "#" geram valores negativos, sequencia de if else utilizada para identificar e direcionar para o valor no display 7 segmentos que corresponde
if (digito==-6){
digito=10;
}
else if(digito==-13){
digito=11;
}
show_digit(j,digito);//Mostra o digito correspondente no display de 7 segmentos selecionado
sleep_ms(5);
k++;
}
}
}
else{
printf("\nSenha inserida!\n");
break;//Encerra o loop infinito assim que a senha eh preenchida
}
}
}
int verificar_senha(char senha_cad[], char senha[]){
int var;
if((strcmp(senha_cad,senha) == 0)){
var=1;
}
else{
var=0;
}
return var;//Retorna 1 se a senha corresponde com a predefinida, 0 senao corresponder
}
void entrada_negada(int tentativa, char senha[]){
printf("Acesso negado pela %da vez.\n",tentativa);
int piscar=0;
while(piscar<=53){//Mostra 'erro' no display 7 segmentos e após isso pisca led vermelho por 3s
if(piscar>50){
seg_init();
set_leds(1,0);
sleep_ms(500);
set_leds(0,0);
sleep_ms(500);
}
else{
display_erro();
sleep_ms(5);
}
piscar++;
}
reset_senha(senha);//Recoloca os valores padrao no vetor senha
}
void bloqueio_erros(){
printf("Tres tentativas incorretas, bloqueio temporário por 10 segundos\n");
sleep_ms(10000);
}
void leds_init(){
gpio_init(LED_R_PIN);
gpio_set_dir(LED_R_PIN, GPIO_OUT);
gpio_init(LED_G_PIN);
gpio_set_dir(LED_G_PIN, GPIO_OUT);
}
void set_leds(int red, int green){
gpio_put(LED_R_PIN, red);
gpio_put(LED_G_PIN, green);
}
void seg_init(){
for(int i=0;i<7;i++){
gpio_init(segment_pins[i]);
gpio_set_dir(segment_pins[i],GPIO_OUT);
}
for(int i=0;i<4;i++){
gpio_init(display_pins[i]);
gpio_set_dir(display_pins[i],GPIO_OUT);
gpio_put(display_pins[i],0);
}
}
void show_digit(int display, int digit){
for(int i=0;i<4;i++){
gpio_put(display_pins[i],1);
}
for(int i=0;i<7;i++){
gpio_put(segment_pins[i],digits[digit][i]);
}
gpio_put(display_pins[display],0);
}
void reset_senha(char senha[]){
for (int i=0;i<TAM_SENHA;i++){//Seta o vetor senha com os valores padrões "@"
senha[i]='@';
}
}
void display_open(){//Palavra "OPEN"
show_digit(3,12);
sleep_ms(5);
show_digit(2,13);
sleep_ms(5);
show_digit(1,14);
sleep_ms(5);
show_digit(0,15);
sleep_ms(5);
}
void display_erro(){//Palavra "ERRO"
show_digit(3,14);
sleep_ms(5);
show_digit(2,21);
sleep_ms(5);
show_digit(1,21);
sleep_ms(5);
show_digit(0,12);
sleep_ms(5);
}
void entrada_permitida(char senha[]){
printf("Entrada Permitida!\n");
set_leds(0,1);//Liga Led verde
printf("Para solicitar a senha novamente aperte '*'\n");
while(read_keypad() != '*'){//Mostra "open" no display 7 segmentos. Apertar "*" reinicia o programa
display_open();
}
reset_senha(senha);
sleep_ms(150);
set_leds(0,0);//Desliga led verde
}Loading
pi-pico-w
pi-pico-w