ESP8266 Khóa cửa RFID

Tutorial này hướng dẫn bạn cách xây dựng một hệ thống khóa cửa bằng ESP8266, module RFID/NFC RC522, một relay, khóa solenoid hoặc khóa điện từ, và có thể có LCD tùy chọn. Để bạn dễ dàng thực hiện, tutorial này sẽ hướng dẫn xây dựng khóa RFID từ các bước đơn giản đến phức tạp. Cụ thể, chúng ta sẽ làm:

khóa cửa RFID ESP8266 NodeMCU

Nếu bạn muốn xây dựng hệ thống khóa cửa bằng mật khẩu, vui lòng tham khảo ESP8266 - Khóa cửa bằng bàn phím.

Phần cứng cần chuẩn bị

1×ESP8266 NodeMCU ESP-12E
1×Recommended: ESP8266 NodeMCU ESP-12E (Uno-form)
1×USB Cable Type-A to Type-C (for USB-A PC)
1×USB Cable Type-C to Type-C (for USB-C PC)
1×RFID/NFC RC522 Kit (reader + tags)
1×RFID Key Fob
1×RFID Card
1×Solenoid Lock
1×(Hoặc) Electromagnetic Lock
1×Relay
1×12V Power Adapter
1×DC Power Jack
1×dây jumper
1×(Khuyến nghị) Screw Terminal Expansion Board for ESP8266
1×(Khuyến nghị) Power Splitter for ESP8266 Type-C

Or you can buy the following kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Về Mô-đun RFID/NFC RC522 và Khóa điện từ

Nếu bạn chưa quen với Mô-đun RFID/NFC RC522, khóa điện từ, khóa solenoid (bao gồm bố trí chân, cách hoạt động và cách lập trình), thì bạn có thể tìm hiểu thêm bằng cách theo dõi các bài hướng dẫn này:

Các thành phần của hệ thống khóa cửa

Hệ thống khóa cửa gồm hai thành phần chính:

  • Khóa cửa: một ESP8266, một rơ-le, một đầu đọc RFID/NFC, một khóa solenoid hoặc một khóa điện từ
  • Chìa khóa cửa: thẻ RFID/NFC
thành phần khóa cửa RFID ESP8266 NodeMCU

Cách hoạt động của khóa cửa RFID/NFC

  • Người dùng chạm thẻ RFID/NFC lên đầu đọc RFID/NFC, và đầu đọc sẽ đọc UID từ thẻ.
  • ESP8266 sau đó lấy UID từ đầu đọc và so sánh với các UID đã được thiết lập trong mã.
  • Nếu UID khớp với một trong các UID được định trước, ESP8266 sẽ vô hiệu hóa khóa solenoid, từ đó mở khóa cửa.
  • Những thẻ này đóng vai trò là chìa khóa được ủy quyền.
  • Rơ-le sẽ được ESP8266 kích hoạt để khóa cửa sau một khoảng thời gian nhất định.

Sơ đồ đấu dây

  • Khóa cửa RFID RC522 kèm khóa solenoid
sơ đồ đấu dây cho khóa solenoid cửa dùng ESP8266 NodeMCU và RFID rc522.

This image is created using Fritzing. Click to enlarge image

Xem thêm Sơ đồ chân ESP8266Cách cấp nguồn cho ESP8266.

  • Khóa cửa RFID RC522 dùng khóa điện từ.
sơ đồ đấu nối hệ thống khóa cửa ESP8266 NodeMCU RFID rc522

This image is created using Fritzing. Click to enlarge image

※ Lưu ý:

Các nhà sản xuất có thể sắp xếp thứ tự các chân khác nhau, vì vậy điều quan trọng là dựa vào nhãn in trên mô-đun. Sơ đồ ghép chân được hiển thị ở phía trên cho thấy cách sắp xếp các chân cho các mô-đun do nhà sản xuất DIYables sản xuất.

Mã ESP8266 - Phím đơn

/* * Mã ESP8266 NodeMCU này được phát triển bởi newbiely.vn * Mã ESP8266 NodeMCU này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/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 } } }

Hướng dẫn từng bước

Để bắt đầu với ESP8266 trên Arduino IDE, hãy làm theo các bước sau:

  • Xem hướng dẫn ESP8266 - Cài đặt phần mềm nếu đây là lần đầu bạn sử dụng ESP8266.
  • Nối các thành phần như trong sơ đồ.
  • Kết nối bo mạch ESP8266 với máy tính của bạn bằng cáp USB.
  • Mở Arduino IDE trên máy tính của bạn.
  • Chọn bo mạch ESP8266 phù hợp, ví dụ như NodeMCU 1.0 (ESP-12E Module), và cổng COM tương ứng của nó.

Để xác định UID của thẻ RFID/NFC:

  • Nạp mã lên ESP8266 và mở Serial Monitor.
  • Chạm thẻ vào module RFID-RC522 và UID sẽ được hiển thị trên Serial Monitor.
COM6
Send
Tap RFID/NFC tag on reader Access denied for user with UID: 3A C9 6A CB
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Một khi bạn đã có UID:

  • Sửa đổi dòng 18 của mã ở trên để phù hợp với UID. Ví dụ, thay thế byte keytagUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; bằng byte keytagUID[4] = {0x3A, 0xC9, 0x6A, 0xCB};
  • Tải mã đã chỉnh sửa lên ESP8266.
  • Đặt thẻ RFID/NFC lên module RFID-RC522.
  • Kiểm tra đầu ra trên Serial Monitor.
COM6
Send
Tap RFID/NFC tag on reader Access is granted
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Xác nhận rằng khóa điện từ không bị khóa.
  • Chạm một thẻ RFID/NFC khác lên mô-đun RFID-RC522.
  • Kiểm tra đầu ra trên Serial Monitor.
COM6
Send
Tap RFID/NFC tag on reader Access is granted Access denied for user with UID: BD 1E 1D 22
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

※ Lưu ý:

  • Để thuận tiện cho việc thử nghiệm, thời gian mở khóa đã được đặt là 2 giây; tuy nhiên, nên được tăng lên cho mục đích sử dụng thực tế hoặc trình diễn.
  • Việc cài đặt thư viện MFRC522 là cần thiết. Để biết thêm thông tin, vui lòng tham khảo ESP8266 - RFID.

Mã ESP8266 - Nhiều phím

Hãy hình dung một căn phòng mà chỉ có người quản lý và thư ký được phép tiếp cận.

Trong trường hợp này, cần hai thẻ RFID/NFC: một dành cho người quản lý và thẻ kia dành cho thư ký. UID của hai thẻ phải được chỉ định trong mã nguồn.

/* * Mã ESP8266 NodeMCU này được phát triển bởi newbiely.vn * Mã ESP8266 NodeMCU này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/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 } } }

Lặp lại các bước như trước, và sau đó chạm từng thẻ lên mô-đun RFID-RC522. Kết quả hiển thị trên Serial Monitor sẽ như sau:

COM6
Send
Tap RFID/NFC tag on reader Access is granted for secretary Access is granted for manager
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Bạn có thể mở rộng đoạn mã ở trên để bao gồm ba, bốn hoặc nhiều thẻ hơn.

Thêm màn hình LCD vào khóa cửa RFID

Chúng ta có thể thêm một màn hình LCD tùy chọn để hiển thị trạng thái truy cập cho người dùng (ví dụ: ĐƯỢC CHO PHÉP / BỊ TỪ CHỐI). Bạn có thể tìm hiểu thêm về LCD trong ESP8266 - Màn hình LCD

Sơ đồ nối dây - Hệ thống khóa cửa sử dụng RFID, khóa solenoid hoặc khóa điện từ, và màn hình LCD

sơ đồ đấu nối lcd cho khóa cửa ESP8266 NodeMCU RFID rc522

This image is created using Fritzing. Click to enlarge image

Xin lưu ý rằng trong sơ đồ đấu nối ở trên, nguồn 5V được bổ sung vì chân 5V của ESP8266 không thể cung cấp đủ nguồn cho cả relay và LCD cùng lúc.

Mã nguồn ESP8266 - Hệ thống khóa cửa có mật khẩu bằng thẻ RFID RC522, khóa solenoid hoặc khóa điện từ, và màn hình LCD

/* * Mã ESP8266 NodeMCU này được phát triển bởi newbiely.vn * Mã ESP8266 NodeMCU này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/esp8266/esp8266-rfid-door-lock */ #include <SPI.h> #include <MFRC522.h> #include <LiquidCrystal_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); LiquidCrystal_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 } } }

※ Lưu ý:

Địa chỉ của màn hình LCD có thể khác nhau tùy thuộc vào nhà sản xuất. Chúng tôi đã sử dụng 0x27 trong mã của mình, như được chỉ định bởi DIYables.

Thêm cảm biến cửa cho ổ khóa RFID

Trong mã đã được đề cập ở trên, ESP8266 sẽ khóa cửa sau một khoảng thời gian kể từ khi mở khóa. Tuy nhiên, trong các ứng dụng thực tế, một cảm biến cửa thường được thêm vào hệ thống. Nếu ESP8266 nhận thấy cửa đã đóng, nó sẽ khóa cửa ngay lập tức thay vì chờ hết thời gian chờ.

Để tránh làm bạn choáng ngợp, chúng tôi đã không đưa cảm biến cửa vào sơ đồ nối dây và mã nguồn. Thay vào đó, phần này để bạn tự do sáng tạo. Bạn có thể tham khảo các hướng dẫn ESP8266 - Cảm biến cửaESP8266 - Cảm biến cửa - Rơ-le để có thêm hướng dẫn.

Quản lý và lưu trữ các khóa RFID hợp lệ vào EEPROM

Đoạn mã phía trên có các khóa RFID hợp lệ (UID) được nhúng cứng vào mã ESP8266. Điều này có nghĩa là nếu bạn muốn thêm hoặc xóa khóa, bạn phải chỉnh sửa mã và tải lên lại cho ESP8266, điều này thật bất tiện.

Trong các ứng dụng thực tế, cần quản lý các khóa RFID mà không phải chỉnh sửa và tải lên mã nguồn mỗi lần. Để thực hiện điều này, các khóa RFID có thể được lưu trữ trong EEPROM thay vì được ghi cố định trong mã. Do đó, cần một phương pháp để dễ dàng quản lý các khóa RFID từ EEPROM.

Có hai phương pháp có sẵn để quản lý khóa RFID trong EEPROM:

  • Chìa khóa RFID được dùng làm khóa chủ
    • Bằng cách sử dụng một khóa RFID làm khóa chủ ADD, các khóa mới có thể được thêm vào hệ thống. Khi ESP8266 phát hiện khóa chủ ADD, nó sẽ chuyển giữa chế độ ADD và chế độ HOẠT ĐỘNG.
    • Trong chế độ ADD, ESP8266 sẽ thêm mọi khóa mới nó phát hiện vào EEPROM.
    • Một phương pháp tương tự được sử dụng cho khóa chủ DELETE và chế độ DELETE.
  • Sử dụng các lệnh ADD/DELETE thông qua Serial/Bluetooth/IR
    • Các lệnh được truyền qua Serial/Bluetooth/IR, sử dụng các công cụ như Serial Monitor, ứng dụng Bluetooth hoặc bộ điều khiển IR.
    • Các lệnh bao gồm một chỉ thị (ADD/DELETE) và UID của khóa RFID.
    • Để tăng cường bảo mật, một mật khẩu cũng nên được đi kèm với lệnh. ESP8266 xác minh mật khẩu để xác định xem lệnh có hợp lệ hay không.

    Để có thể sử dụng bất kỳ một trong hai phương pháp ở trên, một lượng lớn mã ESP8266 cần được thêm vào. Đối với những người mới bắt đầu lập trình, điều này có thể là một nhiệm vụ đầy thách thức. Do đó, hướng dẫn này nhằm cung cấp sự hiểu biết cơ bản về hệ thống khóa cửa mà không làm người mới choáng ngợp bởi mã phức tạp. Nếu bạn muốn triển khai hệ thống này cho mục đích thực tế, hãy liên hệ với chúng tôi qua dịch vụ lập trình trả phí của chúng tôi.

Lưu lịch sử truy cập vào thẻ SD

Để theo dõi lịch sử truy cập, có thể cần lưu UID của chìa khóa RFID, trạng thái truy cập (ĐƯỢC CHO PHÉP/KHÔNG ĐƯỢC CHO PHÉP), và ngày giờ. Vì EEPROM không đủ dung lượng để lưu toàn bộ lịch sử, có thể dùng thẻ SD thay thế. Bạn có thể tìm hướng dẫn cho việc này trong tutorial ESP8266 - Ghi dữ liệu có dấu thời gian vào thẻ SD hướng dẫn.

Video Tutorial

Việc sản xuất video tốn rất nhiều thời gian. Nếu video hướng dẫn hữu ích cho việc học của bạn, hãy đăng ký kênh YouTube để ủng hộ. Nếu nhu cầu đủ cao, chúng tôi sẽ cố gắng làm thêm nhiều video.