Implementação de um Sistema de Fechadura
Inteligente com Senha usando o ATmega328P
1st Áthila Silva Santos
2nd Danilo Pereira Rapozo
3rd Jonas Nogueira Barreto
Universidade Federal da Bahia
DEEC
Salvador, Brasil
athila.silva@ufba.br
Universidade Federal da Bahia
DEEC
Salvador, Brasil
danilorapozo@ufba.br
Universidade Federal da Bahia
DEEC
Salvador, Brasil
Jonas.barreto@ufba.br
4th Maria Clara Machado de Aguiar
5th Pedro Nogueira de Andrade
Universidade Federal da Bahia
DEEC
Salvador, Brasil
m.aguiar@ufba.br
Universidade Federal da Bahia
DEEC
Salvador, Brasil
pedronogueira@ufba.br
I. I NTRODUÇ ÃO
Com o aumento da demanda por dispositivos eletrônicos
mais versáteis e poderosos, surgiu no mercado a necessidade
de criar circuitos integrados menores e com maior número de
funcionalidades. Nesse contexto, desenvolveram-se os microcontroladores, dispositivos compactos e programáveis, capazes
de realizar operações digitais, lógicas e aritméticas a partir de
sinais periódicos. A principal vantagem desses dispositivos é a
possibilidade de desenvolver sistemas eletrônicos rapidamente
com o uso de poucos componentes, aliada à flexibilidade
de projeto e formas de trabalho. Essa caracterı́stica permite
aplicações em diversas áreas, como utensı́lios domésticos,
veı́culos, eletrônicos portáteis, sistemas industriais e, em especial, sistemas de segurança, que são o foco deste relatório.
A segurança tem se tornado um aspecto primordial em
diversos campos, desde a proteção de informações pessoais até
a integridade de sistemas fı́sicos. Com o avanço da tecnologia,
o uso de sistemas eletrônicos para implementação de soluções
de segurança tem se popularizado, especialmente devido à
acessibilidade de microcontroladores como o ATmega328P.
Estes dispositivos compactos permitem a criação de sistemas
eficientes e de baixo custo, como os que utilizam senhas para
controle de acesso. Neste relatório, discute-se o desenvolvimento de um sistema de segurança baseado no ATmega328P,
explorando suas funcionalidades.
Os objetivos deste trabalho incluem uma abordagem prática
e teórica para compreender a estrutura e as funcionalidades
básicas do microcontrolador especificado. Isso abrange o desenvolvimento de códigos em linguagem C e/ou Assembly, utilizando um ambiente integrado de desenvolvimento (IDE) para
edição, compilação e depuração. Além disso, busca-se explorar
o sistema de interrupções da plataforma microcontrolada,
essencial para o tratamento eficiente de eventos assı́ncronos,
e simular programas previamente compilados para validar seu
funcionamento antes da implementação no hardware.
II. M ETODOLOGIA
A essência do projeto, estruturado em funções modulares
para cada funcionalidade especı́fica, é criar um sistema que
solicita um nome de usuário e senha, verifica as credenciais e
fornece acesso se forem válidas, utilizando de feedback visuais
para indicar sucessos e falhas no acesso. Nesse sistema, após
três tentativas incorretas, o modelo bloqueia o acesso, sendo
necessário que o administrador (usuário 00) insira uma senha
para desbloqueá-lo. Vale ressaltar ainda que o administrador
pode adicionar até 5 novos usuários por meio do teclado.
Na implementação proposta foram utilizadas softwares,
como o Microchip Studio, para a confecção e compilação
dos programas escritos em linguagem C, e o Proteus, para
a simulação do circuito e de seus respectivos componentes.
Ao longo deste relatório será descrito em detalhes como
foi confeccionada cada funcionalidade e quais os principais
comando usados considerando a construção de um sistema que
utiliza um teclado matricial para entrada de dados, LEDs para
feedback visual, um display LCD para mensagens ao usuário
e uma EEPROM para armazenamento de credenciais (usuários
e senhas).
III. D ESCRIÇ ÃO DO C ÓDIGO
O código trabalhado neste relatório, como já foi citado
anteriormente, implementa um sistema de trava inteligente
utilizando um microcontrolador ATmega328P. Para isso, são
utilizados alguns componentes/sistemas básicos, como LEDs,
LCD, um Teclado Matricial, EEPROM e um Gerenciamento
de Usuários, com as respectivas funcionalidades e comandos
atrelados:
A. Microcontrolador ATmega328P
O ATmega328P é um microcontrolador de 8 bits da famı́lia
AVR, amplamente utilizado em sistemas embarcados, como
placas Arduino. Ele é um circuito integrado que combina
um processador, memória e periféricos de entrada/saı́da (I/O),
projetado para controlar dispositivos eletrônicos. Este microcontrolador funciona como o cérebro de sistemas eletrônicos,
recebendo dados de sensores, processando informações e
acionando atuadores conforme programado.
Internamente, o ATmega328P possui três tipos principais
de memória: Flash, SRAM e EEPROM. A memória Flash,
com 32 KB, é usada para armazenar o programa do usuário
e é não volátil, ou seja, mantém os dados mesmo sem
energia. A SRAM (2 KB) é volátil e serve para armazenar
dados temporários durante a execução do programa. A EEPROM, com capacidade de 1 KB, é não volátil e permite
armazenar pequenos dados que precisam ser preservados entre
reinicializações, como configurações de sistema. Além disso, o
microcontrolador conta com um conjunto de registradores que
auxiliam na execução de instruções e na comunicação entre
componentes internos.
O funcionamento do ATmega328P é baseado na interação
entre seus componentes. O processador executa o código
armazenado na memória Flash, utilizando dados da SRAM e
da EEPROM conforme necessário. Periféricos internos, como
timers, conversores ADC (Analógico-Digital), interfaces de
comunicação (SPI, I2C, UART) e portas de I/O, permitem
que ele interaja com o mundo externo. Esses periféricos são
acessı́veis através de pinos organizados nos grupos PORTB,
PORTC e PORTD. Com exceção do PORTC, cada grupo
possui 8 pinos, identificados como PB0-7, PC0-6 e PD07. Esses pinos funcionam como portas bidirecionais de I/O
(entrada/saı́da) de 8 bits, que precisam ser configuradas explicitamente no código para serem utilizadas. O funcionamento
é coordenado pelo clock interno ou externo, que define o ritmo
das operações.
B. LEDs
A seção do código referente aos comandos dos LEDs tem
como objetivo controlar o estado de dois LEDs conectados às
portas do microcontrolador, especificamente aos pinos PC2
(LED verde) e PC3 (LED vermelho). Nesse processo são
utilizadas 3 funções:
a) Inicialização (inicializaLEDs): Essa função determina
os pinos como saı́da e garante que os LEDs do sistema
inicializem apagados. Para a primeira finalidade citada, é
utilizado o chamado de código “DDRC”, que é o registrador
de direção dos dados “PORTC”, nele, através de um sinal
lógico positivo, definimos o pino correspondente como saı́da.
Além disso, no registrador responsável por controlar o estado
lógico dos pinos configurados (PORTC) usamos a expressão
NOT e ”&=” como forma de garantir que os LEDs estão e se
mantêm em estado baixo, ou seja, apagados.
b) Controle individual (acendeLEDVerde e acendeLEDVermelho): Essas funções, através da operação OR no PORTC
garante que o bit correspondente ao LED desejado seja 1, o
colocando em estado alto e assim garantindo que o mesmo seja
ligado. Ademais, usando a expressão AND “inverso” no outro
LED, é garantido pelo código que o bit correspondente ao LED
oposto ao ligado fique em estado baixo, ou seja desligado.
Dessa forma, temos um dos LEDs ligados e outro desligado.
c) Reset de estado (apagaLEDs): Essa função, por sua
vez, garante que os bits correspondentes ao LED Verde (PC2)
e ao LED Vermelho (PC3) sejam 0, isto é, fiquem em estado
baixo, apagando os dois LEDs simultaneamente.
C. LCD
Essa parte do código controla um display LCD em modo
4 bits, ou seja, que utiliza apenas 4 bits mais significativos
de um registrador para transmitir dados ao comando LCD.
Nesse processo são aplicadas 4 funções que permitem que
o componente seja operado de forma eficiente e modular,
possibilitando a exibição de informações:
a) Envio de comandos (enviaComando(unsigned char
comando)): Nessa função, o LCD opera recebendo dados
em duas etapas (4 bits mais significativos seguidos de 4 bits
menos significativos). Para isso, o comando do registrador
DATA PORT é dividido em duas sessões, uma contendo os 4
bits menos significativos (inalterados) e outra com os 4 bits
mais significativos. Após esse momento, é definido o pino de
controle RS (Register Select) que, por meio do nı́vel baixo,
informa ao sistema que um comando está sendo enviado.
Em seguida, é atribuı́do ao pino E (Enable) pulsos que.
condicionam o LCD a ler dados ou comandos presentes no
barramento. Ainda nesta função, é feito o deslocamento dos
bits menos significativos do comando para os mais significativos, para que esses possam ser lidos pelo sistema. Por fim,
com o uso de um “delay”, é proporcionado ao código um
atraso, a fim de garantir o processamento de informações.
b) Envio de dados (enviaDados (unsigned char dado)):
Nessa função, como o próprio nome indica, são enviados os
dados , sejam caracteres ou valores, para serem exibidos no
LCD. Para que isso ocorra, diferente da função anterior, é
definido o pino de controle RS (Register Select) em nı́vel alto,
o que indica ao sistema que o que está sendo enviado é um
dado. Nesse processo, o dado é transmitido em duas etapas,
primeiro os 4 bits mais significativos e, em seguida, os menos
significativos. Vale ressaltar que também é aplicado um pulso
ao pino E, que permite capturar os bits mais significativos,
assim como também é provocado em código o “delay”, para
melhor processamento de dados.
c) Inicialização (InicializaLCD): Essa função, por sua
vez, aborda configurações iniciais que garantem o funcionamento correto do LCD. Com esse intuito, configura-se os 4
bits mais significativos do registrador DATA PORT e os pinos
RS e E do CTRL PORT como saı́da. Além disso, nela, são
enviados alguns comandos:
enviaComando(0x02): Configura o modo 4 bits.
enviaComando(0x28): Define o formato do display (2
linhas, 5x8 pontos).
• enviaComando(0x0C): Liga o display, desativa o cursor
e o ”blinking”.
• enviaComando(0x06): Configura o incremento automático do cursor.
• enviaComando(0x01): Limpa o display.
•
•
d) Exibição (exibeString(const char *str)): Essa parte
do código é responsável pela exibição no LCD de caractere
por caractere, através da iteração sobre string. Nesse intuito,
enquanto o caractere nulo, que marca o fim da função,
não é alcançado, o caractere atual é enviado ao LCD pelo
comando “enviaDados(*str) e, após isso, o ponteiro da string
é incrementado, deslocando para o próximo caractere.
D. Teclado Matricial
Essa sessão do código tem por objetivo permitir que o
usuário insira o nome de usuário e senha em um teclado (4x3),
que possui teclas numéricas e sı́mbolos ( e #). Em um teclado
matricial cada botão conecta uma linha a uma coluna e para
detectar o botão pressionado é preciso ativar uma linha de
cada vez e verificar qual coluna está ativada, indicando o botão
pressionado. Ao longo da sua implementação e controle em
código são usadas duas funções:
a) Inicialização (inicializaTeclado): Essa função é responsável por configurar os pinos que serão usados com o
teclado. Nesse sentido, inicialmente é feita a configuração do
registrador de direção dos dados (DDR), na qual os pinos 3-7
do número 0xF8 são configurados como saı́das, para controlar
linhas do teclado, e os pinos 0-2 são considerados entradas,
para monitorar colunas do teclado. Nesse processo, também é
realizada a configuração do registrador de saı́da (PORT), em
que, representada pelo hexadecimal 0x07, se ativa resistores
pull-up nas colunas (pinos 0-2), que ficam em estado alto por
padrão, facilitando a detecção de botões pressionados.
b) Verificação (verificaTeclado): Essa função realiza a
varredura (escaneamento) do teclado para identificar se um
botão foi pressionado e, em caso positivo, retorna o caractere
correspondente. Para isso, inicialmente é criada uma matriz
(4x3) com a distribuição do teclado, sendo cada [linha][coluna]
um botão especı́fico. Em seguida são realizadas a varredura
de linhas e verificação de colunas, na qual a função ativa uma
linha de cada vez e verifica todas as colunas em busca de
um botão pressionado. Quando um botão é pressionado, ele
conecta a linha ativa à coluna correspondente, gerando um
estado baixo detectável. Vale ressaltar que caso nenhuma tecla
seja pressionada o loop retorna um caractere nulo, indicando
que não houve interação. Além disso, nessa parte do código
pode-se citar comandos que visam eliminar ruı́dos mecânicos
ao pressionar botão (debouncing), comandos que preparam o
sistema para aguardar até que o botão seja liberado e comandos
que indicam o retorno do caractere correspondente da matriz
teclas.
E. EEPROM
Na EEPROM são armazenadas informações que precisam
ser preservadas mesmo após o desligamento do sistema. Nesse
sentido, o código relatado, além de inicializar um usuário
padrão por meio da memória não volátil salva e carrega dados
de usuário (nome de usuário e senha) em suas posições. Para
isso são usadas ao todo 3 funções:
a) Salvar Usuário (salvarUsuarioNaEEPROM): Essa
função tem como objetivo gravar o nome de usuário e a senha
de um usuário em uma posição especı́fica da memória EEPROM. Para isso, inicialmente, é calculado o endereço inicial
na EEPROM com base em um ı́ndice “index”, que representa
a posição do usuário na tabela de dados. Cada usuário ocupa
um espaço de tamanho fixo, que é considerado no cálculo de
endereço. Em seguida, grava o nome do usuário no espaço
reservado a partir do endereço calculado, e após isso, grava
a senha no endereço imediatamente subsequente, concluindo
o processo de salvamento. Além disso, a função utiliza o
comando de código eeprom update block, que verifica se
os dados a serem gravados são diferentes dos já existentes
antes de realizar a escrita, otimizando o uso da memória e
aumentando sua durabilidade.
b) Carregar Usuário (carregarUsuarioDaEEPROM):
Essa função lê as informações de um usuário (nome e senha)
a partir de uma posição especı́fica na EEPROM. Para isso,
assim como no salvamento, é calculado o endereço base onde
os dados do usuário estão armazenados. Uma vez localizado,
os dados do nome e da senha do usuário são, respectivamente,
lidos e copiados para o buffer “usuário” e o buffer “senha”.
c) Inicializar Usuário (inicializaUsuariosEEPROM):
Nessa função ocorre a gravação de um usuário inicial (padrão)
na EEPROM, caso seja necessário inicializar o sistema com
credenciais predefinidas. Para isso, o código define as credenciais padrão, isto é, o nome de usuário ”00” e a senha ”1897”,
e as salva na posição de ı́ndice 0 da EEPROM, garantindo que
o primeiro usuário seja o inicial.
F. Gerenciamento de usuários
As duas funções que compõem o sistema de gerenciamento
de usuário tem como objetivo implementar novos usuários
ao mecanismo de fechadura inteligente e verificar credenciais
que estão armazenadas na sua memória EEPROM, assim
permitindo o cadastro e autenticação.
a) Adicionar Usuário (adicionarUsuario): Antes de
qualquer comando, a função inicia verificando se o número
atual de usuários (numUsuarios) atingiu o limite máximo permitido (MAX USUARIOS). Caso o limite tenha sido atingido,
uma mensagem de erro é exibida no LCD, e a função é
encerrada, porém, caso contrário, a mensagem “Novo Usuário”
é exibida no LCD e o sistema aguarda que o usuário digite
seu nome no teclado matricial, sendo esse processo finalizado
quando o botão “#” é pressionado, indicando o fim da entrada.
Em seguida, o nome é armazenado no “Array” e cada caractere
digitado é exibido no LCD. Seguindo o mesmo padrão, após
a última ação descrita, aparece no LCD a mensagem “Nova
Senha:”e o sistema aguarda que o usuário digite sua senha
no teclado matricial, entretanto, dessa vez, os caracteres não
são exibidos para garantir a privacidade do usuário, sendo
assim substituı́dos por asteriscos. Ainda, essa função é responsável por chamar o comando “salvarUsuarioNaEEPROM”
para gravar o novo nome e senha na posição correspondente
da EEPROM, por incrementar o número de cadastrados e por
apresentar, após cadastro, a mensagem “Adicionado!” no LCD
por alguns segundos.
b) Verificar Credenciais (verificarCredenciais): Essa
função é responsável pelo carregamento, comparação e
autenticação das credenciais inseridas no sistema. Ela verifica
se as credenciais inseridas correspondem a algum par de
usuários já cadastrados, percorrendo todas as posições da
EEPROM e carregando os dados de cada usuário, usando
“carregarUsuarioDaEEPROM”, e as comparando, por meio da
função “strcmp”. Nesse sistema, se houver alguma compatibilidade será retornada uma saı́da em nı́vel alto.
G. Resultados
COLOCAR AQUI OS RESULTADOS, COM FOTO DA
SIMULAÇÃO;
H. Figures and Tables
a) Positioning Figures and Tables: Place figures and
tables at the top and bottom of columns. Avoid placing them
in the middle of columns. Large figures and tables may span
across both columns. Figure captions should be below the
figures; table heads should appear above the tables. Insert
figures and tables after they are cited in the text. Use the
abbreviation “Fig. 1”, even at the beginning of a sentence.
TABLE I
TABLE T YPE S TYLES
Table
Table Column Head
Head
Table column subhead
Subhead
copy
More table copya
a Sample of a Table footnote.
Subhead
Fig. 1. Example of a figure caption.
Figure Labels: Use 8 point Times New Roman for Figure
labels. Use words rather than symbols or abbreviations when
writing Figure axis labels to avoid confusing the reader. As an
example, write the quantity “Magnetization”, or “Magnetization, M”, not just “M”. If including units in the label, present
them within parentheses. Do not label axes only with units. In
the example, write “Magnetization (A/m)” or “Magnetization
{A[m(1)]}”, not just “A/m”. Do not label axes with a ratio of
quantities and units. For example, write “Temperature (K)”,
not “Temperature/K”.
R EFER ÊNCIAS
[1] C. De Lima E Marco V. M. Villac¸a, Avr E Arduino: Tecnicas De Projeto. Clube de Autores, 2012. [Online]. Available:
https://books.google.com.br/books?id=ehJKEAAAQBAJ
[2] ——, “Adc - atmega328p,” 2020, acessado em: 28/08/2024.
[Online]. Available: https://www.youtube.com/watch?v=C2obS1u8p4o&
list=PLKM6TRQ8YHKcFVMo-Otdt PASehoOSEpF&index=7
0
You can add this document to your study collection(s)
Sign in Available only to authorized usersYou can add this document to your saved list
Sign in Available only to authorized users(For complaints, use another form )