Việt Nam đang trong giai đoạn phát triển của thời kì nền công nghiệp 4.0, nền công nghiệp tập trung chủ yếu vào kỹ thuật số và hỗ trợ kết nối thông qua hệ thống mạng internet. Trước sự phát triển mạnh mẽ của nền công nghiệp cùng với bộ óc tư duy không ngừng sáng tạo của con người mà mô hình ngôi nhà thông minh đã được ra đời. Ngôi nhà thông minh là ngôi nhà được trang bị hệ thống công nghệ hiện đại cho phép tất cả đồ gia dụng, đèn, hệ thống điều hoà nhiệt độ, âm thanh, tivi, máy tính, an ninh…đều có thể giao tiếp với nhau và được điều khiển thông qua điện thoại thông minh hay máy tính bảng, và thậm chí là bằng giọng nói. Công nghệ ngôi nhà thông minh có ý nghĩa trong việc giúp cuộc sống ngày một tiện nghi hơn, giải phóng sức lao động của con người bằng sự trợ giúp của công nghệ hiện đại. Ngoài ra, ngôi nhà thông minh còn góp phần tiết kiệm điện năng, chỉ sử dụng điện năng vào những mục đích cần thiết, phục vụ trực tiếp đến đời sống con người, kiểm soát và loại trừ tất cả điện năng lãng phí không mang lại lợi ích cho đời sống. Không chỉ đơn thuần là sự kiểm soát các thiết bị mà ngôi nhà thông minh còn có khả năng học thói quen của chủ nhà và điều chỉnh các hoạt động của các thành phần trong hệ thống cho phù hợp với chủ nhà. Với những đặc tính ưu việt, công nghệ ngôi nhà thông minh đang dần là xu hướng khi quan tâm đến thiết kế và xây dựng nội thất, quản lý hoạt động bên trong của ngôi nhà trong giai đoạn cách mạng công nghệ. Trước nhu cầu sử dụng ngày càng tăng cùng với sự hiện đại, sang trọng và những tính năng công nghệ mà ngôi nhà thông minh mang lại có ý nghĩa trong việc giúp cuộc sống ngày một tiện nghi hơn, giải phóng sức lao động của con người bằng sự trợ giúp của công nghệ... Với ngôi nhà thông minh người sử dụng có thể kiểm soát ngôi nhà của mình một cách dễ dàng hơn. Ngoài ra, ngôi nhà thông minh còn góp phần tiết kiệm điện năng, chỉ sử dụng điện năng vào những mục đích cần thiết, phục vụ trực tiếp đến đời sống con người, kiểm soát và loại trừ tất cả điện năng lãng phí không mang lại lợi ích cho đời sống.
BỘ GIÁO DỤC VÀ ĐÀO ĐẠO TRƯỜNG ĐẠI HỌC CẦN THƠ TRƯỜNG BÁCH KHOA LUẬN VĂN TỐT NGHIỆP THIẾT KẾ VÀ XÂY DỰNG MƠ HÌNH NGƠI NHÀ THƠNG MINH CÁN BỘ HƯỚNG DẪN SINH VIÊN THỰC HIỆN TS Quách Ngọc Thịnh Tháng 05/2023 Mục lục MỤC LỤC MỤC LỤC i MỤC LỤC HÌNH iv MỤC LỤC BẢNG viii CHƯƠNG TỔNG QUAN VỀ NGÔI NHÀ THÔNG MINH 1.1 Giới thiệu chung 1.2 Các tiêu kỹ thuật 1.2.1 Chỉ tiêu ánh sáng 1.2.2 Chỉ tiêu thơng gió 1.2.3 Chỉ tiêu nhiệt độ .5 1.2.4 Chỉ tiêu an toàn 1.3 Một số chức nhà thông minh 1.4 Ưu điểm nhà thông minh .6 1.5 Nhược điểm nhà thông minh 1.6 Tầm quan trọng việc quản lý lượng 1.7 Nội dung đề tài .6 CHƯƠNG CƠ SỞ LÝ THUYẾT VỀ CÁC LINH KIỆN TRONG MƠ HÌNH 2.1 Cấu tạo hệ thống nhà thông minh 2.2 Nguyên lý hoạt động nhà thông minh 2.3 Các linh kiện mơ hình 2.3.1 Giới thiệu Arduino Mega2560 2.3.1.1 Sơ lược Arduino .9 2.3.1.2 Arduino Mega2560 10 2.3.2 Giới thiệu Module Wifi ESP8266 nodeMCU 12 2.3.3 Giới thiệu module cảm biến khí gas MQ2 14 2.3.4 Giới thiệu module cảm biến thân nhiệt chuyển động PIR SR505 15 2.3.5 Giới thiệu module cảm biến nhiệt độ độ ẩm DHT11 17 2.3.6 Giới thiệu module cảm biến mưa 18 2.3.7 Sơ lược Relay V 19 2.3.8 Giới thiệu module cảm biến thẻ từ RFID 20 2.3.9 Giới thiệu thiết bị hiển thị LCD 16×2 22 i Mục lục 2.3.10 Giới thiệu module cảm biến ánh sáng Photoresistor 23 2.3.11 Giới thiệu module đo điện AC giao tiếp UART PZEM - 004T .24 2.3.12 Giao tiếp I2C .25 2.3.13 Module còi chip 26 2.3.14 Giới thiệu bàn phím ma trận 4×4 27 2.3.15 Giới thiệu động servo 27 2.3.16 Các linh kiện khác 28 2.3.16.1 Dây bus UL2468 26AWG 28 2.3.16.2 Dây cắm USB 28 2.3.16.4 Nút nhấn chân 28 2.3.16.5 Đèn 29 2.3.16.6 Quạt tản nhiệt VDC 29 2.4 Phần mềm liên quan 30 2.4.1 Giới thiệu phần mềm Visual Studio Code 30 2.4.2 Giới thiệu ứng dụng Blynk 32 CHƯƠNG TÍNH TOÁN VÀ THIẾT KẾ 34 3.1 Thiết kế nhà thông minh 34 3.1.1 Yêu cầu thiết kế 34 3.1.2 Thiết kế chức thông minh cho khu vực nhà .34 3.1.3 Sơ đồ khối hệ thống nhà thông minh 35 3.1.4 Kích thước tổng thể ngơi nhà .36 3.2 Thiết kế khu vực nhà .37 3.2.1 Thiết kế chức thông minh khu vực sân 37 3.2.2 Thiết kế chức thơng minh khu vực phịng khách .38 3.2.3 Thiết kế chức thông minh khu vực phòng ngủ phòng ngủ .40 3.2.4 Thiết kế chức thông minh khu vực phòng bếp 40 3.2.5 Thiết kế chức thông minh khu vực nhà vệ sinh 41 3.3 Sơ đồ kết nối Blynk, Arduino Mega2560 ESP8266 .42 3.4 Lưu đồ thuật toán .42 3.4.1 Lưu đồ thuật toán điều khiển đèn quạt 42 3.4.1.1 Điều khiển app Blynk 43 3.4.1.2 Điều khiển nút nhấn 44 3.4.1.3 Điều khiển đèn cảm biến chuyển động PIR SR505 mini 46 3.4.1.4 Điều khiển đèn cảm biến ánh sáng Photoresistor .47 3.4.2 Lưu đồ thuật toán giám sát nhiệt độ độ ẩm cảm biến DHT11 48 3.4.3 Lưu đồ thuật toán mở cổng cảm biến thẻ từ RFID 49 ii Mục lục 3.4.4 Lưu đồ thuật toán điều khiển sào phơi quần áo cảm biến mưa 51 3.4.5 Lưu đồ thuật toán mở cửa mật 53 3.4.6 Lưu đồ thuật tốn điều khiển cịi báo cảm biến khí gas MQ2 55 3.4.7 Lưu đồ thuật toán module đo điện AC giao tiếp UART PZEM-004T 57 3.5 Sơ đồ đấu nối linh kiện 57 3.5.1 Sơ đồ đấu nối linh kiện khu vực phòng ngủ 57 3.5.2 Sơ đồ đấu nối linh kiện khu vực phòng ngủ 59 3.5.3 Sơ đồ đấu nối linh kiện khu vực nhà vệ sinh 60 3.5.4 Sơ đồ đấu nối linh kiện khu vực khu vực bếp 61 3.5.5 Sơ đồ đấu nối linh kiện khu vực phòng khách 62 3.5.6 Sơ đồ đấu nối linh kiện khu vực sân 65 3.5.7 Sơ đồ kết nối linh kiện hệ thống giám sát lượng 66 3.5.8 Sơ đồ kết nối Arduino Mega2560 với ESP8266 67 CHƯƠNG XÂY DỰNG MƠ HÌNH 69 4.1 Xây dựng mơ hình nhà thông minh 69 4.1.1 Vật liệu để làm mơ hình 69 4.1.2 Tổng quan mơ hình 69 4.2 Phương thức điều khiển khu vực .73 4.2.1 Khu vực sân 74 4.2.2 Khu vực phòng khách 79 4.2.3 Khu vực phòng ngủ phòng ngủ .84 4.2.4 Khu vực nhà vệ sinh 86 4.2.5 Khu vực nhà bếp 87 CHƯƠNG KẾT LUẬN VÀ KIẾN NGHỊ 90 5.1 Kết luận 90 5.2 Kiến nghị 90 TÀI LIỆU THAM KHẢO 92 PHỤ LỤC 1: CODE CHO ARDUINO MEGA2560 93 PHỤ LỤC 2: CODE CHO ESP8266 108 iii Mục lục hình MỤC LỤC HÌNH Hình 1.1 Dự báo thị trường SmartHome Việt Nam giai đoạn 2021-2025 Hình 1.2 Hệ thống nhà thơng minh BKAV .2 Hình 1.3 Ngơi nhà thông mịnh VSMARTHOME .3 Hình 1.4 Nhà thơng minh LUMI Hình 1.5 Mơ hình ngơi nhà thơng minh ACIS Hình 1.6 Một số chức nhà thông minh .5 Hình 2.1 Cấu hệ thống nhà thơng minh .8 Hình 2.2 Một số loại Arduino Arduino: Uno R3 (a); RedBoard Arduino (b); Arduino Leonado (c) Hình 2.3 Ứng dụng Arduino làm Robot điều khiển 10 Hình 2.4 Arduino Mega2560 10 Hình 2.5 Module Wifi ESP8266 nodeMCU 12 Hình 2.6 Sơ đồ chân Module Wifi ESP8266 nodeMCU 14 Hình 2.7 Module cảm biến khí gas MQ2 .15 Hình 2.8 Sơ đồ chân modul cảm biến khí gas MQ2 15 Hình 2.9 Module cảm biến chuyển động PIR HC-SR505 .16 Hình 2.10 Cấu tạo Module cảm biến chuyển động PIR HC-SR505 17 Hình 2.11 Module cảm biến đo nhiệt độ độ ẩm DHT11 .17 Hình 2.12 Module cảm biến mưa .18 Hình 2.13 Module Relay V 20 Hình 2.14 Module cảm biến thẻ từ RFID 21 Hình 2.15 Thiết bị hiển thị LCD 16 × 22 Hình 2.16 Sơ đồ chân thiết bị hiển thị LCD 16×2 23 Hình 2.17 Module cảm biến ánh sáng Photoresistor .23 Hình 2.18 Module đo điện AC giao tiếp UART PZEM - 004T 24 Hình 2.19 Ảnh biến dòng module đo điện AC giao tiếp UART PZEM-004T 25 Hình 2.20 Giao tiếp I2C 26 Hình 2.21 Còi Buzzer .26 Hình 2.22 Bàn phím ma trận 4×4 .27 Hình 2.23 Động servo SG90 .27 Hình 2.24 Dây Bus 28 Hình 2.25 Dây cáp USB 28 Hình 2.26 Nút nhấn chân 29 iv Mục lục hình Hình 2.27 Bóng đèn: LED trái ớt (a), LED ruồi (b) .29 Hình 2.28.Quạt tản nhiệt VDC .29 Hình 2.29 Phần mềm Visual Stuidio Code 30 Hình 2.30 Giao diện Visual Studio Code 32 Hình 2.31 Ứng dụng Blynk 32 Hình 2.32 Phương thức hoạt động ứng dụng Blynk 33 Hình 3.1 Sơ đồ khối phần cứng biểu diễn chức nhà thông minh 35 Hình 3.2 Bản vẽ mặt ngơi nhà 37 Hình 3.3 Sơ đồ kết nối Blynk, Arduino Mega2560 ESP8266 42 Hình 3.4 Lưu đồ thuật toán điều khiển đèn app Blynk 43 Hình 3.5 Lưu đồ thuật tốn điều khiển quạt app Blynk 44 Hình 3.6 Lưu đồ thuật toán điều khiển đèn nút nhấn 45 Hình 3.7 Lưu đồ thuật toán điều khiển quạt nút nhấn .46 Hình 3.8 Lưu đồ thuật tốn điều khiển đèn cảm biến thân nhiệt chuyển động PIR SR505 47 Hình 3.9 Lưu đồ thuật toán điều khiển đèn cảm biến ánh sáng Photoresistor 48 Hình 3.10 Lưu đồ thuật tốn giám sát nhiệt độ độ ẩm cảm biến DHT11 49 Hình 3.11 Lưu đồ thuật tốn điều khiển mở cổng cảm biến thẻ từ RFID .50 Hình 3.12 Lưu đồ thuật tốn điều khiển đóng mở cửa cổng Blynk 51 Hình 3.13 Lưu đồ thuật tốn điều khiển sào phơi quần áo cảm biến mưa 52 Hình 3.14 Lưu đồ thuật tốn điều khiển sào phơi quần áo Blynk 53 Hình 3.15 Lưu đồ thuật tốn mở cửa bàn phím ma trận 54 Hình 3.16 Lưu đồ thuật toán mở cửa app Blynk .55 Hình 3.17 Lưu đồ thuật tốn điều khiển cịi báo cảm biến khí gas MQ2 .56 Hình 3.18 Lưu đồ thuật tốn kết nối PZEM-004T với Arduino Mega2560 ESP8266 57 Hình 3.19 Sơ đồ đấu nối linh kiện khu vực phịng ngủ .58 Hình 3.20 Sơ đồ đấu nối linh kiện khu vực phòng ngủ .60 Hình 3.21 Sơ đồ đấu nối linh kiện khu vực nhà vệ sinh 61 Hình 3.22 Sơ đồ đấu nối linh kiện khu vực bếp .62 Hình 3.23 Sơ đồ đấu nối linh kiện khu vực phịng khách 64 Hình 3.24 Sơ đồ đấu nối linh kiện khu vực sân 65 Hình 3.25 Sơ đồ kết nối linh kiện hệ thống giám sát lượng 67 Hình 3.26 Sơ đồ kết nối linh kiện điều khiển qua wifi 68 Hình 4.1 Tấm fomex 69 Hình 4.2 Bản vẽ mặt mơ hình 70 v Mục lục hình Hình 4.3 Mơ hình hoạt động 71 Hình 4.4 Mơ hình chụp từ xuống .72 Hình 4.5 Mơ hình chụp từ trước sau 72 Hình 4.6 Mơ hình chụp từ bên phải 73 Hình 4.7 Mơ hình chụp từ bên trái 73 Hình 4.8 Mơ hình chụp từ sau trước 73 Hình 4.9 Khu vực sân .74 Hình 4.10 Cổng mơ hình 74 Hình 4.11 Nơi gắn đèn nút nhấn điều khiển 75 Hình 4.12 Nơi lắp cảm biến sào phơi đồ .75 Hình 4.13 Màn hình giao diện chế độ Manual app Blynk 76 Hình 4.14 Đèn sân sáng nhấn nút nhấn 76 Hình 4.15 Sào thu vào mái che 77 Hình 4.16 Sào kéo khỏi mái che 77 Hình 4.17 Giao diện điều khiển đèn sào phơi quần áo khu vực sân app Blynk 78 Hình 4.18 Màn hình giao diện chế độ Auto app Blynk 78 Hình 4.19 Giao diện điều khiển mở cổng app Blynk .79 Hình 4.20 Cổng mở 79 Hình 4.21 Ảnh khu vực phịng khách 80 Hình 4.22 Đèn sáng khu vực phòng khách 80 Hình 4.23 Quạt khu vực phòng khách quay 81 Hình 4.24 Giao diện điều khiển khu vực phịng khách app Blynk 81 Hình 4.25 Nhiệt độ độ ẩm hiển thị lên hình LCD 82 Hình 4.26 Màn hình hiển thị lúc khởi động 82 Hình 4.27 Màn hình hiển thị nhập mật “2222’ 82 Hình 4.28 Màn hình hiển thị nhập mật “2222” nhấn phím [#] mở cửa82 Hình 4.29 Màn hình hiển thị nhập mật vào khác “2222” 83 Hình 4.30 Màn hình hiển thị nhập mật khác “2222] nhấn phím [#] 83 Hình 4.31 Giao diện điều khiển mở cửa app Blynk 83 Hình 4.32 Cửa mở 84 Hình 4.33 Khu vực phịng ngủ 84 Hình 4.34 Khu vực phịng ngủ 85 Hình 4.35 Đèn phòng ngủ phòng ngủ hoạt động 85 Hình 4.36 Giao diện điều khiển phòng ngủ app Blynk 86 Hình 4.37 Giao diện điều khiển phòng ngủ app Blynk 86 Hình 4.38 Khu vực nhà vệ sinh 86 vi Mục lục hình Hình 4.39 Đèn nhà vệ sinh hoạt động 87 Hình 4.40 Giao diện điều khiển đèn WC app Blynk 87 Hình 4.41 Khu vực bếp 88 Hình 4.42 Đèn, quạt khu vực bếp hoạt động 88 Hình 4.43 Giao diện cảnh báo rị rỉ khí gas app Blynk .89 Hình 4.44 Giao diện giám sát lượng thiết bị 89 vii Mục lục bảng MỤC LỤC BẢNG Bảng 1.1 Bảng so sánh nhà thơng minh có dây nhà thơng minh không dây Bảng 2.1 Bảng thông số kỹ thuật Arduino Mega2560 11 Bảng 2.2 Bảng thông số kỹ thuật Module Wifi ESP8266 nodeMCU .12 Bảng 2.3 Bảng thông số kỹ thuật module cảm biến khí gas MQ2 15 Bảng 2.4 Bảng thông số kỹ thuật module cảm biến chuyển động PIR SR505 16 Bảng 2.5 Bảng thông số kỹ thuật module cảm biến đo nhiệt độ độ ẩm DHT11: 17 Bảng 2.6 Bảng thông số kỹ thuật module cảm biến mưa 18 Bảng 2.7 Các thông số kỹ thuật Relay V 20 Bảng 2.8 Bảng thông số kỹ thuật module cảm biến thẻ từ RFID 21 Bảng 2.9 Bảng thông số kỹ thuật thiết bị hiển thị 16×2 22 Bảng 2.10 Bảng thông số kỹ thuật module cảm biến ánh sáng Photoresistor 24 Bảng 2.11 Bảng thông số kỹ thuật module đo điện AC giao tiếp .25 UART PZEM - 004T 25 Bảng 2.12 Bảng thơng số kỹ thuật cịi Buzzer 26 Bảng 2.13 Bảng thông số kỹ thuật động servo .27 Bảng 2.14 Bảng thông số kỹ thuật quạt tản nhiệt VDC 30 Bảng 3.1 Kích thước cụ thể khu vực nhà .36 viii Chương Tổng quan nhà thông minh CHƯƠNG TỔNG QUAN VỀ NGÔI NHÀ THÔNG MINH 1.1 Giới thiệu chung Khái niệm “Nhà thông minh” lần đưa vào năm 1984 Hội Liên Hiệp Xây dựng Hoa Kỳ Ngôi nhà thông minh bắt đầu hình thành từ ý tưởng khơng có thật nhà văn, nhà làm phim từ thiết kế hình tượng ngơi nhà thơng minh với đầy đủ tính cần thiết, phục vụ cách tự động hố hồn tồn thiết bị điện tử trí tuệ nhân tạo [1] Năm 1999, phim có tựa đề "Smart House" phác thảo nhà thông minh qua câu chuyện: Một cậu bé 13 tuổi giành giải thưởng thi máy tính "Ngơi nhà tương lai" với cô giúp việc ảo PAT (Công nghệ ứng dụng cá nhân) [2] Ngơi nhà thơng minh với tảng cơng nghệ tự động hóa ngơi nhà, hình thức kiến trúc nhà lắp đặt thiết bị điện, điện tử có tác dụng tự động hóa hồn toàn bán tự động nhằm thay người việc thực thao tác quản lý, điều khiển Không đơn kiểm sốt thiết bị, hệ thống ngơi nhà thơng minh cho phép ngơi nhà có khả học thói quen chủ nhà điều khiển hoạt động thành phần hệ thống cho phù hợp với chủ nhà Trên giới, nhiều kiến trúc sư cân nhắc đến hệ thống nhà thông minh thiết kế xây dựng nhà Khi hệ thống tích hợp q trình xây dựng nhà, chi phí cho việc lắp đặt, bảo trì giảm xuống đồng thời hệ thống triển khai đầy đủ, linh hoạt Cuối năm 1990, nhà thông minh xem thứ xa xỉ nhà giàu Tuy nhiên, với đời phổ biến cơng nghệ vi điện tử chi phí ngày giảm cho phép công nghệ điều khiển thông minh ứng dụng rộng rãi Theo báo cáo Zion Market Research năm 2016, thị trường nhà thông minh toàn cầu đạt giá trị khoảng 24,1 tỉ USD, năm 2022 dự kiến đạt 53,45 tỉ USD với mức tăng trưởng trung bình hàng năm 14,5% [3] Ở Việt Nam, nhà thơng minh có mặt từ đầu năm 2003, gây ý khoảng vài năm gần trở lại BKAV đơn vị nước giới thiệu hệ thống BKAV Smart Home (Hình 1.2) hệ vào năm 2014 Đến năm 2017, BKAV tham gia thi “Nhà thông minh không dây” Phục lục Code cho Arduino Mega2560 return return_data; } void kitchen_toggle_light() { digitalWrite(kitchen_light_pin, !digitalRead(kitchen_light_pin)); } void kitchen_toggle_fan() { digitalWrite(kitchen_fan_pin, !digitalRead(kitchen_fan_pin)); } Main_gate const byte ROWS = 4; // four rows const byte COLS = 4; // four columns Keypad main_gate_keypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); #define main_gate_servo_pin #define main_gate_servo_open_door 90 #define main_gate_servo_close_door Servo main_gate_servo; LiquidCrystal_I2C main_gate_lcd(0x26, 16, 2); #define main_gate_enter_password_key '#' #define main_gate_delete_key 'D' #define main_gate_close_door_key 'C' #define main_gate_default_password "2222" String main_gate_password = ""; #define json_key_is_open "d" #define json_key_password "p" bool main_gate_is_doror_open = false; unsigned long main_gate_old_time_dipslay_lcd = 0; unsigned long main_gate_time_interval_display_lcd = 1000; unsigned long main_gate_old_time_close_door = 0; unsigned long main_gate_time_interval_close_door = 10000; String main_gate_lcd_line_1 = "enter password"; void main_gate_setup(); void main_gate_loop(); void main_gate_open_door(); void main_gate_close_door(); void main_gate_read_keypad(); void main_gate_display_lcd(); void main_gate_setup_lcd(); void main_gate_setup_servo(); void main_gate_set_json(String json); String main_gate_get_json(); // -void main_gate_setup() { main_gate_setup_lcd(); main_gate_setup_servo(); } 102 Phục lục Code cho Arduino Mega2560 void main_gate_loop() { main_gate_read_keypad(); main_gate_display_lcd(); } void main_gate_open_door() { main_gate_servo.write(main_gate_servo_open_door); } void main_gate_close_door() { main_gate_servo.write(main_gate_servo_close_door); } void main_gate_read_keypad() { char key = main_gate_keypad.getKey(); void main_gate_set_json(String json) { StaticJsonDocument doc; DeserializationError error = deserializeJson(doc, json); // Test if parsing succeeds if (error) { Serial.print(F("main_gate_set_json deserializeJson faiLED: ")); Serial.println(error.f_str()); return; } String psk = doc[json_key_password]; if (psk == main_gate_default_password) { Serial.println("gate open door"); main_gate_open_door(); main_gate_is_doror_open = true; main_gate_password = ""; main_gate_old_time_close_door = millis(); main_gate_lcd_line_1 = "door is open"; } else { main_gate_password = ""; Serial.println("gate wrong password"); main_gate_lcd_line_1 = "wrong password"; } } String main_gate_get_json() { StaticJsonDocument doc; doc[json_key_is_open] = main_gate_is_doror_open; String return_data; serializeJson(doc, return_data); return return_data; } Main_door Servo main_door_servo; #define main_door_servo_pin 12 #define main_door_servo_open_angle 90 #define main_door_servo_close_angle 103 Phục lục Code cho Arduino Mega2560 #define main_door_default_rfid_uid "24911620232" #define json_door_open_key "d" #define RST_PIN 49 // Configurable, see typical pin layout above #define SS_PIN 53 // Configurable, see typical pin layout above MFRC522 main_door_rfid(SS_PIN, RST_PIN); // Create MFRC522 instance bool main_door_is_door_open = false; unsigned long main_door_last_door_open_time = 0; unsigned long main_door_time_interval_close_door = 10000; void main_door_setup(); void main_door_loop(); String main_door_read_card(); void main_door_open_door(); void main_door_close_door(); void main_door_setup_rfid(); void main_door_set_json(String json); String main_door_get_json(); void main_door_servo_setup(); // void main_door_setup() { main_door_setup_rfid(); main_door_servo_setup(); } void main_door_loop() { String card_uid = main_door_read_card(); if (card_uid != "" && card_uid == main_door_default_rfid_uid) { Serial.println("Card UID: " + card_uid); main_door_open_door(); main_door_is_door_open = true; main_door_last_door_open_time = millis(); } void main_door_servo_setup() { main_door_servo.attach(main_door_servo_pin); } void main_door_open_door() { main_door_servo.write(main_door_servo_open_angle); } void main_door_close_door() { main_door_servo.write(main_door_servo_close_angle); } void main_door_setup_rfid() { SPI.begin(); main_door_rfid.PCD_Init(); main_door_rfid.PCD_DumpVersionToSerial(); } String main_door_read_card() { String return_data = ""; if (!main_door_rfid.PICC_IsNewCardPresent() || 104 Phục lục Code cho Arduino Mega2560 !main_door_rfid.PICC_ReadCardSerial()) { delay(50); return ""; } for (byte i = 0; i < main_door_rfid.uid.size; i++) { return_data += main_door_rfid.uid.uidByte[i]; } Serial.println(); Serial.print("Card UID: "); Serial.println(return_data); return return_data; } void main_door_set_json(String json) { StaticJsonDocument doc; DeserializationError error = deserializeJson(doc, json); if (error) { Serial.print(F("main_door_set_json deserializeJson faiLED: ")); Serial.println(error.c_str()); return; } main_door_is_door_open = doc[json_door_open_key]; Serial.print("main_door door is open: "); if(main_door_is_door_open) { main_door_open_door(); } Serial.println(main_door_is_door_open ? "open" : "closed"); } String main_door_get_json() { StaticJsonDocument doc; doc[json_door_open_key] = main_door_is_door_open; String return_data = ""; serializeJson(doc, return_data); return return_data; } Main #define esp8266 Serial1 void send_control_to_esp8266(); void get_control_from_esp8266(); unsigned long last_send_control_to_esp8266_time = 0; unsigned long send_control_to_esp8266_time_interval = 10000; void setup() { Serial.begin(9600); esp8266.begin(9600); yard_setup(); living_room_setup(); main_door_setup(); 105 Phục lục Code cho Arduino Mega2560 bedroom_setup(); bedroom_1_setup(); kitchen_setup(); wc_setup(); main_gate_setup(); } void loop() { yard_loop(); living_room_loop(); main_door_loop(); bedroom_loop(); bedroom_1_loop(); kitchen_loop(); wc_loop(); main_gate_loop(); send_control_to_esp8266(); get_control_from_esp8266(); } void send_control_to_esp8266() { if (millis() - last_send_control_to_esp8266_time > send_control_to_esp8266_time_interval) { StaticJsonDocument _doc_room; StaticJsonDocument doc; deserializeJson(_doc_room, yard_get_json()); doc[json_yard_key] = _doc_room; deserializeJson(_doc_room, living_room_get_json()); doc[json_living_room_key] = _doc_room; deserializeJson(_doc_room, main_door_get_json()); doc[json_main_door_key] = _doc_room; deserializeJson(_doc_room, bedroom_get_json()); doc[json_bedroom_key] = _doc_room; deserializeJson(_doc_room, bedroom_1_get_json()); doc[json_bedroom_1_key] = _doc_room; deserializeJson(_doc_room, kitchen_get_json()); doc[json_kitchen_key] = _doc_room; deserializeJson(_doc_room, wc_get_json()); doc[json_wc_key] = _doc_room; deserializeJson(_doc_room, main_gate_get_json()); doc[json_main_gate_key] = _doc_room; deserializeJson(_doc_room, energy_get_json()); doc[json_energy_key] = _doc_room; serializeJson(doc, Serial); serializeJson(doc, esp8266); // esp8266.println(); Serial.println(); last_send_control_to_esp8266_time = millis(); } 106 Phục lục Code cho Arduino Mega2560 } void get_control_from_esp8266() { if (esp8266.available()) { String _json = esp8266.readStringUntil('\n'); Serial.print(F("get_control_from_esp8266: ")); Serial.println(_json); Serial.println(); StaticJsonDocument _doc_room; deserializeJson(_doc_room, _json); yard_set_json(_doc_room[json_yard_key]); living_room_set_json(_doc_room[json_living_room_key]); main_door_set_json(_doc_room[json_main_door_key]); bedroom_set_json(_doc_room[json_bedroom_key]); bedroom_1_set_json(_doc_room[json_bedroom_1_key]); kitchen_set_json(_doc_room[json_kitchen_key]); wc_set_json(_doc_room[json_wc_key]); main_gate_set_json(_doc_room[json_main_gate_key]); // energy_set_json(_doc_room["energy"]); //last_send_control_to_esp8266_time = millis(); } } 107 Phục lục Code cho ESP8266 PHỤ LỤC 2: CODE CHO ESP8266 Code cho ESP8266 dùng để khai báo thiết lập điều khiển app Blynk CLI cli; String auth = "Tr_0gLTxU3YXX0xxMasZlUUa40sUwAAr"; String blynk_host = "cdttech.vn"; int blynk_port = 6902; void load_file_system(); void save_file_system(); void config_wifi(); WifiManagerParameter blynk_auth_param("auth", "auth token", "Tr_0gLTxU3YXX0xxMasZlUUa40sUwAAr", 40); WifiManagerParameter blynk_server_param("server", "blynk server", "cdttech.vn", 40); WifiManagerParameter blynk_port_param("port", "blynk port", "6902", 6); WifiManager wifiManager; SoftwareSerial _arduino_serial(tx_pin, rx_pin); void setup_network_blynk(); void send_to_arduino(); void get_from_arduino(); void send_to_blynk(); String get_yard_json(); String get_bedroom_json(); String get_bedroom_1_json(); String get_living_room_json(); String get_kitchen_json(); String get_wc_json(); String get_main_door_json(); String get_main_gate_json(); bool yard_is_auto_mode = false; bool yard_is_light_on = false; bool yard_is_servo_open = false; bool bedroom_is_light_on = false; bool bedroom_is_fan_on = false; bool bedroom_1_is_light_on = false; bool bedroom_1_is_fan_on = false; bool living_room_is_fan_on = false; bool living_room_is_light_on = false; bool kitchen_is_fan_on = false; bool kitchen_is_light_on = false; bool wc_is_light_on = false; 108 Phục lục Code cho ESP8266 bool maindoor_is_door_open = false; int yard_rain_sensor_value = 0; int yard_photodiode_sensor_value = 0; float livingroom_dht_temp_sensor_value = 0; float livingroom_dht_hum_sensor_value = 0; float kitchen_gas_sensor_value = 0; bool kitchen_caution_gas_damage = false; bool wc_pir_sensor_value = false; float energy_voltage_value = 0; float energy_current_value = 0; float energy_power_value = 0; float energy_energy_value = 0; float energy_frequency_value = 0; float energy_pf_value = 0; String main_gate_psk = ""; BLYNK_WRITE(blynk_yard_mode_button_virtual_pin) { yard_is_auto_mode = param.asInt(); send_to_arduino(); } BLYNK_WRITE(blynk_yard_control_light_button_virtual_pin) { yard_is_light_on = param.asInt(); send_to_arduino(); } BLYNK_WRITE(blynk_yard_control_servo_button_virtual_pin) { yard_is_servo_open = param.asInt(); send_to_arduino(); } BLYNK_WRITE(blynk_maindoor_door_button_virtual_pin) { if (param.asInt()) { maindoor_is_door_open = true; send_to_arduino(); maindoor_is_door_open = false; } } BLYNK_WRITE(blynk_maingate_door_psk_inputtext_virtual_pin) { main_gate_psk = param.asStr(); Serial.print("main_gate_psk: "); Serial.println(main_gate_psk); } BLYNK_WRITE(blynk_maingate_door_unclock_button_virtual_pin) { 109 Phục lục Code cho ESP8266 if (param.asInt()) { send_to_arduino(); main_gate_psk = ""; } } BLYNK_WRITE(blynk_livingroom_control_light_button_virtual_pin) { living_room_is_light_on = param.asInt(); send_to_arduino(); } BLYNK_WRITE(blynk_livingroom_control_fan_button_virtual_pin) { living_room_is_fan_on = param.asInt(); send_to_arduino(); } BLYNK_WRITE(blynk_bedroom_control_light_button_virtual_pin) { bedroom_is_light_on = param.asInt(); send_to_arduino(); } BLYNK_WRITE(blynk_bedroom_control_fan_button_virtual_pin) { bedroom_is_fan_on = param.asInt(); send_to_arduino(); } BLYNK_WRITE(blynk_bedroom_1_control_light_button_virtual_pin) { bedroom_1_is_light_on = param.asInt(); send_to_arduino(); } BLYNK_WRITE(blynk_bedroom_1_control_fan_button_virtual_pin) { bedroom_1_is_fan_on = param.asInt(); send_to_arduino(); } BLYNK_WRITE(blynk_kitchen_control_light_button_virtual_pin) { kitchen_is_light_on = param.asInt(); send_to_arduino(); } BLYNK_WRITE(blynk_kitchen_control_fan_button_virtual_pin) { kitchen_is_fan_on = param.asInt(); send_to_arduino(); } BLYNK_WRITE(blynk_wc_control_light_button_virtual_pin) 110 Phục lục Code cho ESP8266 { wc_is_light_on = param.asInt(); send_to_arduino(); } void setup() { Serial.begin(9600); _arduino_serial.begin(9600); setup_network_blynk(); } void loop() { Blynk.run(); cli.update(); get_from_arduino(); } void send_to_arduino() { StaticJsonDocument doc; StaticJsonDocument _doc_room; deserializeJson(_doc_room, get_yard_json()); doc[json_yard_key] = _doc_room; deserializeJson(_doc_room, get_bedroom_json()); doc[json_bedroom_key] = _doc_room; deserializeJson(_doc_room, get_bedroom_1_json()); doc[json_bedroom_1_key] = _doc_room; deserializeJson(_doc_room, get_living_room_json()); doc[json_living_room_key] = _doc_room; deserializeJson(_doc_room, get_kitchen_json()); doc[json_kitchen_key] = _doc_room; deserializeJson(_doc_room, get_wc_json()); doc[json_wc_key] = _doc_room; deserializeJson(_doc_room, get_main_door_json()); doc[json_main_door_key] = _doc_room; deserializeJson(_doc_room, get_main_gate_json()); doc[json_main_gate_key] = _doc_room; serializeJson(doc, _arduino_serial); // _arduino_serial.println(); Serial.print(F("send_to_arduino: ")); serializeJson(doc, Serial); Serial.println(); } String get_yard_json() { StaticJsonDocument doc; doc[json_mode_key] = yard_is_auto_mode; doc[json_light_key] = yard_is_light_on; 111 Phục lục Code cho ESP8266 doc[json_servo_key] = yard_is_servo_open; String json; serializeJson(doc, json); } String get_bedroom_json() { StaticJsonDocument doc; doc[json_fan_key] = bedroom_is_fan_on; doc[json_light_key] = bedroom_is_light_on; String json; serializeJson(doc, json); } String get_bedroom_1_json() { StaticJsonDocument doc; doc[json_fan_key] = bedroom_1_is_fan_on; doc[json_light_key] = bedroom_1_is_light_on; String json; serializeJson(doc, json); } String get_living_room_json() { StaticJsonDocument doc; doc[json_fan_key] = living_room_is_fan_on; doc[json_light_key] = living_room_is_light_on; String json; serializeJson(doc, json); } String get_kitchen_json() { StaticJsonDocument doc; doc[json_fan_key] = kitchen_is_fan_on; doc[json_light_key] = kitchen_is_light_on; String json; serializeJson(doc, json); String get_wc_json() { StaticJsonDocument doc; doc[json_light_key] = wc_is_light_on; String json; serializeJson(doc, json); return json; } String get_main_door_json() { StaticJsonDocument doc; 112 Phục lục Code cho ESP8266 doc[json_door_open_key] = maindoor_is_door_open; String json; serializeJson(doc, json); } String get_main_gate_json() { StaticJsonDocument doc; doc[json_key_password] = main_gate_psk; String json; serializeJson(doc, json); } void get_from_arduino() { String _json = _arduino_serial.readStringUntil('\r'); Serial.println(_json); StaticJsonDocument doc; // deserializeJson(doc, _json); DeserializationError error = deserializeJson(doc, _json); // if (error) { // Serial.print(F("deserializeJson() faiLED: ")); // Serial.println(error.f_str()); // return; // } StaticJsonDocument _doc_room; _doc_room = doc[json_yard_key]; yard_is_auto_mode = _doc_room[json_mode_key]; yard_is_light_on = _doc_room[json_light_key]; yard_is_servo_open = _doc_room[json_servo_key]; yard_rain_sensor_value = _doc_room[json_rain_key]; yard_photodiode_sensor_value = _doc_room[json_photodiode_key]; _doc_room = doc[json_bedroom_key]; bedroom_is_fan_on = _doc_room[json_fan_key]; bedroom_is_light_on = _doc_room[json_light_key]; _doc_room = doc[json_bedroom_1_key]; bedroom_1_is_fan_on = _doc_room[json_fan_key]; bedroom_1_is_light_on = _doc_room[json_light_key]; _doc_room = doc[json_living_room_key]; living_room_is_fan_on = _doc_room[json_fan_key]; living_room_is_light_on = _doc_room[json_light_key]; livingroom_dht_temp_sensor_value = _doc_room[json_temperature_key]; livingroom_dht_hum_sensor_value = _doc_room[json_humidity_key]; _doc_room = doc[json_kitchen_key]; kitchen_is_fan_on = _doc_room[json_fan_key]; kitchen_is_light_on = _doc_room[json_light_key]; kitchen_gas_sensor_value = _doc_room[json_gas_key]; kitchen_caution_gas_damage = _doc_room[json_caution_key]; _doc_room = doc[json_wc_key]; 113 Phục lục Code cho ESP8266 wc_is_light_on = _doc_room[json_light_key]; wc_pir_sensor_value = _doc_room[json_pir_key]; _doc_room = doc[json_main_door_key]; maindoor_is_door_open = _doc_room[json_door_open_key]; _doc_room = doc[json_energy_key]; energy_voltage_value = _doc_room[json_voltage_key]; energy_current_value = _doc_room[json_current_key]; energy_power_value = _doc_room[json_power_key]; energy_energy_value = _doc_room[json_energy_key]; energy_frequency_value = _doc_room[json_frequency_key]; energy_pf_value = _doc_room[json_pf_key]; Serial.print("energy_energy_value: "); Serial.println(energy_energy_value); send_to_blynk(); } void send_to_blynk() { Blynk.virtualWrite(blynk_yard_mode_button_virtual_pin, yard_is_auto_mode); Blynk.virtualWrite(blynk_yard_control_light_button_virtual_pin, yard_is_light_on); Blynk.virtualWrite(blynk_yard_control_servo_button_virtual_pin, yard_is_servo_open); Blynk.virtualWrite(blynk_yard_rain_sensor_gauge_virtual_pin, yard_rain_sensor_value); Blynk.virtualWrite(blynk_yard_photodiode_sensor_gauge_virtual_pin, yard_photodiode_sensor_value); Blynk.virtualWrite(blynk_livingroom_dht_temp_sensor_virtual_pin, livingroom_dht_temp_sensor_value); Blynk.virtualWrite(blynk_livingroom_dht_hum_sensor_virtual_pin, livingroom_dht_hum_sensor_value); Blynk.virtualWrite(blynk_livingroom_control_light_button_virtual_pin, living_room_is_light_on); Blynk.virtualWrite(blynk_livingroom_control_fan_button_virtual_pin, living_room_is_fan_on); Blynk.virtualWrite(blynk_bedroom_control_light_button_virtual_pin, bedroom_is_light_on); Blynk.virtualWrite(blynk_bedroom_control_fan_button_virtual_pin, bedroom_is_fan_on); Blynk.virtualWrite(blynk_bedroom_1_control_light_button_virtual_pin, bedroom_1_is_light_on); Blynk.virtualWrite(blynk_bedroom_1_control_fan_button_virtual_pin, bedroom_1_is_fan_on); Blynk.virtualWrite(blynk_kitchen_control_light_button_virtual_pin, kitchen_is_light_on); Blynk.virtualWrite(blynk_kitchen_control_fan_button_virtual_pin, kitchen_is_fan_on); Blynk.virtualWrite(blynk_kitchen_gas_gauge_sensor_virtual_pin, 114 Phục lục Code cho ESP8266 kitchen_gas_sensor_value); Blynk.virtualWrite(blynk_wc_control_light_button_virtual_pin, wc_is_light_on); Blynk.virtualWrite(blynk_energy_voltage_gauge_virtual_pin, energy_voltage_value); Blynk.virtualWrite(blynk_energy_current_gauge_virtual_pin, energy_current_value); Blynk.virtualWrite(blynk_energy_power_gauge_virtual_pin, energy_power_value); Blynk.virtualWrite(blynk_energy_energy_gauge_virtual_pin, energy_energy_value); Blynk.virtualWrite(blynk_energy_frequency_gauge_virtual_pin, energy_frequency_value); Blynk.virtualWrite(blynk_energy_pf_gauge_virtual_pin, energy_pf_value); // Blynk.virtualWrite(blynk_maingate_door_psk_inputtext_virtual_pin, // main_gate_psk); } void setup_network_blynk() config_wifi(); } delay(2000); load_file_system(); Serial.println("Connecting to Wifi"); Blynk.begin(auth.c_str(), Wifi.SSID().c_str(), Wifi.psk().c_str(), blynk_host.c_str(), String(blynk_port).toInt()); } void config_wifi() { wifiManager.resetSettings(); wifiManager.addParameter(&blynk_auth_param); wifiManager.addParameter(&blynk_server_param); wifiManager.addParameter(&blynk_port_param); Serial.println("faiLED to connect and hit timeout"); delay(3000); // reset and try again, or maybe put it to deep sleep ESP.restart(); delay(5000); } save_file_system(); } } configFile.close(); } } void save_file_system() { 115 Phục lục Code cho ESP8266 String auth = blynk_auth_param.getValue(); String blynk_host = blynk_server_param.getValue(); String blynk_port = blynk_port_param.getValue(); Serial.println("The values in the file are: "); Serial.println("auth : " + String( auth)); Serial.println("blynk_host : " + String( blynk_host)); Serial.println("blynk_port : " + String( blynk_port)); DynamicJsonDocument json(200); json["auth"] = auth; json["blynk_host"] = blynk_host; json["blynk_port"] = blynk_port; File configFile = LittleFS.open("/config.json", "w"); serializeJson(json, Serial); serializeJson(json, configFile); configFile.close(); } 116