Trava Elétrica com Senha – Comentários sobre o Sketch!
Trava Elétrica com Senha Acionada por Teclado de Membrana – Comentários sobre o Sketch!
No artigo Trava Elétrica com Senha Acionada por Teclado de Membrana apresentamos a descrição do hardware, com detalhes sobre todos os componentes envolvidos e, na parte final do texto, o sketch desse projeto. Nesse artigo serão feitos comentários sobre o sketch mencionado, com o propósito de esclarecer o leitor sobre seu funcionamento. Assim sendo, recomendamos que aproveite e siga conosco!
O sketch é iniciado com a inclusão das seguintes bibliotecas: <LiquidCrystal_I2C.h>, que trata do display LCD 16x2 com o modulo I2C, <Wire.h>, responsável pela comunicação com protocolo I2C, <Keypad.h>, para tratar do teclado de membrana e <EEPROM.h>, para a leitura e escrita em dispositivos do tipo EEPROM.
As arrays de 4 elementos, senha[4], senha_inicial[4] e nova_senha[4] são declaradas, com elementos do tipo caracter. Para uma melhor compreensão, recomendo que você faça uma rápida leitura da tabela ASCII com a conversão de números binários, decimais, octais e hexadecimais para caracteres no link https://pt.wikipedia.org/wiki/ASCII.
Você deve ter em mente que uma array é uma coleção de variáveis do mesmo tipo, referenciada por um nome comum. Para acessar um elemento específico de uma array são utilizados índices. Deve-se ter em mente também que os elementos de uma array são armazenados de forma sequencial na memória.
Uma senha será formada por quatro caracteres digitados no teclado de membrana. A variável inteira i é um índice usado nas arrays do sketch.
Também é declarada a variável tecla do tipo caracter, que receberá os valores digitados em cada tecla do teclado de membrana. Já a variável rele se refere ao pino 10 do Arduino e tem a função de acionar o relé ligado a trava elétrica.
Note que o teclado é uma matriz de 4 linhas por 4 colunas e é definido pelo conjunto de instruções abaixo:
const byte linhas = 4; const byte colunas = 4; char TecladoMembrana[linhas][colunas] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; // byte row_pins[linhas] = {A0,A1,A2,A3}; // byte column_pins[colunas] = {A4,A5,3,2}; byte row_pins[linhas] = {9,8,7,6}; byte column_pins[colunas] = {5,4,3,2}; Keypad teclado = Keypad( makeKeymap(TecladoMembrana), row_pins, column_pins, linhas, colunas);
Essas instruções, resumidamente, dizem o seguinte: o teclado com 4 linhas (const byte linhas) e 4 colunas (const byte colunas), definido na array TecladoMembrana, será ligado ao Arduino nos pinos de linhas (byte row_pins) e nos pinos de colunas (byte column_pins), mapeado pela biblioteca <Keypad.h> e identificado pelo nome teclado.
As linhas de código byte row_pins[linhas] = {9,8,7,6} e byte column_pins[colunas] = {5,4,3,2} indicam a utilização dos pinos digitais na ligação do teclado com o Arduino. Entretanto, será perfeitamente possível utilizar os pinos analógicos, como mostrado nas linhas de código marcadas como comentário // byte row_pins[linhas] = {A0,A1,A2,A3} e // byte column_pins[colunas] = {A4,A5,3,2}. Nessa opção foram utilizados os pinos analógicos A0, A1, A2 e A3 para as linhas, e os pinos analógicos A4 e A5 para as colunas, completando ainda as colunas com os pinos digitais 3 e 2.
Na parte do setup(), o sketch mostra no display LCD a mensagem “*- Modulo -*”, na linha 0 e ”Eletronica”, na linha 1, por três segundos e em seguida apresenta a frase ”Entre a Senha”. O passo seguinte é executar a função SENHAinicial(), que grava 1234 na EEPROM do Arduino como senha inicial.
O loop() coloca nível lógico alto no pino do rele como primeira ação de controle (digitalWrite(rele, HIGH)). Isso significa que a trava elétrica ligada ao relé não está acionada com nível lógico alto e somente será acionada com nível lógico baixo. Caso seja verificado que o acionamento da trava elétrica ocorre de forma diferente, com nível lógico alto (5 Volts), basta mudar isso no sketch.
Com a instrução tecla = teclado.getKey() é feita a leitura do teclado. Evidentemente, essa linha de código teclado.getKey() será interpretada pela biblioteca <Keypad.h>. Se a tecla pressionada é # (if(tecla==’#’)), será executada a função TrocaSenha() e se qualquer outra tecla (diferente de #) é pressionada o programa prosseguirá executando as instruções seguintes.
O sketch então interroga se há uma tecla sendo pressionada (if (tecla)) e cada vez que uma tecla é pressionada a array senha[4] é montada. Quando o índice i é igual a 4 a senha digitada é comparada com a senha inicial gravada na EEPROM do Arduino (if(!(strncmp(senha, senha_inicial,4)))). Caso a senha digitada seja igual a senha inicial, será mostrado no display LCD a mensagem “Senha Aceita” e o rele será acionado por 2 segundos com nível lógico LOW (baixo). Em seguida será mostrado no display LCD por 2 segundos a mensagem ”Use # p/ mudar” e finalmente será mostrado no display LCD a mensagem “Entre a Senha”. No caso da senha digitada ser diferente da senha inicial, a rotina debaixo de else será executada, mantendo o relé em nível lógico alto (digitalWrite(rele, HIGH)) e informando no display LCD que a senha está incorreta. Da mesma forma o display LCD mostrará a mensagem ”Use # p/ mudar” e, em seguida, a mensagem “Entre a Senha”. Esta é, digamos, a operação básica desse projeto.
Caso o usuário decida trocar a senha, deverá pressionar a tecla #. Nesse caso, o procedimento que o sketch executa é mostrado no fluxograma da figura 1.
Figura 1: Fluxograma da função TrocaSenha()
Note que a função TrocaSenha() solicita, em primeiro lugar, que seja digitada a senha atual, que é mostrada no display LCD à medida que vai sendo digitada. O índice usado é a variável inteira j. Enquanto o j for menor do que 4 (portanto, j será 0, 1, 2 e 3) através de while(j<4), a variável key, do tipo caracter, receberá os caracteres pressionados no teclado (char key=teclado.getKey()) e a array nova_senha[] será montada com quatro elementos (nova_senha[j++]=key). Essa senha digitada, gravada na array nova_senha será comparada com a senha inicial (if((strncmp(nova_senha, senha_inicial, 4)))), para a tomada de decisão. Se essa nova senha é diferente da senha inicial, será mostrado no display LCD a mensagem “Senha Incorreta” e, em seguida, a mensagem “Tente Novamente”. Por outro lado, se as senhas forem iguais, o sketch assumirá que o usuário que deseja trocar a senha sabe a senha inicialmente gravada e, portanto, poderá trocá-la. Então, a mensagem “Nova Senha” será mostrada no display LCD, para que o usuário faça a digitação da mesma. Em seguida, enquanto o índice j for menor do que 4 (while(j<4)), a variável key receberá os caracteres pressionados no teclado (char key=teclado.getKey()) e uma nova senha_inicial[] será montada (senha_inicial[j]=key), e então, como indicado na instrução seguinte, gravada na EEPROM do Arduino (EEPROM.write(j,key)). No passo seguinte, o sketch mostrará no display LCD a mensagem “Senha Okay “, e em seguida a mensagem “Entre a Senha”, finalizando assim o loop.
A função SENHAinicial() usa uma função for() com a variável inteira j como índice, que assume os valores 0, 1, 2 e 3. A cada rodada da função for() um caracter é gravado em uma posição da memória através da instrução EEPROM.write(endereço de memória, valor gravado).
Note que a instrução é EEPROM.write(j, j+49). Quando j é igual a 0, o endereço da EEPROM será igual a 0 e o valor gravado igual a 49. Quando j é igual a 1, o endereço da EEPROM será igual a 1 e o valor gravado igual a 50. Quando j é igual a 2, o endereço da EEPROM será igual a 2 e o valor gravado igual a 51. E, finalmente, quando j é igual a 3, o endereço da EEPROM será igual a 3 e o valor gravado igual a 52. É importante perceber que os valores decimais 49, 50, 51 e 52 são os números 1, 2, 3 e 4 na tabela ASCII, usada para padronizar os códigos para caracteres alfanuméricos (letras, sinais, números e acentos).
Da mesma forma, usando uma nova função for(), a array senha_inicial tem seu valor igual aos caracteres gravados na EEPROM do Arduino (senha_inicial[j]=EEPROM.read(j)).
Note ainda que se o projeto for desligado da energia, a função SENHAinicial() será executada quando a energia for religada e, consequentemente, a senha 1234 voltará a ser a senha correta e válida para liberar a trava elétrica. Para que, ao invés disso, a última senha trocada pelo usuário seja mantida em caso de queda de energia, basta adicionar as barras de comentários na linha de código dessa função (//SENHAinicial()), que se encontra na parte de setup() do sketch. Isso feito, a última senha trocada pelo usuário e gravada na EEPROM do Arduino será a senha correta e válida, mesmo que a energia seja desligada.
Espero que esse artigo tenha ajudado você a esclarecer suas dúvidas. Bem, é isso aí. Até a próxima.

Haroldo Mamede Coutinho Simões
Engenheiro de telecomunicações e pós-graduado em gerenciamento de negócios, tendo trabalhado em empresas de médio e grande porte por mais de 30 anos, atuando em diferentes projetos e departamentos. É instrutor de treinamento, tendo ministrado workshops em várias empresas, professor universitário em cursos MBA presenciais e tutor de cursos à distância. É apaixonado por tecnologia, especialmente pela plataforma Arduino e tudo de positivo que ela pode fazer pelas pessoas quando dela se aproximam.
VEJA TAMBÉM
Regador automático de plantas com Arduino
Aprenda neste artigo, como automatizar a rega de suas plantas, utilizando o Arduino NANO. Este projeto, além do baixo custo, pode ser montado em menos de uma hora e irá garantir que as suas plantas sempre tenham água disponível, garantido um crescimento adequado e...
Datalogger com cartão SD. Registre: temperatura, umidade, luminosidade e tensão)
Neste post, vamos aprender a como montar datalogger, para registrar em um cartão SD, temperatura, umidade relativa, tensão e nível de luminosidade. Esse tipo de dispositivo é extremamente útil para fazer análises de fenômenos que dependem do tempo. Por exemplo,...
Fita de LEDs RGB endereçáveis WS2812B e a biblioteca fastLED
No post de hoje, vamos conhecer a fita de LEDs WS2812B endereçáveis e como utilizá-la com o Arduino UNO. Essa fita de LEDs se destaca, em relação as outras do mercado, pelo fato de que seus LEDs podem ser controlados de maneira individual, permitindo que o...
NEWSLETTER
Assine nossa newsletter e receba as novidades.
0 comentários