Arduino Hệ thống khóa cửa sử dụng mật khẩu

Trong hướng dẫn này, chúng ta sẽ học cách chế tạo hệ thống khóa cửa bằng mật khẩu. Hướng dẫn gồm hai phần chính:

Màn hình LCD là tùy chọn. Nó chỉ làm cho hệ thống tiện lợi hơn một chút.

Khi cửa được mở bằng mật khẩu đúng, cửa sẽ được giữ mở trong 20 giây, sau đó tự động khóa cửa lại. Mã Arduino hỗ trợ nhiều mật khẩu.

※ Lưu ý:

Chúng tôi cũng có các hướng dẫn về hệ thống khóa cửa khác:

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

1×Arduino Uno R3
1×USB 2.0 cable type A/B (for USB-A PC)
1×USB 2.0 cable type C/B (for USB-C PC)
1×Bàn phím ma trận 3x4 and 4x4 Kit
1×(Hoặc) Bàn phím ma trận 3x4
1×(Hoặc) Bàn phím ma trận 4x4
1×Relay
1×12V Power Adapter
1×DC Power Jack
1×Electromagnetic Lock
1×dây jumper
1×(Tùy chọn) LCD I2C
1×(Khuyến nghị) Screw Terminal Block Shield for Arduino Uno
1×(Khuyến nghị) Breadboard Shield for Arduino Uno
1×(Khuyến nghị) Enclosure for Arduino Uno
1×(Khuyến nghị) Prototyping Base Plate & Breadboard Kit for Arduino UNO

Or you can buy the following kits:

1×DIYables STEM V3 Starter Kit (Arduino included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Về bàn phím số, khóa điện từ và màn hình LCD

Nếu bạn chưa biết về khóa điện từ, bàn phím (Keypad) và LCD (pinout, cách hoạt động, cách lập trình ...), hãy tìm hiểu về chúng trong các bài hướng dẫn sau:

Cách hệ thống khóa cửa hoạt động

Các mật khẩu hợp lệ đã được định nghĩa sẵn trong mã Arduino.

Một chuỗi được dùng để lưu mật khẩu người dùng nhập, được gọi là input string. Trên bàn phím số, hai phím (*#) được dùng cho 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 trừ hai phím đặc biệt, nếu nhấn một phím khác, nó sẽ được thêm vào input string
  • Nếu nhấn *, input string được làm trống. Bạn có thể dùng nó để bắt đầu hoặc khởi động lại việc nhập mật khẩu
  • Nếu nhấn #:
    • Chuỗi nhập input string được so sánh với các mật khẩu được định sẵn. Nếu nó trùng khớp với một trong các mật khẩu được định sẵn, cửa được mở.
    • Dù mật khẩu đúng hay không, input string được làm trống cho lần nhập tiếp theo.

Sơ đồ đấu dây

  • Arduino - Hệ thống khóa cửa có mật khẩu bằng bàn phím, khóa điện từ
sơ đồ nối dây hệ thống khóa cửa Arduino

This image is created using Fritzing. Click to enlarge image

  • Arduino - Hệ thống khóa cửa bằng mật khẩu sử dụng keypad, khóa điện từ và màn hình LCD
sơ đồ đấu nối lcd cho hệ thống khóa cửa Arduino

This image is created using Fritzing. Click to enlarge image

Mã Arduino - Hệ thống khóa cửa bằng mật khẩu sử dụng bàn phím số, khóa điện từ

/* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino 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/arduino/arduino-door-lock-system-using-password */ #include <Keypad.h> const int RELAY_PIN = A0; // the Arduino pin, which connects to the IN pin of relay const int ROW_NUM = 4; //four rows const int COLUMN_NUM = 4; //four columns char keys[ROW_NUM][COLUMN_NUM] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad byte pin_column[COLUMN_NUM] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad Keypad keypad = Keypad( makeKeymap(keys), 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 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_1 || input_password == password_2 || input_password == password_3) { Serial.println("The password is correct, 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 password is incorrect, 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

  • Kết nối Arduino với máy tính qua cáp USB
  • Mở Arduino IDE, chọn board và cổng đúng
  • Đi tới biểu tượng Thư viện ở thanh bên trái của Arduino IDE.
  • Tìm kiếm “keypad”, sau đó tìm thư viện keypad do Mark Stanley và Alexander Brevig
  • Nhấp nút Cài đặt để cài đặt thư viện keypad.
thư viện bàn phím ma trận cho Arduino
  • Sao chép mã ở trên và mở bằng Arduino IDE
  • Nhấp vào nút Tải lên trên Arduino IDE để tải mã lên Arduino
  • Đặt tấm armatơ gần nam châm điện.
  • Mở Serial Monitor
  • Nhấn các phím 123456 và nhấn #
  • Nhấn các phím 1234ABC và nhấn #
  • Quan sát sự hút giữa tấm armatơ và nam châm điện trong 20 giây.
  • Xem kết quả trên Serial Monitor
COM6
Send
The password is incorrect, try again The password is correct, unlocking the door in 20 seconds
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Mã Arduino - Hệ thống khóa cửa bằng mật khẩu sử dụng bàn phím, khóa điện từ và LCD

/* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino 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/arduino/arduino-door-lock-system-using-password */ #include <Keypad.h> #include <LiquidCrystal_I2C.h> const int RELAY_PIN = A0; // the Arduino pin, which connects to the IN pin of relay const int ROW_NUM = 4; //four rows const int COLUMN_NUM = 4; //four columns char keys[ROW_NUM][COLUMN_NUM] = { {'1','2','3', 'A'}, {'4','5','6', 'B'}, {'7','8','9', 'C'}, {'*','0','#', 'D'} }; byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad byte pin_column[COLUMN_NUM] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM ); LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27 (from DIYables LCD), 16 column and 2 rows 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, HIGH); // lock the door lcd.init(); // initialize the lcd 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 } } }

※ Lưu ý:

Địa chỉ I2C của LCD có thể khác nhau tùy theo nhà sản xuất. Trong mã nguồn, chúng tôi đã sử dụng 0x27, theo quy định của nhà sản xuất DIYables.

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

  • Đi tới biểu tượng Thư viện ở thanh bên trái của IDE Arduino.
  • Tìm kiếm “LiquidCrystal I2C”, sau đó tìm thư viện LiquidCrystal_I2C của Frank de Brabander
  • Nhấn nút Cài đặt để cài đặt thư viện LiquidCrystal_I2C.
thư viện liquidcrystal i2c cho Arduino
  • Sao chép mã ở trên và mở bằng Arduino IDE
  • Nhấn nút Tải lên trên Arduino IDE để tải mã lên Arduino
  • Đặt tấm armature gần nam châm điện.
  • Nhập một mật khẩu sai, và sau đó nhập một mật khẩu đúng
  • Quan sát lực hút giữa tấm armature và nam châm điện trong 20 giây.
  • Hiển thị văn bản trên LCD

※ Lưu ý:

  • Trong các mã ở trên, để đơn giản, chúng tôi đã sử dụng hàm delay. Tốt hơn là dùng millis() thay cho delay(). Xem Cách sử dụng millis() thay cho delay()
  • Bạn có thể thêm một Arduino - Chuông Piezo để tạo âm beep mỗi khi bàn phím được nhấn.
  • Trong các mã ở trên, cửa sẽ bị khóa lại sau 20 giây. Bạn có thể thay thế nó bằng một Arduino - Cảm biến cửa. Cửa sẽ bị khóa khi cảm biến cửa nhận thấy cửa đã được người dùng đóng.
  • Trong mã ở trên, các mật khẩu được gán sẵn. Trong thực tế, nó nên có thể thêm/xóa/thay đổi mật khẩu một cách động thông qua một chế độ đặc biệt. Nếu vậy, các mật khẩu nên được lưu trên bộ nhớ EEPROM. Số lượng mật khẩu có thể lưu phụ thuộc vào kích thước EEPROM. Mã sẽ trở nên phức tạp. Nếu bạn muốn xây dựng hệ thống như vậy, chúng tôi cung cấp một dịch vụ lập trình tự do. Vui lòng liên hệ với chúng tôi.

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.