ESP8266 Khóa cửa bằng bàn phím

Hướng dẫn này chỉ cho bạn cách xây dựng một hệ thống khóa cửa bằng mật khẩu sử dụng ESP8266, bàn phím và khóa solenoid hoặc khóa nam châm điện. Dưới đây là cách hệ thống khóa cửa sẽ hoạt động:

ESP8266 NodeMCU, bàn phím, khóa solenoid

Để làm cho nó dễ dàng, bài hướng dẫn được chia thành nhiều bước, từ dễ đến khó:

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×Bàn phím ma trận 3x4 and 4x4 Kit
1×Relay
1×Solenoid Lock
1×12V Power Adapter
1×DC Power Jack
1×dây jumper
1×(Tùy chọn) Electromagnetic Lock
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ề Bàn phím số, khóa solenoid, và khóa điện từ

Cả khóa solenoid và khóa điện từ đều được sử dụng để khóa/mở cửa. Chúng khác nhau chủ yếu ở thiết kế cơ khí. Việc nối dây của chúng với ESP8266 tương tự. Mã lập trình cho ESP8266 để điều khiển chúng là như nhau.

Nếu bạn chưa quen với bàn phím số, khóa solenoid, khóa điện từ (bản đồ các chân, cách hoạt động, cách lập trình ...), các bài hướng dẫn sau đây có thể giúp bạn tìm hiểu:

Sơ đồ đấu dây

  • Sơ đồ nối dây với ESP8266, bàn phím và khóa solenoid
sơ đồ đấu dây ESP8266 NodeMCU, bàn phím và khóa điện từ.

This image is created using Fritzing. Click to enlarge image

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

  • Sơ đồ mạch với ESP8266, bàn phím ma trận và khóa điện từ
ESP8266 NodeMCU, bàn phím số, sơ đồ đấu dây khóa điện từ

This image is created using Fritzing. Click to enlarge image

Mã ESP8266 - Khóa cửa bằng bàn phím

/* * 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-keypad-door-lock */ #include <Keypad.h> #define RELAY_PIN D0 // The ESP8266 pin connected to the IN pin of relay #define ROW_NUM 4 // 4 rows #define COLUMN_NUM 3 // 3 columns char key_layout[ROW_NUM][COLUMN_NUM] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'} }; byte pin_rows[ROW_NUM] = {D1, D2, D3, D4}; // The ESP8266 pins connect to the row pins byte pin_column[COLUMN_NUM] = {D5, D6, D7}; // The ESP8266 pins connect to the column pins Keypad keypad = Keypad( makeKeymap(key_layout), pin_rows, pin_column, ROW_NUM, COLUMN_NUM ); const String password_1 = "0156CAB"; // change your password here const String password_2 = "5642CD"; // change your password here const String password_3 = "545423"; // change your password here String input_password; void setup() { Serial.begin(9600); input_password.reserve(32); // maximum input characters is 32 pinMode(RELAY_PIN, 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_1 || input_password == password_2 || input_password == password_3) { Serial.println("Valid Password => unlock the door"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 20 seconds delay(20000); digitalWrite(RELAY_PIN, HIGH); // lock the door } else { Serial.println("Invalid Password => Try again"); } input_password = ""; // reset the input password } else { input_password += key; // append new character to input password string } } }

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 ESP8266 - Cài đặt phần mềm nếu đây là lần đầu bạn sử dụng ESP8266.
  • Kết nối các thành phần như được mô tả trong sơ đồ.
  • Kết nối 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 đúng, chẳng hạn như NodeMCU 1.0 (ESP-12E Module), và cổng COM tương ứng của nó.
  • Kết nối một cáp USB giữa ESP8266 và PC.
  • Mở Arduino IDE, chọn bo mạch và cổng đúng.
  • Nhấp vào biểu tượng Libraries ở thanh bên trái của Arduino IDE.
  • Tìm kiếm “keypad” và xác định thư viện keypad được tạo bởi Mark Stanley và Alexander Brevig.
  • Sau đó, nhấn nút Install để hoàn tất cài đặt thư viện keypad.
thư viện bàn phím ESP8266 NodeMCU
  • Sao chép mã ở trên và mở nó bằng Arduino IDE.
  • Nhấp vào nút Upload trên Arduino IDE để gửi mã đến ESP8266.
  • Mở Serial Monitor.
  • Nhấn các phím 12345 kèm theo ký tự #.
  • Tiếp theo nhấn các phím 1234ABC kèm theo ký tự #.
  • Kiểm tra trạng thái của lưỡi khóa trong 20 giây.
  • Xem kết quả trên Serial Monitor.
COM6
Send
The incorrect password! try again The correct password! Unlocking the door in 20 seconds
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Giải thích mã nguồn

Những mật khẩu hợp lệ được định nghĩa trước trong mã ESP8266. Một chuỗi được dùng để lưu mật khẩu đầu vào từ người dùng, được gọi là input string. Trên keypad, hai phím (*#) được dùng cho các mục đích đặc biệt: xóa mật khẩu và kết thúc mật khẩu. Hệ thống hoạt động như sau:

  • Ngoài hai phím đặc biệt, nếu một phím khác được nhấn, nó được thêm vào chuỗi nhập
  • Nếu * được nhấn, chuỗi nhập được xóa. Bạn có thể dùng nó để bắt đầu nhập hoặc nhập lại mật khẩu
  • Nếu # được nhấn:
    • ESP8266 so sánh chuỗi nhập với các mật khẩu được định sẵn. Nếu nó khớp với một trong các mật khẩu được định sẵn, ESP8266 điều khiển rơ-le để mở cửa.
    • Bất kể mật khẩu có đúng hay không, ESP8266 sẽ xóa chuỗi nhập cho lần nhập tiếp theo.

Mã ESP8266 - Nhiều Phím

/* * 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-keypad-door-lock */ #include <Keypad.h> #define RELAY_PIN D0 // The ESP8266 pin connected to the IN pin of relay #define ROW_NUM 4 // 4 rows #define COLUMN_NUM 3 // 3 columns char key_layout[ROW_NUM][COLUMN_NUM] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'} }; byte pin_rows[ROW_NUM] = {D1, D2, D3, D4}; // The ESP8266 pins connect to the row pins byte pin_column[COLUMN_NUM] = {D5, D6, D7}; // The ESP8266 pins connect to the column pins Keypad keypad = Keypad( makeKeymap(key_layout), pin_rows, pin_column, ROW_NUM, COLUMN_NUM ); const String password_1 = "1234ABC"; // change your password here const String password_2 = "5642CD"; // change your password here const String password_3 = "4545B"; // 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 } } }

Thêm tiếng bíp khi bàn phím số được nhấn.

Chúng ta có thể làm cho khóa cửa có phản hồi nhanh bằng cách thêm một buzzer Piezo để phát ra một tiếng bíp ngắn mỗi khi một phím trên keypad được nhấn.

Việc thêm nó khá đơn giản. Vì vậy, phần này để bạn tự do sáng tạo. Bạn có thể tham khảo tutorial ESP8266 - Bàn phím - Bíp để được hướng dẫn thêm.

Thêm cảm biến cửa cho khóa cửa có bàn phím

Trong đoạn mã đã được đề cập trước đó, 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 phát hiện cửa đang đóng, nó sẽ khóa cửa ngay lập tức thay vì đợi hết thời gian chờ.

Để tránh làm bạn quá tải, 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 đó, chúng tôi để phần này cho sự sáng tạo của bạn. 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 mật khẩu hợp lệ vào EEPROM.

Đoạn mã ở trên có các mật khẩu 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 mật khẩu, bạn phải chỉnh sửa mã và tải lại lên ESP8266 lần nữa, điều này thật bất tiện.

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

Có hai phương pháp có sẵn để quản lý mật khẩu trong EEPROM:

  • Sử dụng mật khẩu chủ
    • Việc sử dụng một mật khẩu làm mật khẩu chủ ADD cho phép thêm mật khẩu mới vào hệ thống. Khi ESP8266 phát hiện mật khẩu chủ ADD, nó sẽ chuyển giữa chế độ ADD và chế độ HOẠT ĐỘNG.
    • Trong chế độ ADD, ESP8266 sẽ ghi vào EEPROM mọi mật khẩu mới mà nó phát hiện.
    • Một cách tiếp cận tương tự được áp dụng cho mật khẩu 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à mật khẩu.

    Để có thể sử dụng bất kỳ hai phương pháp ở trên, một lượng mã ESP8266 đáng kể 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ụ khá khó khăn. Do đó, hướng dẫn này nhằm cung cấp hiểu biết cơ bản về hệ thống khóa cửa mà không làm người mới quá tải vớ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 thông qua dị 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 trạng thái truy cập (GRANTED/DENIED), và ngày và giờ. Vì EEPROM có dung lượng không đủ để lưu toàn bộ lịch sử, có thể sử dụng thẻ SD thay thế. Bạn có thể tìm hướng dẫn về điều này trong tutorial ESP8266 - Ghi dữ liệu có dấu thời gian vào thẻ SD.

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.