Arduino Nano - Fechadura de Porta com Teclado

Este tutorial ensina como construir um sistema de fechadura de porta protegido por senha usando Arduino Nano, teclado, trava solenoide ou trava eletromagnética e display LCD. Veja abaixo como o sistema de fechadura de porta vai funcionar:

Para facilitar, o tutorial é dividido em várias etapas, do fácil ao difícil:

Hardware Necessário

1×Official Arduino Nano
1×Alternatively, DIYables Nano V3.0 Development Board
1×Cabo USB A para Mini-B
1×Teclado 3x4 and 4x4 Kit
1×Relé
1×Fechadura Solenoide
1×Fonte de Alimentação 12V
1×Conector de Alimentação DC
1×Fios Jumper
1×(Opcional) Electromagnetic Lock
1×(Opcional) LCD I2C
1×LCD I2C 1602 Display Compact-Size 5V
1×(Recomendado) Placa de Expansão com Bornes de Parafuso para Arduino Nano
1×(Recomendado) Placa de Expansão Breakout para Arduino Nano
1×(Recomendado) Divisor de Alimentação para Arduino Nano

Or you can buy the following kits:

1×DIYables Sensor Kit (18 sensors/displays)
Divulgação: Alguns dos links desta seção são links de afiliado da Amazon. Podemos receber uma comissão pelas compras feitas por meio desses links, sem custo adicional para você. Agradecemos o seu apoio.

Buy Note: Alternatively, you can assemble the LCD I2C display using LCD 1602 Display and PCF8574 I2C Adapter Module.

Sobre o Teclado, a Trava Solenoide, a Trava Eletromagnética e o Display LCD

Tanto a trava solenoide quanto a trava eletromagnética são usadas para trancar/destrancar a porta. Elas diferem principalmente no projeto mecânico. A ligação delas ao Arduino Nano é parecida. O código do Arduino Nano para controlá-las é o mesmo.

Se você não conhece o teclado, a trava solenoide, a trava eletromagnética e o display LCD (pinagem, como funcionam, como programar ...), os tutoriais a seguir podem ajudar você a aprender:

Diagrama de Ligação

  • Diagrama de Ligação com Arduino Nano, teclado e trava solenoide
The wiring diagram between Arduino Nano and, keypad, solenoid lock

This image is created using Fritzing. Click to enlarge image

  • Diagrama de Ligação com Arduino Nano, teclado e trava eletromagnética
The wiring diagram between Arduino Nano and, keypad, electromagnetic lock

This image is created using Fritzing. Click to enlarge image

Código Arduino Nano - Fechadura de Porta com Teclado

/* * Este código de Arduino Nano foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano/arduino-nano-keypad-door-lock */ #include <Keypad.h> const int ROW_NUM = 4; //four rows const int COLUMN_NUM = 3; //four columns const int RELAY_PIN = 2; // The Arduino Nano pin connected to the IN pin of relay module const byte pin_rows[ROW_NUM] = {10, 9, 8, 7}; // The Arduino Nano pin connected to the row pins of the keypad const byte pin_column[COLUMN_NUM] = {6, 5, 4}; // The Arduino Nano pin connected to the column pins of the keypad char key_layout[ROW_NUM][COLUMN_NUM] = { {'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}, {'*', '0', '#'} }; Keypad keypad = Keypad( makeKeymap(key_layout), pin_rows, pin_column, ROW_NUM, COLUMN_NUM); const String password = "1234"; // change your password here String input_password; void setup() { Serial.begin(9600); input_password.reserve(32); // maximum input characters is 32, change if needed pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, HIGH); // lock the door } void loop() { char key = keypad.getKey(); if (key) { Serial.println(key); if (key == '*') { input_password = ""; // reset the input password } else if (key == '#') { if (input_password == password) { Serial.println("The correct password! Unlocking the door in 20 seconds"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 20 seconds delay(20000); digitalWrite(RELAY_PIN, HIGH); // lock the door } else { Serial.println("The incorrect password! try again"); } input_password = ""; // reset the input password } else { input_password += key; // append new character to input password string } } }

※ Nota:

O endereço do LCD pode variar dependendo do fabricante. No nosso código, usamos 0x27, conforme especificado pela DIYables.

Passos Rápidos

  • Conecte um cabo USB ao Arduino Nano e ao PC.
  • Abra a Arduino IDE e selecione a placa e a porta apropriadas.
  • Clique no ícone Libraries na barra lateral esquerda da Arduino IDE.
  • Pesquise por “keypad” e localize a biblioteca keypad criada por Mark Stanley e Alexander Brevig.
  • Pressione o botão Install para instalar a biblioteca keypad.
Arduino Nano keypad library
  • Copie o código acima e abra-o com a Arduino IDE.
  • Clique no botão Upload para fazer o upload do código para o Arduino Nano.
  • Abra o Serial Monitor.
  • Pressione as teclas 12345 seguidas do símbolo #.
  • Em seguida, pressione as teclas 1234 seguidas do símbolo #.
  • Observe o estado da lingueta da trava durante 20 segundos.
  • Confira o resultado no Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' on 'COM15')
New Line
9600 baud
The incorrect password! try again The correct password! Unlocking the door in 20 seconds
Ln 11, Col 1
Arduino Nano on COM15
2

Explicação do Código

As senhas válidas são pré-definidas no código do Arduino Nano. Uma string é usada para armazenar a senha digitada pelos usuários, chamada de input string. No teclado, duas teclas (* e #) são usadas para fins especiais: limpar a senha e encerrar a senha. O sistema funciona da seguinte forma:

  • Exceto pelas duas teclas especiais, se qualquer outra tecla for pressionada, ela é adicionada à input string.
  • Se * for pressionada, a input string é limpa. Isso pode ser usado para iniciar ou reiniciar a digitação da senha.
  • Se # for pressionada:
    • O Arduino Nano compara a input string com as senhas pré-definidas. Se ela corresponder a uma das senhas pré-definidas, o Arduino Nano controla o relé para destrancar a porta.
    • Independentemente de a senha estar correta ou não, o Arduino Nano limpa a input string para a próxima entrada.

Código Arduino Nano - Várias Senhas

/* * Este código de Arduino Nano foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano/arduino-nano-keypad-door-lock */ #include <Keypad.h> const int ROW_NUM = 4; //four rows const int COLUMN_NUM = 3; //four columns const int RELAY_PIN = 2; // The Arduino Nano pin connected to the IN pin of relay module const byte pin_rows[ROW_NUM] = {10, 9, 8, 7}; // The Arduino Nano pin connected to the row pins of the keypad const byte pin_column[COLUMN_NUM] = {6, 5, 4}; // The Arduino Nano pin connected to the column pins of the keypad char key_layout[ROW_NUM][COLUMN_NUM] = { {'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}, {'*', '0', '#'} }; Keypad keypad = Keypad( makeKeymap(key_layout), pin_rows, pin_column, ROW_NUM, COLUMN_NUM); const String password_1 = "1234"; // change your password here const String password_2 = "5642"; // change your password here const String password_3 = "12345"; // change your password here String input_password; void setup() { Serial.begin(9600); input_password.reserve(32); // maximum input characters is 33, change if needed pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, LOW); // lock the door } void loop() { char key = keypad.getKey(); if (key) { Serial.println(key); if (key == '*') { input_password = ""; // reset the input password } else if (key == '#') { if (input_password == password_1 || input_password == password_2 || input_password == password_3) { Serial.println("The correct password! Unlocking the door in 20 seconds"); digitalWrite(RELAY_PIN, HIGH); // unlock the door for 20 seconds delay(20000); digitalWrite(RELAY_PIN, LOW); // lock the door } else { Serial.println("The incorrect password! try again"); } input_password = ""; // reset the input password } else { input_password += key; // append new character to input password string } } }

Adicionando um Display LCD à Fechadura de Porta RFID

Opcionalmente, podemos adicionar um display LCD para mostrar o status (por exemplo, GRANTED/DENIED) aos usuários.

Diagrama de ligação - Sistema de fechadura de porta usando teclado, trava solenoide ou trava eletromagnética e display LCD

The wiring diagram between Arduino Nano and door lock system lcd

This image is created using Fritzing. Click to enlarge image

Observe que, no diagrama de ligação acima, tanto o relé quanto o LCD podem não funcionar ou funcionar de forma instável devido à alimentação insuficiente. Recomendamos fortemente usar uma fonte de alimentação externa para o relé e para o LCD. Consulte o diagrama de ligação a seguir como orientação:

The wiring diagram between Arduino Nano and door lock system lcd external power supply

This image is created using Fritzing. Click to enlarge image

Veja A melhor forma de alimentar o Arduino Nano e outros componentes.

Código Arduino Nano - Fechadura de Porta com Teclado

/* * Este código de Arduino Nano foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano/arduino-nano-keypad-door-lock */ #include <Keypad.h> #include <DIYables_LCD_I2C.h> const int ROW_NUM = 4; //four rows const int COLUMN_NUM = 3; //four columns const int RELAY_PIN = 2; // The Arduino Nano pin connected to the IN pin of relay module const byte pin_rows[ROW_NUM] = {10, 9, 8, 7}; // The Arduino Nano pin connected to the row pins of the keypad const byte pin_column[COLUMN_NUM] = {6, 5, 4}; // The Arduino Nano pin connected to the column pins of the keypad char key_layout[ROW_NUM][COLUMN_NUM] = { {'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}, {'*', '0', '#'} }; Keypad keypad = Keypad( makeKeymap(key_layout), pin_rows, pin_column, ROW_NUM, COLUMN_NUM); DIYables_LCD_I2C lcd(0x27, 16, 2); // I2C address 0x27 (from DIYables LCD), 16 column and 2 rows const String password_1 = "1234"; // change your password here const String password_2 = "5642"; // change your password here const String password_3 = "12345"; // change your password here String input_password; void setup() { Serial.begin(9600); input_password.reserve(32); // maximum input characters is 33, change if needed pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, HIGH); // lock the door lcd.init(); // Initialize the LCD I2C display lcd.backlight(); } void loop() { char key = keypad.getKey(); if (key) { Serial.println(key); if (key == '*') { input_password = ""; // reset the input password lcd.clear(); } else if (key == '#') { lcd.clear(); if (input_password == password_1 || input_password == password_2 || input_password == password_3) { Serial.println("password is correct"); lcd.setCursor(0, 0); lcd.print("CORRECT!"); lcd.setCursor(0, 1); lcd.print("DOOR UNLOCKED!"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 20 seconds delay(20000); digitalWrite(RELAY_PIN, HIGH); // lock the door } else { Serial.println("password is incorrect, try again"); lcd.setCursor(0, 0); lcd.print("INCORRECT!"); lcd.setCursor(0, 1); lcd.print("ACCESS DENIED!"); } input_password = ""; // reset the input password } else { if (input_password.length() == 0) { lcd.clear(); } input_password += key; // append new character to input password string lcd.setCursor(input_password.length(), 0); // move cursor to new position lcd.print('*'); // print * key as hiden character } } }

※ Nota:

O endereço do LCD pode variar dependendo do fabricante. Usamos 0x27 no nosso código, conforme especificado pela DIYables.

Adicionando o som de bipe quando o teclado é pressionado.

Podemos fazer a fechadura de porta parecer mais responsiva adicionando um buzzer piezoelétrico para gerar um bipe curto cada vez que uma tecla do teclado é pressionada.

É bem simples adicioná-lo. Por isso, deixamos esta parte para a sua criatividade. Você pode consultar o tutorial Arduino Nano - Bipe do Teclado para mais orientações.

Adicionando um sensor de porta à fechadura de porta com teclado

No código mencionado anteriormente, o Arduino Nano tranca a porta após um tempo limite desde o destrancamento. No entanto, em aplicações práticas, geralmente se adiciona um sensor de porta ao sistema. Se o Arduino Nano detectar que a porta está fechada, ele tranca a porta imediatamente em vez de esperar o tempo limite.

Para não sobrecarregar você, não incluímos o sensor de porta no diagrama de ligação e no código. Em vez disso, deixamos esta parte para a sua criatividade. Você pode consultar os tutoriais Arduino Nano - Sensor de Porta e Arduino Nano - Sensor de Porta controla Relé para mais orientações.

Gerenciando e armazenando as senhas válidas na EEPROM

O código acima tem senhas válidas (UID) fixas no código do Arduino Nano. Isso significa que, se você quiser adicionar ou remover senhas, precisa alterar o código e fazer o upload dele para o Arduino Nano novamente, o que é inconveniente.

Em aplicações reais, é necessário gerenciar as senhas sem ter que modificar e fazer o upload do código toda vez. Para isso, as senhas podem ser armazenadas na EEPROM em vez de fixas no código. Consequentemente, é preciso um método para gerenciar facilmente as senhas na EEPROM.

Há dois métodos disponíveis para gerenciar senhas na EEPROM:

  • Usar senhas mestras
    • Ao usar uma senha como senha mestra ADD, novas senhas podem ser adicionadas ao sistema. Quando o Arduino Nano detecta a senha mestra ADD, ele alterna entre o modo ADD e o modo OPERATION.
    • Durante o modo ADD, o Arduino Nano adiciona à EEPROM todas as novas senhas que detectar.
    • Uma abordagem semelhante é usada para a senha mestra DELETE e o modo DELETE.
  • Usar comandos ADD/DELETE via Serial/Bluetooth/IR
    • Os comandos são transmitidos via Serial/Bluetooth/IR, utilizando ferramentas como o Serial Monitor, um aplicativo Bluetooth ou um controle IR.
    • Os comandos consistem em uma diretiva (ADD/DELETE) e a senha.

    Para usar qualquer um dos dois métodos acima, é preciso adicionar uma quantidade considerável de código ao Arduino Nano. Para quem é novo em programação, isso pode ser uma tarefa desafiadora. Por isso, este tutorial tem como objetivo fornecer uma compreensão básica do sistema de fechadura de porta sem sobrecarregar os iniciantes com código complexo. Se você quiser implementar este sistema para fins práticos, entre em contato conosco através do nosso serviço de programação pago

Armazenando o histórico de acessos em um Cartão SD

Para acompanhar o histórico de acessos, pode ser necessário salvar o status do acesso (GRANTED/DENIED), além da data e da hora. Como a EEPROM não tem capacidade suficiente para armazenar o histórico inteiro, um cartão SD pode ser usado no lugar. Você encontra orientações neste tutorial Arduino Nano - Registrar Dados com Data e Hora em um Cartão SD.

Vídeo

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!