Raspberry Pi Khóa Cửa Keypad

Tutorial này hướng dẫn bạn cách tạo hệ thống khóa cửa mật khẩu sử dụng Raspberry Pi, keypad và khóa solenoid hoặc khóa điện từ, và màn hình LCD.

Raspberry Pi bàn phím ma trận khóa cửa

Khi người dùng nhập mật khẩu đúng qua keypad, Raspberry Pi sẽ tắt khóa solenoid để mở cửa. Cửa sẽ giữ trạng thái mở trong một khoảng thời gian cụ thể (ví dụ: 20 giây) trước khi tự động khóa lại. Mã Raspberry Pi cho phép sử dụng nhiều mật khẩu khác nhau.

Để dễ dàng hơn, tutorial được chia thành nhiều bước, từ dễ đến khó:

Linh Kiện Cần Thiết

1×Raspberry Pi 5
1×Bàn phím ma trận 3x4 và 4x4 Kit
1×Relay
1×Khóa Solenoid
1×Adapter Nguồn 12V
1×Jack Nguồn DC
1×Dây Nối
1×(Tùy chọn) Khóa Điện Từ
1×(Khuyến nghị) Screw Terminal Block Shield for Raspberry Pi
1×(Khuyến nghị) Raspberry Pi Prototyping Base Plate & Breadboard Kit
1×(Khuyến nghị) HDMI Touch Screen Monitor for Raspberry Pi

Or you can buy the following kits:

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

Về Keypad, 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 chủ yếu khác nhau về thiết kế cơ học. Cách đấu dây với Raspberry Pi của chúng tương tự nhau. Mã Raspberry Pi để điều khiển chúng cũng giống nhau.

Nếu bạn chưa quen thuộc với keypad, khóa solenoid và khóa điện từ (chân kết nối, cách hoạt động, cách lập trình ...), các tutorial sau đây có thể giúp bạn tìm hiểu:

Sơ Đồ Đấu Dây

  • Sơ đồ đấu dây với Raspberry Pi, keypad và khóa solenoid
Raspberry Pi, bàn phím ma trận, khóa điện từ solenoid sơ đồ đấu dây

This image is created using Fritzing. Click to enlarge image

  • Sơ đồ đấu dây với Raspberry Pi, keypad và khóa điện từ
Raspberry Pi, bàn phím ma trận, electromagnetic lock sơ đồ đấu dây

This image is created using Fritzing. Click to enlarge image

Mã Raspberry Pi - Khóa Cửa Keypad

Các Bước Nhanh

  • Đảm bảo bạn đã cài đặt Raspbian hoặc hệ điều hành tương thích Raspberry Pi khác trên Pi của bạn.
  • Đảm bảo Raspberry Pi của bạn được kết nối với cùng một mạng cục bộ với PC của bạn.
  • Đảm bảo Raspberry Pi của bạn được kết nối internet nếu bạn cần cài đặt một số thư viện.
  • Nếu đây là lần đầu bạn sử dụng Raspberry Pi, xem Raspberry Pi - Cài Đặt Phần Mềm
  • Kết nối PC của bạn với Raspberry Pi qua SSH bằng SSH client tích hợp trên Linux và macOS hoặc PuTTY trên Windows. Xem cách kết nối PC với Raspberry Pi qua SSH.
  • Đảm bảo bạn đã cài đặt thư viện RPi.GPIO. Nếu chưa, hãy cài đặt bằng lệnh sau:
sudo apt-get update sudo apt-get install python3-rpi.gpio
  • Tạo file script Python keypad_lock.py và thêm đoạn code sau:
# Mã Raspberry Pi này được phát triển bởi newbiely.vn # Mã Raspberry Pi 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/raspberry-pi/raspberry-pi-keypad-door-lock import RPi.GPIO as GPIO import time # Define keypad layout KEYPAD = [ [1, 2, 3], [4, 5, 6], [7, 8, 9], ['*', 0, '#'] ] # Define GPIO pins for rows, columns, and relay ROW_PINS = [17, 27, 22, 24] COL_PINS = [25, 8, 7] RELAY_PIN = 16 # Adjust this to the actual GPIO pin connected to the relay # Password to unlock PASSWORD = [1, 2, 3, 4] # Initialize GPIO GPIO.setmode(GPIO.BCM) # Set up row pins as inputs with pull-up resistors for row_pin in ROW_PINS: GPIO.setup(row_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Set up column pins as outputs for col_pin in COL_PINS: GPIO.setup(col_pin, GPIO.OUT) GPIO.output(col_pin, GPIO.HIGH) # Set up relay pin as an output GPIO.setup(RELAY_PIN, GPIO.OUT) GPIO.output(RELAY_PIN, GPIO.LOW) # Initially, keep the relay off def get_key(): key = None # Scan each column for col_num, col_pin in enumerate(COL_PINS): GPIO.output(col_pin, GPIO.LOW) # Check each row for row_num, row_pin in enumerate(ROW_PINS): if GPIO.input(row_pin) == GPIO.LOW: key = KEYPAD[row_num][col_num] # Wait for key release while GPIO.input(row_pin) == GPIO.LOW: time.sleep(0.05) GPIO.output(col_pin, GPIO.HIGH) return key def check_password(input_password): return input_password == PASSWORD entered_keys = [] try: while True: pressed_key = get_key() if pressed_key is not None: print(f"Pressed: {pressed_key}") if pressed_key == '*': entered_keys = [] # reset the input password elif pressed_key == '#': if check_password(entered_keys): print("Password correct! Access granted.") GPIO.output(RELAY_PIN, GPIO.HIGH) # Activate the relay time.sleep(20) # Wait for 20 seconds GPIO.output(RELAY_PIN, GPIO.LOW) # Deactivate the relay break else: print("Incorrect password. Try again.") entered_keys = [] # reset the input password else: entered_keys.append(pressed_key) time.sleep(0.1) except KeyboardInterrupt: GPIO.cleanup()
  • Lưu file và chạy script Python bằng cách thực hiện lệnh sau trong terminal:
python3 keypad_lock.py
  • 1111 và nhấn #.
  • Sau đó gõ 1234 và nhấn #.
  • Kiểm tra trạng thái lưỡi khóa trong 20 giây.
  • Kiểm tra kết quả trên Serial Monitor.
PuTTY - Raspberry Pi
Incorrect password. Try again. Password correct! Access granted.

Script chạy trong vòng lặp vô hạn liên tục cho đến khi bạn nhấn Ctrl + C trong terminal.

Giải Thích Code

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

  • Ngoài hai phím đặc biệt, nếu phím khác được nhấn, nó sẽ được thêm vào chuỗi đầu vào.
  • Nếu * được nhấn, chuỗi đầu vào sẽ được xóa. Điều này có thể được sử dụng để bắt đầu hoặc nhập lại mật khẩu.
  • Nếu # được nhấn:
    • Raspberry Pi so sánh chuỗi đầu vào với các mật khẩu được định nghĩa trước. Nếu nó khớp với một trong các mật khẩu được định nghĩa trước, Raspberry Pi sẽ tắt relay để mở cửa.
    • Bất kể mật khẩu đúng hay sai, Raspberry Pi sẽ xóa chuỗi đầu vào cho lần nhập tiếp theo.

Mã Raspberry Pi - Nhiều Mật Khẩu

# Mã Raspberry Pi này được phát triển bởi newbiely.vn # Mã Raspberry Pi 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/raspberry-pi/raspberry-pi-keypad-door-lock import RPi.GPIO as GPIO import time # Define keypad layout KEYPAD = [ [1, 2, 3], [4, 5, 6], [7, 8, 9], ['*', 0, '#'] ] # Define GPIO pins for rows, columns, and relay ROW_PINS = [17, 27, 22, 24] COL_PINS = [25, 8, 7] RELAY_PIN = 16 # Adjust this to the actual GPIO pin connected to the relay # Passwords to unlock PASSWORDS = [ [1, 2, 3, 4], # 1st password 1234 [5, 6, 7, 8], # 2nd password 5678 [9, 0, 1, 2] # 3rd password 9012 ] # Initialize GPIO GPIO.setmode(GPIO.BCM) # Set up row pins as inputs with pull-up resistors for row_pin in ROW_PINS: GPIO.setup(row_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Set up column pins as outputs for col_pin in COL_PINS: GPIO.setup(col_pin, GPIO.OUT) GPIO.output(col_pin, GPIO.HIGH) # Set up relay pin as an output GPIO.setup(RELAY_PIN, GPIO.OUT) GPIO.output(RELAY_PIN, GPIO.LOW) # Initially, keep the relay off def get_key(): key = None # Scan each column for col_num, col_pin in enumerate(COL_PINS): GPIO.output(col_pin, GPIO.LOW) # Check each row for row_num, row_pin in enumerate(ROW_PINS): if GPIO.input(row_pin) == GPIO.LOW: key = KEYPAD[row_num][col_num] # Wait for key release while GPIO.input(row_pin) == GPIO.LOW: time.sleep(0.05) GPIO.output(col_pin, GPIO.HIGH) return key def check_password(input_password): return input_password in PASSWORDS entered_keys = [] try: while True: pressed_key = get_key() if pressed_key is not None: print(f"Pressed: {pressed_key}") if pressed_key == '*': entered_keys = [] # reset the input password elif pressed_key == '#': if check_password(entered_keys): print("Password correct! Access granted.") GPIO.output(RELAY_PIN, GPIO.HIGH) # Activate the relay time.sleep(20) # Wait for 20 seconds GPIO.output(RELAY_PIN, GPIO.LOW) # Deactivate the relay break else: print("Incorrect password. Try again.") entered_keys = [] # reset the input password else: entered_keys.append(pressed_key) time.sleep(0.1) except KeyboardInterrupt: GPIO.cleanup()

Thêm cảm biến cửa vào hệ thống khóa cửa keypad

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

Để 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ơ đồ đấu dây và code. 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ể xem các tutorial Raspberry Pi - Cảm Biến CửaRaspberry Pi - Cảm Biến Cửa - Relay để có thêm 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.