ESP8266 - Fechadura de Porta RFID

Este tutorial ensina como construir um sistema de fechadura de porta usando ESP8266, módulo RFID/NFC RC522, um relé, trava solenoide ou trava eletromagnética e, opcionalmente, LCD. Para facilitar, o tutorial ensina a construir a fechadura de porta RFID em etapas, das mais simples às mais complexas. Em detalhe, faremos:

fechadura de porta rfid com ESP8266 NodeMCU

Se você quiser construir um sistema de fechadura de porta com senha, consulte ESP8266 - Fechadura de Porta com Teclado.

Sobre o Módulo RFID/NFC RC522 e a Trava Eletromagnética

Se você não está familiarizado com o Módulo RFID/NFC RC522, a trava eletromagnética e a trava solenoide (incluindo pinagem, como funciona e como programar), você pode saber mais seguindo estes tutoriais:

Componentes do Sistema de Fechadura de Porta

O sistema de fechadura de porta é composto por dois componentes principais:

  • Fechadura: um ESP8266, um relé, um leitor RFID/NFC, uma trava solenoide ou uma trava eletromagnética
  • Chave da Porta: tags RFID/NFC
componentes da fechadura de porta rfid com ESP8266 NodeMCU

Como a Fechadura de Porta RFID/NFC Funciona

  • O usuário aproxima uma tag RFID/NFC do leitor RFID/NFC, que lê o UID da tag.
  • O ESP8266 então obtém o UID do leitor e o compara com os UIDs que foram definidos no código.
  • Se o UID corresponder a um dos UIDs predefinidos, o ESP8266 desativará a trava solenoide, destravando assim a porta.
  • Essas tags funcionam como as chaves autorizadas.
  • O relé será ativado pelo ESP8266 para travar a porta após um período de tempo específico.

Diagrama de Ligação

  • Fechadura de Porta RFID RC522 com Trava Solenoide
diagrama de ligação do ESP8266 NodeMCU com porta RFID RC522 e trava solenoide

This image is created using Fritzing. Click to enlarge image

Para mais informações, veja Pinagem do ESP8266 e como alimentar o ESP8266 e outros componentes.

  • Fechadura de Porta RFID RC522 com Trava Eletromagnética
diagrama de ligação do sistema de fechadura de porta ESP8266 NodeMCU RFID RC522

This image is created using Fritzing. Click to enlarge image

※ Nota:

Os fabricantes podem organizar a ordem dos pinos de forma diferente, por isso é importante confiar nos rótulos impressos no módulo. O diagrama de pinagem mostrado acima exibe a disposição dos pinos para módulos produzidos pelo fabricante DIYables.

Código ESP8266 - Chave Única

/* * Este código de ESP8266 NodeMCU foi desenvolvido por pt.newbiely.com * Este código de ESP8266 NodeMCU é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp8266/esp8266-rfid-door-lock */ #include <SPI.h> #include <MFRC522.h> #define SS_PIN D8 // The ESP8266 pin D8 #define RST_PIN D2 // The ESP8266 pin D2 #define RELAY_PIN D1 // The ESP8266 pin connects to relay MFRC522 rfid(SS_PIN, RST_PIN); byte keyTagUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; void setup() { Serial.begin(9600); SPI.begin(); // init SPI bus rfid.PCD_Init(); // init MFRC522 pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, HIGH); // lock the door Serial.println("Tap an RFID/NFC tag on the RFID-RC522 reader"); } void loop() { if (rfid.PICC_IsNewCardPresent()) { // new tag is available if (rfid.PICC_ReadCardSerial()) { // NUID has been readed MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); if (rfid.uid.uidByte[0] == keyTagUID[0] && rfid.uid.uidByte[1] == keyTagUID[1] && rfid.uid.uidByte[2] == keyTagUID[2] && rfid.uid.uidByte[3] == keyTagUID[3] ) { Serial.println("Access is granted"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door } else { Serial.print("Access denied, UID:"); for (int i = 0; i < rfid.uid.size; i++) { Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(rfid.uid.uidByte[i], HEX); } Serial.println(); } rfid.PICC_HaltA(); // halt PICC rfid.PCD_StopCrypto1(); // stop encryption on PCD } } }

Passos Rápidos

Para começar com o ESP8266 na Arduino IDE, siga estes passos:

  • Confira o tutorial como configurar o ambiente para ESP8266 na Arduino IDE se esta for a sua primeira vez usando o ESP8266.
  • Ligue os componentes como mostrado no diagrama.
  • Conecte a placa ESP8266 ao seu computador usando um cabo USB.
  • Abra a Arduino IDE no seu computador.
  • Escolha a placa ESP8266 correta, como (por exemplo, NodeMCU 1.0 (ESP-12E Module)), e a respectiva porta COM.

Para determinar o UID de uma tag RFID/NFC:

  • Faça upload do código para o ESP8266 e abra o Serial Monitor.
  • Aproxime a tag do módulo RFID-RC522 e o UID será exibido no Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Nodemcu 1.0 (ESP-12E Module)
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E Module)' on 'COM15')
New Line
9600 baud
Tap RFID/NFC tag on reader Access denied for user with UID: 3A C9 6A CB
Ln 11, Col 1
Nodemcu 1.0 (ESP-12E Module) on COM15
2

Depois de obter o UID:

  • Altere a linha 18 do código acima para refletir o UID. Por exemplo, substitua byte keytagUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; por byte keytagUID[4] = {0x3A, 0xC9, 0x6A, 0xCB};
  • Faça upload do código modificado para o ESP8266
  • Coloque uma tag RFID/NFC no módulo RFID-RC522
  • Verifique a saída no Serial Monitor
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Nodemcu 1.0 (ESP-12E Module)
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E Module)' on 'COM15')
New Line
9600 baud
Tap RFID/NFC tag on reader Access is granted
Ln 11, Col 1
Nodemcu 1.0 (ESP-12E Module) on COM15
2
  • Verifique se a trava eletromagnética não está travada.
  • Aproxime uma tag RFID/NFC diferente do módulo RFID-RC522.
  • Confira a saída no Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Nodemcu 1.0 (ESP-12E Module)
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E Module)' on 'COM15')
New Line
9600 baud
Tap RFID/NFC tag on reader Access is granted Access denied for user with UID: BD 1E 1D 22
Ln 11, Col 1
Nodemcu 1.0 (ESP-12E Module) on COM15
2

※ Nota:

  • Para facilitar o teste, o tempo de destravamento foi definido como 2 segundos; no entanto, ele deve ser aumentado para uso prático/demonstração.
  • É necessário instalar a biblioteca MFRC522. Para mais informações, consulte o tutorial ESP8266 - RFID/NFC RC522.

Código ESP8266 - Várias Chaves

Vamos imaginar uma sala na qual somente o gerente e a secretária podem entrar.

Neste caso, são necessárias duas tags RFID/NFC: uma para o gerente e a outra para a secretária. Os UIDs das duas tags devem ser especificados no código.

/* * Este código de ESP8266 NodeMCU foi desenvolvido por pt.newbiely.com * Este código de ESP8266 NodeMCU é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp8266/esp8266-rfid-door-lock */ #include <SPI.h> #include <MFRC522.h> #define SS_PIN D8 // The ESP8266 pin D8 #define RST_PIN D2 // The ESP8266 pin D2 #define RELAY_PIN D1 // The ESP8266 pin connects to relay MFRC522 rfid(SS_PIN, RST_PIN); byte managerKeyUID[4] = {0x3A, 0xC9, 0x6A, 0xCB}; byte secretaryKeyUID[4] = {0x30, 0x01, 0x8B, 0x15}; void setup() { Serial.begin(9600); SPI.begin(); // init SPI bus rfid.PCD_Init(); // init MFRC522 pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, HIGH); // lock the door Serial.println("Tap an RFID/NFC tag on the RFID-RC522 reader"); } void loop() { if (rfid.PICC_IsNewCardPresent()) { // new tag is available if (rfid.PICC_ReadCardSerial()) { // NUID has been readed MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); if (rfid.uid.uidByte[0] == managerKeyUID[0] && rfid.uid.uidByte[1] == managerKeyUID[1] && rfid.uid.uidByte[2] == managerKeyUID[2] && rfid.uid.uidByte[3] == managerKeyUID[3] ) { Serial.println("The access is granted to manager"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door } else if (rfid.uid.uidByte[0] == secretaryKeyUID[0] && rfid.uid.uidByte[1] == secretaryKeyUID[1] && rfid.uid.uidByte[2] == secretaryKeyUID[2] && rfid.uid.uidByte[3] == secretaryKeyUID[3] ) { Serial.println("The access is granted to secretary"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door } else { Serial.print("Access denied, UID:"); for (int i = 0; i < rfid.uid.size; i++) { Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(rfid.uid.uidByte[i], HEX); } Serial.println(); } rfid.PICC_HaltA(); // halt PICC rfid.PCD_StopCrypto1(); // stop encryption on PCD } } }

Repita os mesmos passos de antes e depois aproxime cada tag do módulo RFID-RC522. A saída no Serial Monitor deve aparecer da seguinte forma:

∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Nodemcu 1.0 (ESP-12E Module)
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E Module)' on 'COM15')
New Line
9600 baud
Tap RFID/NFC tag on reader Access is granted for secretary Access is granted for manager
Ln 11, Col 1
Nodemcu 1.0 (ESP-12E Module) on COM15
2

Você pode expandir o código escrito acima para incluir três, quatro ou mais tags.

Adicionando o Display LCD à Fechadura de Porta RFID

Opcionalmente, podemos adicionar um display LCD para mostrar aos usuários o status do acesso (por exemplo, GRANTED/DENIED). Você pode saber mais sobre LCD no tutorial ESP8266 - LCD

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

diagrama de ligação do ESP8266 NodeMCU com fechadura de porta RFID RC522 e LCD

This image is created using Fritzing. Click to enlarge image

Observe que, no diagrama de ligação acima, uma alimentação de 5V é adicionada porque o pino 5V do ESP8266 não consegue fornecer energia suficiente para o relé e o LCD ao mesmo tempo.

Código ESP8266 - Sistema de fechadura de porta com senha usando módulo RFID RC522, trava solenoide ou trava eletromagnética e display LCD

/* * Este código de ESP8266 NodeMCU foi desenvolvido por pt.newbiely.com * Este código de ESP8266 NodeMCU é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp8266/esp8266-rfid-door-lock */ #include <SPI.h> #include <MFRC522.h> #include <DIYables_LCD_I2C.h> #define SS_PIN D8 // The ESP8266 pin D8 #define RST_PIN D4 // The ESP8266 pin D4 #define RELAY_PIN D3 // The ESP8266 pin connects to relay MFRC522 rfid(SS_PIN, RST_PIN); DIYables_LCD_I2C lcd(0x27, 16, 2); // I2C address 0x27 (from DIYables LCD), 16 column and 2 rows byte managerKeyUID[4] = {0x3A, 0xC9, 0x6A, 0xCB}; byte secretaryKeyUID[4] = {0x30, 0x01, 0x8B, 0x15}; void setup() { Serial.begin(9600); SPI.begin(); // init SPI bus rfid.PCD_Init(); // init MFRC522 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(); Serial.println("Tap RFID/NFC Tag on reader"); } void loop() { if (rfid.PICC_IsNewCardPresent()) { // new tag is available if (rfid.PICC_ReadCardSerial()) { // NUID has been readed MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); if (rfid.uid.uidByte[0] == managerKeyUID[0] && rfid.uid.uidByte[1] == managerKeyUID[1] && rfid.uid.uidByte[2] == managerKeyUID[2] && rfid.uid.uidByte[3] == managerKeyUID[3] ) { Serial.println("Access is granted for manager"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds lcd.clear(); lcd.setCursor(0, 0); lcd.print("CORRECT!"); lcd.setCursor(0, 1); lcd.print("DOOR UNLOCKED!"); delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door lcd.clear(); } else if (rfid.uid.uidByte[0] == secretaryKeyUID[0] && rfid.uid.uidByte[1] == secretaryKeyUID[1] && rfid.uid.uidByte[2] == secretaryKeyUID[2] && rfid.uid.uidByte[3] == secretaryKeyUID[3] ) { Serial.println("Access is granted for secretary"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds lcd.clear(); lcd.setCursor(0, 0); lcd.print("CORRECT!"); lcd.setCursor(0, 1); lcd.print("DOOR UNLOCKED!"); delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door lcd.clear(); } else { Serial.print("Access denied for user with UID:"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("INCORRECT!"); lcd.setCursor(0, 1); lcd.print("ACCESS DENIED!"); for (int i = 0; i < rfid.uid.size; i++) { Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(rfid.uid.uidByte[i], HEX); } Serial.println(); } rfid.PICC_HaltA(); // halt PICC rfid.PCD_StopCrypto1(); // stop encryption on PCD } } }

※ Nota:

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

Adicionando um sensor de porta à fechadura de porta RFID

No código mencionado anteriormente, o ESP8266 trava a porta após um tempo limite desde o destravamento. No entanto, em aplicações práticas, normalmente um sensor de porta é adicionado ao sistema. Se o ESP8266 detectar que a porta está fechada, ele trava 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 conferir os tutoriais ESP8266 - Sensor de Porta e ESP8266 - Sensor de Porta controla Relé para mais orientações.

Gerenciando e armazenando as chaves RFID válidas na EEPROM

O código acima tem chaves RFID válidas (UID) fixadas no código do ESP8266. Isso significa que, se você quiser adicionar ou remover chaves, precisa alterar o código e fazer upload dele para o ESP8266 de novo, o que é inconveniente.

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

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

  • Chaves RFID como chaves mestras
    • Ao utilizar uma chave RFID como chave mestra ADD, novas chaves podem ser adicionadas ao sistema. Quando o ESP8266 detecta a chave mestra ADD, ele alterna entre o modo ADD e o modo OPERATION.
    • Durante o modo ADD, o ESP8266 adiciona à EEPROM qualquer nova chave que detectar.
    • Uma abordagem semelhante é usada para a chave 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 no UID da chave RFID.
    • Para melhorar a segurança, uma senha também deve ser incluída no comando. O ESP8266 verifica a senha para determinar se o comando é válido ou não.

    Para utilizar qualquer um dos dois métodos acima, uma quantidade considerável de código do ESP8266 precisa ser adicionada. Para quem é novo em programação, isso pode ser uma tarefa desafiadora. Por isso, este tutorial tem como objetivo oferecer 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 por meio 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 UID da chave RFID, o status do acesso (GRANTED/DENIED), além de data e 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ê pode encontrar orientações no tutorial ESP8266 - Registrar Dados com Carimbo de Data e Hora no 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!