Universidade Federal de Mato Grosso do Sul
Faculdade de Computação
Introdução à Computação
Mariana Caravanti de Souza
DESAFIO 5
Tecnognose
Luan Rodolfo Leme dos Santos - 202519040545
Caio e Silva Barbieri - 202519040146
Guilherme de Assis Escobar - 202519040308
Henrico Oliveira de Queiroz - 202519040359
Campo Grande
18 de junho de 2025
1 Link Tinkercad
https://www.tinkercad.com/things/cYpkeSP3LKS-desafio-5-last-dance?sharecode=
6flFCFIexjOpwCxUfzUYSG6_wW-lf_31n_sOZQ5c7FI
2 Circuito
Figura 1: Imagem do circuito
3 Código
// --- Inclusao das Bibliotecas Essenciais ---
#include<Keypad.h>
#include <LiquidCrystal_I2C.h>
// --- Configuracao dos Componentes ---
LiquidCrystal_I2C lcd(0x27, 16, 2);
const byte numLinhas = 4;
const byte numColunas = 4;
byte linhas[numLinhas] = {7, 6, 5, 4};
byte colunas[numColunas] = {11, 10, 9, 8};
1
char teclas[numLinhas][numColunas] =
{
{’1’, ’2’, ’3’, ’A’},
{’4’, ’5’, ’6’, ’B’},
{’7’, ’8’, ’9’, ’C’},
{’*’, ’0’, ’#’, ’D’}
};
Keypad teclado = Keypad(makeKeymap(teclas),
linhas, colunas, numLinhas, numColunas);
// --- Variaveis do Sistema de Criptografia e Senha ---
const char chaveDeCriptografia = ’S’;
String senhaSecretaCriptografada;
String chaveCriptografada;
const byte MAX_CARACTERES = 5;
byte tentativasRestantes = 3;
// Funcao para criptografar ou descriptografar uma String.
String criptografar(String dados) {
String dadosProcessados = "";
for (int i = 0; i < dados.length(); i++) {
dadosProcessados += dados[i] ^ chaveDeCriptografia;
}
return dadosProcessados;
}
// Funcao de configuracao, executada uma vez.
void setup()
{
Serial.begin(9600);
senhaSecretaCriptografada = criptografar("12345");
chaveCriptografada = criptografar("AAAAA");
lcd.init();
lcd.clear();
lcd.backlight();
}
// Funcao principal, executada em loop.
void loop()
2
{
if (tentativasRestantes > 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Senha (");
lcd.print(tentativasRestantes);
lcd.print(" T):");
lcd.setCursor(0, 1);
String senhaDigitada = ler_do_teclado();
String senhaDigitadaCriptografada =
criptografar(senhaDigitada);
if (senhaDigitadaCriptografada == chaveCriptografada) {
mudarSenha();
}
else if (senhaDigitadaCriptografada ==
senhaSecretaCriptografada) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Acesso Liberado!");
while (true) {}
}
else {
tentativasRestantes--;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Senha Incorreta!");
delay(2000);
}
}
else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SISTEMA");
lcd.setCursor(0, 1);
lcd.print("BLOQUEADO");
while (true) {}
}
}
// Funcao para ler do teclado.
String ler_do_teclado() {
String valorRetornado = "";
char valorLido;
while (true) {
3
valorLido = teclado.waitForKey();
if (valorLido == ’#’) {
break;
}
if (valorLido == ’B’) {
if (valorRetornado.length() > 0) {
valorRetornado.remove(valorRetornado.length() - 1);
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
for (int i = 0; i < valorRetornado.length(); i++) {
lcd.print((char)(valorRetornado[i] ^
chaveDeCriptografia));
}
}
continue;
}
if (valorRetornado.length() < MAX_CARACTERES) {
valorRetornado += valorLido;
lcd.print((char)(valorLido ^ chaveDeCriptografia));
}
}
return valorRetornado;
}
// Funcao para alterar a senha.
void mudarSenha() {
lcd.clear();
lcd.print("Digite a Nova:");
lcd.setCursor(0, 1);
String novaSenha = ler_do_teclado();
lcd.clear();
lcd.print("Confirme a Nova:");
lcd.setCursor(0, 1);
String confirmacaoSenha = ler_do_teclado();
if (novaSenha.length() > 0 &&
novaSenha == confirmacaoSenha) {
senhaSecretaCriptografada = criptografar(novaSenha);
lcd.clear();
lcd.print("Senha Alterada!");
} else {
4
lcd.clear();
lcd.print("Erro! As senhas");
lcd.setCursor(0,1);
lcd.print("nao conferem.");
}
delay(2000);
}