Mỗi khi về đến nhà, nếu trong tay đang phải xách rất nhiều đồ đạc mà lại phải dùng chìa khóa để mở cửa thì cũng phiền bạn nhỉ? Chúng ta hãy làm một giải pháp khóa cửa thông minh như sau:
Chúng ta sẽ dùng động cơ Servo để đóng và mở cửa ngôi nhà. Bạn có thể gắn servo vào mô hình nhà tương tự như hình dưới:
Như ta thấy, cánh quay của servo gắn với sợi dây sắt cứng nối với cánh cửa. Khi servo quay qua trái thì kéo cánh cửa mở ra và ngược lại khi trả về vị trí cũ ban đầu thì cánh cửa sẽ được đóng lại.
Viết chương trình
from ir_receiver import * from lcd_1602 import LCD1602 lcd1602 = LCD1602(0) lcd1602.backlight_on() pass_code = '1234' # khai báo mật khẩu cố định servo.position(0, 0) ir_rx.start() while True: if ir_rx.get_code() == IR_REMOTE_A: servo.position(0, 0) # khóa cửa lại elif ir_rx.get_code() == IR_REMOTE_B: # bắt đầu nhập mật mã lcd1602.clear() lcd1602.move_to(0, 0) lcd1602.putstr('Hay nhap mat ma:') input_code = '' while not (ir_rx.get_code() == IR_REMOTE_C): # liên tục đọc tín hiệu remote để nhập # mật mã cho đến khi phím C được nhấn print(ir_rx.get_raw_code()) if ir_rx.get_code() == IR_REMOTE_0: input_code = input_code + '0' ir_rx.clear_code() if ir_rx.get_code() == IR_REMOTE_1: input_code = input_code + '1' ir_rx.clear_code() if ir_rx.get_code() == IR_REMOTE_2: input_code = input_code + '2' ir_rx.clear_code() if ir_rx.get_code() == IR_REMOTE_3: input_code = input_code + '3' ir_rx.clear_code() if ir_rx.get_code() == IR_REMOTE_4: input_code = input_code + '4' ir_rx.clear_code() if ir_rx.get_code() == IR_REMOTE_5: input_code = input_code + '5' ir_rx.clear_code() if ir_rx.get_code() == IR_REMOTE_6: input_code = input_code + '6' ir_rx.clear_code() if ir_rx.get_code() == IR_REMOTE_7: input_code = input_code + '7' ir_rx.clear_code() if ir_rx.get_code() == IR_REMOTE_8: input_code = input_code + '8' ir_rx.clear_code() if ir_rx.get_code() == IR_REMOTE_9: input_code = input_code + '9' ir_rx.clear_code() lcd1602.move_to(0, 1) lcd1602.putstr(input_code) time.sleep(0.5) # nhập mật mã đã xong, cần kiểm tra và hiện kết quả lcd1602.clear() if input_code == pass_code: lcd1602.move_to(0, 1) lcd1602.putstr('Mat ma dung') servo.position(0, 90) else: lcd1602.move_to(0, 1) lcd1602.putstr('Mat ma sai')
pass_code = '1234' # khai báo mật khẩu cố định
Khai báo mật mã của ngôi nhà là 4 số “1234”.
servo.position(0, 0)
Ta cho Servo quay về góc 0 độ (vị trí mà cửa được khóa).
servo.position(index, degree)
Hàm điều khiển động cơ servo 180 độ quay tới một góc nào đó tức thời. Trong đó:
if ir_rx.get_code() == IR_REMOTE_A: servo.position(0, 0)
Trong vòng lặp while True, chúng ta liên tục kiểm tra tín hiệu từ remote.
elif ir_rx.get_code() == IR_REMOTE_B: lcd1602.clear() lcd1602.move_to(0, 0) lcd1602.putstr('Hay nhap mat ma:') input_code = ''
while not (ir_rx.get_code() == IR_REMOTE_C): # liên tục đọc tín hiệu remote để nhập # mật mã cho đến khi phím C được nhấn print(ir_rx.get_raw_code()) if ir_rx.get_code() == IR_REMOTE_0: input_code = input_code + '0' ir_rx.clear_code() if ir_rx.get_code() == IR_REMOTE_1: input_code = input_code + '1' ir_rx.clear_code() if ir_rx.get_code() == IR_REMOTE_2: input_code = input_code + '2' ir_rx.clear_code() if ir_rx.get_code() == IR_REMOTE_3: input_code = input_code + '3' ir_rx.clear_code() if ir_rx.get_code() == IR_REMOTE_4: input_code = input_code + '4' ir_rx.clear_code() if ir_rx.get_code() == IR_REMOTE_5: input_code = input_code + '5' ir_rx.clear_code() if ir_rx.get_code() == IR_REMOTE_6: input_code = input_code + '6' ir_rx.clear_code() if ir_rx.get_code() == IR_REMOTE_7: input_code = input_code + '7' ir_rx.clear_code() if ir_rx.get_code() == IR_REMOTE_8: input_code = input_code + '8' ir_rx.clear_code() if ir_rx.get_code() == IR_REMOTE_9: input_code = input_code + '9' ir_rx.clear_code() lcd1602.move_to(0, 1) lcd1602.putstr(input_code) time.sleep(0.5)
Đây là đoạn code chính để xử lý phần nhập mật mã. Nếu phím được nhấn chưa phải là phím C (kết thúc nhập mật mã) thì sẽ tiếp tục lưu nút được nhấn vào biến input_code và hiện lên màn hình LCD.
if input_code == pass_code: lcd1602.move_to(0, 1) lcd1602.putstr('Mat ma dung') servo.position(0, 90) else: lcd1602.move_to(0, 1) lcd1602.putstr('Mat ma sai')
Nếu phím C được nhấn, vòng lặp nhập mật mã sẽ kết thúc. Đến đây, chương trình sẽ kiểm tra mật mã đã nhập (được lưu trong biến input_code) có giống mật mã ta đã khai báo ban đầu không (là 1234).
Nếu giống thì sẽ mở khóa bằng cách cho Servo quay đến góc 90 độ. Ngược lại, nếu mật mã sai thì sẽ thông báo cho người dùng biết.
Như vậy, các bạn đã hoàn thành 5 project để hoàn thiện 5 chức năng khá thú vị của một ngôi nhà thông minh và hiện đại rồi. Bài tập dành cho bạn là hãy tìm cách tổng hợp code của cả 5 project thành một chương trình hoàn chỉnh cho ngôi nhà nhé.
Bạn có thể tham khảo chương trình mẫu có sẵn trên đường link chứa toàn bộ code mẫu của tài liệu này nhé (https://github.com/AITT-VN/xbuild_creator_kit/tree/main/MicroPython).