You are on page 1of 80

Đồ án 1

TRƯỜNG ĐẠI HỌC SÀI GÒN


KHOA ĐIỆN TỬ VIỄN THÔNG
----------

ĐỒ ÁN 1

MẠCH CẢNH BÁO NHIỆT ĐỘ VÀ ĐỘ ẨM

SỬ DỤNG ESP8266 VÀ DHT 11

Giảng viên hướng dẫn:


TS.Nguyễn Xuân Tiên
Nhóm sinh viên thực hiện:
Đặng Thành Nhân-3119510032
Nguyễn Vĩ Tường-31159510056
1
Đồ án 1

TP. Hồ Chí Minh, năm 2022

TRƯỜNG ĐẠI HỌC SÀI GÒN


KHOA ĐIỆN TỬ VIỄN THÔNG
----------

BÁO CÁO MÔN HỌC

MẠCH CẢNH BÁO NHIỆT ĐỘ VÀ ĐỘ ẨM

SỬ DỤNG ESP8266 VÀ DHT 11

Giảng viên hướng dẫn:


TS.Nguyễn Xuân Tiên
Nhóm sinh viên thực hiện:
Đặng Thành Nhân-3119510032
Nguyễn Vĩ Tường-31159510056

2
Đồ án 1

TP. Hồ Chí Minh, năm 2022

MỤC LỤC
LỜI CẢM ƠN........................................................................................................... 5
GIỚI THIỆU ĐỀ TÀI.................................................................................................. 6
1 Sơ lược...........................................................................................................6
2 Những tác hại khi độ ẩm thất thường...........................................................6
3 Mục tiêu đề tài...............................................................................................6
4 Thể thức, phương thức nghiên cứu..............................................................7
CHƯƠNG 1: TỔNG QUAN VỂ IoT.............................................................................8
1.1 Giới thiệu về IoT?........................................................................................8
1.2 Thuật ngữ...................................................................................................8
1.3 Lịch sử.........................................................................................................9
1.4 Khả nănng định danh độc nhất................................................................10
1.5 Xu hướng và tính chất..............................................................................10
CHƯƠNG 2: GIỚI THIỆU THIẾT BỊ VÀ PHẦN MỀM SỬ DỤNG TRONG HỆ THỐNG.....11
2.1 Kit RF Thu Phát Wifi ESP8266 NodeMCU Lua CP2102.............................11
2.2 Cảm biến nhiệt độ, độ ẩm DHT11............................................................13
2.3 Mạch ổn áp LM7805.................................................................................14
2.4 Điện trở kéo lên........................................................................................15
2.5 Phần mềm Arduino (Arduino IDE)............................................................15
2.6 Phần mềm Visual Studio Code.................................................................17
CHƯƠNG 3: NGUYÊN LÝ HOẠT ĐỘNG...................................................................17
3.1 Các giao thức được sử dụng trong hệ thống............................................17
3.1.1 Giao thức MQTT.................................................................................................................17
3.1.2 Giao tiếp UART...................................................................................................................18
3.1.3 RSA.....................................................................................................................................19

3.1.4 Các chế độ hoạt động của ESP8266......................................................19


3.2 Lưu đồ giải thuật......................................................................................22
3.3 Sơ đồ nguyên lý........................................................................................23
CHƯƠNG 4: THI CÔNG MẠCH............................................................................... 25
4.1 Giới thiệu những thành phần sử dụng trong App:...................................25
4.1.1 Ngôn ngữ lập trình C..........................................................................................................25
4.1.2 Ngôn ngữ lập trình JavaScript...........................................................................................25
4.1.3 CSS......................................................................................................................................25
4.1.4 HTML..................................................................................................................................26
4.1.5 NodeJS................................................................................................................................26

3
Đồ án 1
4.1.5 ReactJS...............................................................................................................................32
4.1.6 MONGO DB........................................................................................................................32

4.2 CODE hoạt động.......................................................................................32


4.3 Thành phẩm..............................................................................................56
CHƯƠNG 5: KẾT LUẬT VÀ HƯỚNG PHÁT TRIỂN....................................................74
5.1 Ưu nhược điểm của hệ thống:.................................................................74
5.2 Hướng phát triển......................................................................................74
TÀI LIỆU THAM KHẢO........................................................................................... 75
NHỮNG TỪ VIẾT TẮT VÀ THUẬT NGỮ THƯỜNG SỬ DỤNG........................................76

4
Đồ án 1

LỜI CẢM ƠN
Để hoàn thành bài thu hoạch môn học này, chúng tôi xin tỏ lòng biết ơn sâu
sắc đến thầy Trần Minh Nhật đã tận tình hướng dẫn trong suốt quá trình học tập.

Chúng tôi chân thành cảm ơn quý thầy, cô trong khoa Giáo và Giáo Điện Tử
Viễn Thông Trường Đại học Sài Gòn đã tận tình truyền đạt kiến thức cho chúng tôi
học tập. Với vốn kiến thức được tiếp thu trong quá trình học không chỉ là nền tảng
cho quá trình thực hiện bài thu hoạch mà còn là hành trang quý báu để chúng tôi
bước vào đời một cách vững chắc và tự tin.

Cuối cùng chúng tôi kính chúc quý thầy, cô dồi dào sức khỏe và thành công
trong sự nghiệp cao quý.

5
Đồ án 1

GIỚI THIỆU ĐỀ TÀI

1 Sơ lược.

Trong thời đại 4.0 này, khi ta đã quá quen với những công nghệ ký thuật tiên tiến,
những thiết bị, đề tài, dự án, công trình... đã phát triển đến mức mà ta tưởng rằng
chỉ có trong trí tưởng tượng. Vậy thì với những mong muốn về hiện đại, tiện lợi,
nhanh gọn thì IoT sẽ không thể thiếu trong cuộc sống thường ngày của chúng ta. Thế
nên nhóm đã chọn đề tài là “MẠCH CẢCH BÁO NHIỆT ĐỘ, ĐỘ ẨM SỬ SỤNG ESP8266
VÀ DHT11”.

2 Những tác hại khi độ ẩm thất thường

Khi độ ẩm quá cao:


Độ ẩm cao gây cảm giác khó chịu, mệt mỏi cho cơ thể.

Mùi quần áo là điều khó tránh khỏi đặc biệt là quần áo bẩn và kể cả quần áo đã giặt
mà không thể khô, mùi ẩm mốc từ chăn, đệm, tường…cũng góp phần làm tăng cảm
giác khó chịu cho chúng ta.

Độ ẩm cao còn tạo điều kiện tốt cho các virus, vi khuẩn, nấm mốc, bọ bụi nhà… phát
triển, dẫn đến tăng nguy cơ mắc các bệnh nhiễm trùng đường hô hấp (bệnh viêm
mũi họng cấp tính, viêm phế quản cấp, viêm phổi), nhiễm trùng đường tiêu hóa, một
số bệnh ngoài da và gia tăng tình trạng dị ứng.

Độ ẩm cao kích thích trực tiếp niêm mạc đường thở dẫn đến viêm, tăng tiết và co
thắt phế quản dẫn đến có các triệu chứng ho, hắt hơi, khó thở…

6
Đồ án 1
Độ ẩm cao còn kích thích xuất hiện các đợt bùng phát và làm tăng mức độ trầm trọng
của một số bệnh đường hô hấp mãn tính như bệnh phổi tắc nghẽn mạn tính, hen
phế quản.
Khi độ ẩm quá thấp:
Khi độ ẩm không khí xuống quá thấp, dưới 40%, cơ thể thoát hơi nước qua da sẽ
nhanh hơn mức bình thường, làm da dễ bị khô nẻ, bong tróc. Độ ẩm càng thấp sẽ
càng khiến cơ thể suy nhược, hụt giảm hiệu suất làm việc, hệ miễn dịch duy yếu nên
dễ mắc bệnh.

Khi độ ẩm thấp, ta sẽ có cảm giác khó chịu, hít thở khô. Với trẻ em, hệ hô hấp còn
non yếu sẽ dễ mắc những bệnh về khí quản, phổi,…

3 Mục tiêu đề tài.

- Giảm tình trạng ẩm mốc do độ ẩm không khí quá cao.


- Giảm tình trạng da bị khô, sứt nẻ khi độ không khí quá thấp.
- Giúp người sử dụng luôn cập nhật được nhiệt độ và độ ẩm trong nhà.
- Giúp môi trường trong nhà luôn được điều hòa, ổn định.

4 Thể thức, phương thức nghiên cứu.

Trong quá trình thực hiện, nhóm đã nghiên cứu, tìm hiểu qua sách, báo, các tài liệu
trên internet, nghiên cứu cơ sở lý thuyết về kỹ thuật đo nhiệt độ và độ ẩm, ứng dụng
kiến thức đã biết về lập trình IoT và xây dựng hệ thống cảnh báo nhiệt độ và độ ẩm.
Sau đó thiết kế mạch điều khiển, sau đó tiến hành lắp ráp mạch, hoàn thiện mô hình.

7
Đồ án 1

CHƯƠNG 1: TỔNG QUAN VỂ IoT

1.1 Giới thiệu về IoT?

Là một kịch bản của thế giới, khi mà mỗi đồ vật, con người được cung cấp một định
danh của riêng mình, và tất cả có khả năng truyền tải, trao đổi thông tin, dữ liệu qua
một mạng duy nhất mà không cần đến sự tương tác trực tiếp giữa người với người,
hay người với máy tính.

Các thiết bị IoT có thể là đồ vật được gắn thêm cảm biến để thu thập dữ liệu về môi
trường xung quanh (giống như các giác quan), các máy tính/bộ điều khiển tiếp nhận
dữ liệu và ra lệnh cho các thiết bị khác, hoặc cũng có thể là các đồ vật được tích hợp
cả hai tính năng trên.

Năm 1999, Kevin Ashton đã đưa ra cụm từ Internet of Things nhằm để chỉ các đối
tượng có thể được nhận biết cũng như sự tồn tại của chúng.
8
Đồ án 1

Đến năm 2016, Internet Vạn Vật khẳng định được bước tiến của mình nhờ sự hội tụ
của nhiều công nghệ, bao gồm truyền tải vô tuyến hiện diện dầy đặc, phân tích dữ
liệu thời gian thực, học máy, cảm biến hàng hóa, và hệ thống nhúng.

Hình 1.1: Mô tả tương tác của mạng lưới thiết bị kết nối internet

1.2 Thuật ngữ

Internet of Things (IoT): là thuật ngữ dùng để chỉ các đối tượng có thể được nhận
biết (identifiable) cũng như chỉ sự tồn tại của chúng trong một kiến trúc mang tính
kết nối. Cụm từ này được đưa ra bởi Kevin Ashton vào năm 1999. Ông là một nhà
khoa học đã sáng lập ra Trung tâm Auto-ID ở đại học MIT, nơi thiết lập các quy chuẩn
toàn cầu cho RFID (một phương thức giao tiếp không dây dùng sóng radio) cũng như
một số loại cảm biến khác. IoT sau đó cũng được dùng nhiều trong các ấn phẩm đến
từ các hãng và nhà phân tích. "Vạn Vật", trong khái niệm này, có thể hướng đến đa
dạng thiết bị như máy theo dõi nhịp tim, máy phát đáp vi mạch sinh học trên gia súc,
loài ctenoides ales sinh sống tại vùng nước ven bờ biển, xe hơi với cảm biến tích hợp,
thiết bị phân tích DNA để quan sát môi trường/thức ăn/mầm bệnh, hoặc thiết bị
chuyên dụng để hỗ trợ lực lượng cứu hỏa trong hoạt động tìm kiếm cứu nạn. Nhiều
luật gia gợi ý "Vạn Vật" nên được xem là "một tổng thể không thể tách rời của phần
cứng, phần mềm, dữ liệu và dịch vụ mạng".

1.3 Lịch sử

Năm 1999, Kevin Ashton đã đưa ra cụm từ Internet of Things nhằm để chỉ các đối
tượng có thể được nhận biết cũng như sự tồn tại của chúng.

9
Đồ án 1
Đến năm 2016, Internet Vạn Vật khẳng định được bước tiến của mình nhờ sự hội tụ
của nhiều công nghệ, bao gồm truyền tải vô tuyến hiện diện dầy đặc, phân tích dữ
liệu thời gian thực, học máy, cảm biến hàng hóa, và hệ thống nhúng. Điều này có
nghĩa là tất cả các dạng thức của hệ thống nhúng cổ điển, như mạng cảm biến không
dây, hệ thống điều khiển, tự động hóa (bao gồm nhà thông minh và tự động hóa
công trình), vân vân đều đóng góp vào việc vận hành IoT.

Ý tưởng về một mạng lưới các thiết bị thông minh đã được thảo luận từ 1982, với
một máy bán nước Coca-Cola tại Đại học Carnegie Mellon được tùy chỉnh khiến nó
đã trở thành thiết bị đầu tiên được kết nối Internet, có khả năng báo cáo kiểm kho và
báo cáo độ lạnh của những chai nước mới bỏ vào máy. Bản mô tả sơ khai năm 1991
về điện toán phổ quát (tiếng Anh: ubiquitous computing) của Mark Weiser, "Máy
tính thế kỷ XXI", cũng như những báo cáo về tầm nhìn đương đại của IoT từ các viện
khoa học UbiComp và PerCom. Năm 1994 Reza Raji mô tả khái niệm này trên tờ IEEE
Spectrum là "[chuyển] các gói dữ liệu nhỏ sang tập hợp các nút mạng lớn, để tích
hợp và tự động hóa mọi thứ từ các thiết bị gia dụng với cả một nhà máy sản xuất".
Giữa năm 1993 và 1996 một số công ty đề xuất giải pháp như at Work của Microsoft
hay NEST của Novell. However, only in 1999 did the field start gathering momentum.
Bill Joy mường tượng tới phương thức truyền tải thiết bị-tới-thiết bị (D2D) ở một
phần trong bộ khung "Six Webs" của ông, được ông diễn thuyết tại Diễn đàn Kinh tế
Thế giới ở Davos năm 1999.

Khái niệm Internet Vạn Vật trở nên phổ biến trong năm 1999 qua Trung tâm Auto-ID
ở Viện Công nghệ Massachusetts và các xuất bản phẩm phân tích thị trường có liên
quan. Công nghệ Nhận dạng qua tần số vô tuyến (tiếng Anh: Radio-frequency
identification, viết tắt: RFID) được Kevin Ashton (một trong những người sáng lập
Auto-ID Center) xem là một điều kiện tiên quyết cho IoT vào thời điểm đó. Ashton
prefers the phrase "Internet for Things." If all objects and people in daily life were
equipped with identifiers, computers could manage and inventory them. Besides
using RFID, the tagging of things may be achieved through such technologies as near
field communication, barcodes, QR codes và digital watermarking.

1.4 Khả nănng định danh độc nhất

Điểm quan trọng của IoT đó là các đối tượng phải có thể được nhận biết và định
dạng (identifiable). Nếu mọi đối tượng, kể cả con người, được "đánh dấu" để phân
biệt bản thân đối tượng đó với những thứ xung quanh thì chúng ta có thể hoàn toàn
quản lý được nó thông qua máy tính. Việc đánh dấu (tagging) có thể được thực hiện
thông qua nhiều công nghệ, chẳng hạn như RFID, NFC, mã vạch, mã QR, watermark
kĩ thuật số... Việc kết nối thì có thể thực hiện qua Wi-Fi, mạng viễn thông băng rộng
(3G, 4G), Bluetooth, ZigBee, hồng ngoại...
Ngoài những kĩ thuật nói trên, nếu nhìn từ thế giới web, chúng ta có thể sử dụng các
địa chỉ độc nhất để xác định từng vật, chẳng hạn như địa chỉ IP. Mỗi thiết bị sẽ có
một IP riêng biệt không nhầm lẫn. Sự xuất hiện của Ipv6 (Internet Protocol version 6)
10
Đồ án 1
với không gian địa chỉ cực kì rộng lớn sẽ giúp mọi thứ có thể dễ dàng kết nối vào
Internet cũng như kết nối với nhau.

1.5 Xu hướng và tính chất

1.5.1 Thông minh


Sự thông minh và tự động trong điều khiển thực chất không phải là một phần trong ý
tưởng về IoT. Các máy móc có thể dễ dàng nhận biết và phản hồi lại môi trường xung
quanh (ambient intelligence), chúng cũng có thể tự điều khiển bản thân
(autonomous control) mà không cần đến kết nối mạng. Tuy nhiên, trong thời gian
gần đây người ta bắt đầu nghiên cứu kết hợp hai khái niệm IoT và autonomous
control lại với nhau. Tương lai của IoT có thể là một mạng lưới các thực thể thông
minh có khả năng tự tổ chức và hoạt động riêng lẻ tùy theo tình huống, môi trường,
đồng thời chúng cũng có thể liên lạc với nhau để trao đổi thông tin, dữ liệu.

Việc tích hợp trí thông minh vào IoT còn có thể giúp các thiết bị, máy móc, phần
mềm thu thập và phân tích các dấu vết điện tử của con người khi chúng ta tương tác
với những thứ thông minh, từ đó phát hiện ra các tri thứcmới liên quan tới cuộc
sống, môi trường, các mối tương tác xã hội cũng như hành vi con người.

1.5.2 Kiến trúc dựa trên sự kiện


Các thực thể, máy móc trong IoT sẽ phản hồi dựa theo các sự kiện diễn ra trong lúc
chúng hoạt động theo thời gian thực. Một số nhà nghiên cứu từng nói rằng một
mạng lưới các sensor chính là một thành phần đơn giản của IoT.

1.5.3 Là một hệ thống phức tạp


Trong một thế giới mở, IoT sẽ mang tính chất phức tạp bởi nó bao gồm một lượng
lớn các đường liên kết giữa những thiết bị, máy móc, dịch vụ với nhau, ngoài ra còn
bởi khả năng thêm vào các nhân tố mới.

1.5.4 Kích thước


Một mạng lưới IoT có thể chứa đến 50 đến 100 nghìn tỉ đối tượng được kết nối và
mạng lưới này có thể theo dõi sự di chuyển của từng đối tượng. Một con người sống
trong thành thị có thể bị bao bọc xung quanh bởi 1000 đến 5000 đối tượng có khả
năng theo dõi.

1.5.5 Vấn đề không gian, thời gian


Trong IoT, vị trí địa lý chính xác của một vật nào đó là rất quan trọng. Hiện nay,
Internet chủ yếu được sử dụng để quản lý thông tin được xử lý bởi con người. Do đó
những thông tin như địa điểm, thời gian, không gian của đối tượng không mấy quan
trọng bởi người xử lý thông tin có thể quyết định các thông tin này có cần thiết hay
không, và nếu cần thì họ có thể bổ sung thêm. Trong khi đó, IoT về lý thuyết sẽ thu
thập rất nhiều dữ liệu, trong đó có thể có dữ liệu thừa về địa điểm, và việc xử lý dữ
liệu đó được xem như không hiệu quả. Ngoài ra, việc xử lý một khối lượng lớn dữ
11
Đồ án 1
liệu trong thời gian ngắn đủ để đáp ứng cho hoạt động của các đối tượng cũng là
một thách thức hiện nay.

CHƯƠNG 2: GIỚI THIỆU THIẾT BỊ VÀ PHẦN MỀM SỬ DỤNG TRONG HỆ THỐNG

2.1 Kit RF Thu Phát Wifi ESP8266 NodeMCU Lua CP2102.

Kit RF thu phát Wifi ESP8266 NodeMCU Lua là kit phát triển dựa trên nền chip Wifi
SoC ESP8266 với thiết kế dễ sử dụng và đặc biệt là có thể sử dụng trực tiếp trình
biên dịch của Arduino để lập trình và nạp code, điều này khiến việc sử dụng và lập
trình các ứng dụng trên ESP8266 trở nên rất đơn giản.
Kit RF thu phát Wifi ESP8266 NodeMCU Lua được dùng cho các ứng dụng cần
kết nối, thu thập dữ liệu và điều khiển qua sóng Wifi, đặc biệt là các ứng dụng liên
quan đến IoT.
Kit RF thu phát Wifi ESP8266 NodeMCU Lua sử dụng chip nạp và giao tiếp UART mới
và ổn định nhất là CP2102 có khả năng tự nhận Driver trên tất cả các hệ điều hành
Window và Linux, đây là phiên bản nâng cấp từ các phiên bản sử dụng IC nạp giá rẻ
CH340.

Hình 2.1. ESP8266 NodeMCU Lua CP2102


Thông số kỹ thuật của ESP8266 NodeMCU:

12
Đồ án 1
- Hỗ trợ Arduino IDE 1 và Arduino ESP8266.
- Tích hợp Wi-Fi 2.4Ghz
- Nguồn vào: Cấp nguồn 5V và chương trình thông qua cổng USB.
- Nguồn ra: hoạt động từ 3.3V tới 3.6V
- Dòng hoạt động: 1-100mA
- Kích thước: 49 x 24.5 x 13mm.
- IC chính: ESP8266 Wifi SoC.
Sơ đồ chân:

Hình 2.2. Sơ đồ chân của ESP8266 NodeMCU Lua CP21

2.2 Cảm biến nhiệt độ, độ ẩm DHT11.

Cảm biến độ ẩm và nhiệt độ DHT11 là cảm biến rất thông dụng hiện nay vì chi phí rẻ
và rất dễ lấy dữ liệu thông qua giao tiếp 1 wire (giao tiếp digital 1 dây truyền dữ liệu
duy nhất). Bộ tiền xử lý tín hiệu tích hợp trong cảm biến giúp bạn có được dữ liệu

13
Đồ án 1
chính xác mà không phải qua bất kỳ tính toán nào. So với cảm biến đời mới hơn là
DHT22 thì DHT11 cho khoảng đo và độ chính xác kém hơn rất nhiều.
Thông tin kỹ thuật của cảm biến nhiệt độ, độ ẩm DHT11:
- Nguồn: 3÷5VDC.
- Dòng sử dụng: 2.5mA max (khi truyền dữ liệu).
- Đo tốt ở độ ẩm 2080%RH với sai số 5%.
- Đo tốt ở nhiệt độ 0°C to 50°C sai số ±2°C.
- Tần số lấy mẫu tối đa 1Hz (1 giây 1 lần).
- Kích thước: 15mm x 12mm x 5.5mm.
- 4 chân, khoảng cách chân 0.1.

Hình 2.3: sơ đồ chân module DHT11

2.3 Mạch ổn áp LM7805

Là loại IC cung cấp điện áp ngõ ra với giá trị ổn định mặc dù trong lúc đó điện
áp ngõ vào IC thay đổi liên tục và thiếu sự ổn định. IC 7805 chỉ là một trong rất
nhiều loại IC ổn áp khác nhưng khả năng ổn áp của nó thì không thể xem
thường. IC 7805 được phân loại là một loại IC điều chế điện áp DC dương vì

14
Đồ án 1
ngõ ra của IC này luôn có mức điện áp dương so với mức điện áp nối mass
(GND). 7805 được thiết kế bao gồm 3 chân:

Hình 2.4: sơ đồ chân IC LM7805


Thông số kỹ thuật:
Điện áp vào lớn nhất: 20V
Điện áp vào nhỏ nhất: 7V
Kiểu đóng vỏ: TO-220
Nhiệt độ hoạt động lớn nhất: 85°C
Nhiệt độ hoạt động nhỏ nhất: -20°C
Dòng đầu ra: 1.5A
Điện áp ổn định: 5V

2.4 Điện trở kéo lên

Là một điện trở được dùng khi thiết kế các mạch điện tử logic. Nó có một đầu
được nối với nguồn điện áp dương (thường là Vcc hoặc Vdd) và đầu còn lại
được nối với tín hiệu lối vào hoặc ra của một mạch logic chức năng.

15
Đồ án 1
2.5 Phần mềm Arduino (Arduino IDE)

Arduino IDE là một phần mềm mã nguồn mở chủ yếu được sử dụng để viết và
biên dịch mã vào module Arduino.

Đây là một phần mềm Arduino chính thức, giúp cho việc biên dịch mã trở nên
dễ dàng mà ngay cả một người bình thường không có kiến thức kỹ thuật cũng
có thể làm được.

Hình 2.5.1: Giao diện của Arduino

16
Đồ án 1

Hình 2.5.2 Setup cổng kết nối

2.6 Phần mềm Visual Studio Code

Visual Studio Code là một trình biên tập mã được phát triển bởi Microsoft
dành cho Windows, Linux và macOS. Nó hỗ trợ chức năng debug, đi kèm với
Git, có syntax highlighting, tự hoàn thành mã thông minh, snippets, và cải tiến
mã nguồn. Nó cũng cho phép tùy chỉnh, do đó, người dùng có thể thay đổi
theme, phím tắt, và các tùy chọn khác.

CHƯƠNG 3: NGUYÊN LÝ HOẠT ĐỘNG

3.1 Các giao thức được sử dụng trong hệ thống

3.1.1 Giao thức MQTT

17
Đồ án 1
Là giao thức truyền thông điệp (message) theo mô hình publish/subscribe
(cung cấp / thuê bao), được sử dụng cho các thiết bị IoT với băng thông thấp,
độ tin cậy cao và khả năng được sử dụng trong mạng lưới không ổn định. Nó
dựa trên một Broker (tạm dịch là “Máy chủ môi giới”) “nhẹ” (khá ít xử lý) và
được thiết kế có tính mở (tức là không đặc trưng cho ứng dụng cụ thể nào),
đơn giản và dễ cài đặt.

3.1.2 Giao tiếp UART


Là một trong những hình thức giao tiếp kỹ thuật số giữa thiết bị với thiết bị
đơn giản và lâu đời nhất.

Truyền nối tiếp bất đồng bộ


Dữ liệu đến đầu thu chứa đựng các bit 0 và 1, thật khó để phía đầu thu để
nhận biết được
dữ liệu này trừ khi giữa đầu phát và đầu thu thống nhất một tập hợp các quy
luật mà nó được
gọi là giao thức. Giao thức là cách thức mà dữ liệu được đóng gói, có bao
nhiêu bit liên tục
cho một ký tự và khi nào bắt đầu và dừng.
Các bit start và stop (bit bắt đầu và dừng)
Truyền dữ liệu nối tiếp bất đồng bộ được sử dụng phổ biến cho việc truyền
định hướng
ký tự. Mỗi ký tự được đặt giữa bit start và stop, đây được gọi là thiết lập khung
dữ liệu. Trong
khung dữ liệu, bit start luôn luôn là 1 bit nhưng bit stop có thể là 1 hoặc 2 bit.
Bit start luôn
luôn là 0 (mức thấp) và bit stop là 1 (mức cao). Hình 8.3 mô tả cấu trúc một dữ
liệu để gửi đi
và hình 8.4 để ví dụ gửi đi ký tự “A” có mã ASCII là 0b01000001 và chỉ sử dụng
1 bit stop.

Hình3.1.1: cấu trúc một khung dữ liệu để gửi đi

18
Đồ án 1

Hình 3.1.2: gửi đi ký tự “A”

Trong hình 8.4, khi không có sự gửi đi dữ liệu, tín hiệu ở mức cao để đánh dấu
(mark) chờ sẵn sàng để bắt đầu gửi dữ liệu. “Space” là khoảch cách truyền giữa
các ký tự liên tiếp. Đối với bảng mã ASCII chuẩn thì các ký tự có độ dài là 7-bit,
và ASCII mở rộng có độ dài ký tự là 8-bit. Trong một vài hệ thống, bit parity (bit
kiểm tra chẵn lẻ) của một byte ký tự được đính kèm trong khung dữ liệu hợp lệ
để duy trì sự toàn vẹn của dữ liệu. Điều này có nghĩa là đối với mỗi ký tự (7-bit
hoặc 8-bit) chúng ta có một bit parity đơn thêm vào. Bit parity có thể là lẻ hoặc
chẵn. Trong trường hợp bit parity lẻ thì tổng số các bit 1 trong các bit dữ liệu,
bao gồm cả bit parity, sẽ là lẻ và bit parity lẻ bằng 1. Tương tự, bit parity chẵn
thì tổng số các bit 1, bao gồm cả bit parity, sẽ là chẵn. Ví dụ, mã ASCII của “A”
là 0b0100 0001, sẽ có bit parity chẵn bằng 0. Các vi mạch UART cho phép lập
trình chọn parity chẵn, lẻ hoặc không có bit kiểm tra parity.

3.1.3 RSA
Trong mật mã học, RSA là một thuật toán mật mã hóa khóa công khai. Đây là
thuật toán đầu tiên phù hợp với việc tạo ra chữ ký điện tử đồng thời với việc
mã hóa. Nó đánh dấu một sự tiến bộ vượt bậc của lĩnh vực mật mã học trong
việc sử dụng khóa công cộng. RSA đang được sử dụng phổ biến trong thương
mại điện tử và được cho là đảm bảo an toàn với điều kiện độ dài khóa đủ lớn.

19
Đồ án 1

Hình 3.1.1: Nguyên lý hoạt động của RSA

3.1.4 Các chế độ hoạt động của ESP8266

Gồm 3 chế độ:


 Access Point Mode

Trong chế độ ACP, ESP8266 sẽ đóng vai trò là một điểm phát WIFI đồng thời ta
sẽ xây dựng 1 WebSever cho ESP8266 để ta có thể sử dụng điện thoại hoặc
máy tính truy cập vào WebSever trong ESP8266 để điều khiển thiết bị mà
ESP8266 quản lý.

20
Đồ án 1

 Station Mode

Xây dựng WebSever chứa địa chỉ IP của ESP8266 kết nối với mạng Wifi. Sau đó
ta dùng điện thoại hoặc laptop kết nối với mạng Wifi và truy cập vào IP chứa
WebSever do ESP8266 phát để điều khiển thiết bị.

 Station và Access Point Mode

ESP8266 sẽ phát mạng Wifi và ta dùng máy tính hoặc điện thoại truy cập vào
đồng thời ESP8266 sẽ kết nối vào mạng Internet. Ta xây dựng WebSever trên
ESP8266 để điều khiển ON/OFF mà ESP8266 quản lý đồng thời nó sẽ cập nhật
trạng thái của thiết bị đẩy lên Internet. Ta cũng có thể sử dụng 1 thiết bị khác
để kết nối với Sever lưu trữ dữ liệu của Internet ta sẽ điều khiển được trạng
thấi ON/OFF của những thiết bị mà ESP8266 quản lý.
21
Đồ án 1

3.2 Lưu đồ giải thuật

22
Đồ án 1

Hình 3.1.1: Lưu đồ giải thuật của hệ thống


Giải thích cách hoạt động:
Cho Device đọc dữ liệu của ccamr biến và trạng thái của thiết bị.
Nếu nhiệt độ vượt mức báo động thì bật quạt và gửi thông báo cho người dùng
(trong quá trình báo động người dùng sẽ không thể tắt quạt ngoại trừ thiết bị đèn).
Nếu sau 30s nhiệt độ vẫn không hạ xuống thấp hơn mức báo động thì chuông và đèn
LED sẽ báo động và gửi Email cho tất cả người dùng đăng kí hệ thống.
Ngược lại nhiệt độ bình thường thì hệ thống sẽ hoạt động bình thường.
Khi người dùng bật/tắt thiết bị bằng phần cứng hoặc phần mềm thì hệ thống sẽ phản
hồi trạng thái của thiết bị cho người dùng thông qua App.

23
Đồ án 1
3.3 Sơ đồ nguyên lý

Hình 3.2.1: Sơ đồ nguyên lý của hệ thống


Giải thích sơ đồ:
Tụ C1 và C3 để lọc điện áp đầu vào cấp cho chân Vi của IC 7805, tụ C1 có các dụng
cung cấp điện áp tạm thời cho chân Vi khi nguồn đột ngột bị sụt áp, tụ C3 là tụ gốm
nên trở kháng lớn, C3 có tác dụng ngăn nguồn đầu vào tăng áp đột ngột làm dạng
sóng điện áp đầu vào có hình răng cưa.
Tụ C2 và C4 để lọc điện áp cấp cho tải tiêu thụ lấy từ chân Vo của IC 7805, tụ C2 có
các dụng cung cấp điện áp tạm thời cho tải khi điện áp tải đột ngột bị sụt áp, tụ C4
trở kháng lớn, C4 có tác dụng lọc nhiễu điện áp đầu ra (nhiễu là các điện áp không
mong muốn làm cho dạng sóng điện áp ngõ ra có hình răng cưa).
Khi tín hiệu đưa vào là mức 0 (Tức =0V) thì Q1 không dẫn do không có dòng IBE =>
Role không làm việc.

24
Đồ án 1
Khi tín hiệu đưa vào là mức 1 (Tức =5V) thì sẽ qua R6 hạn dòng, phân áp qua R9 làm
cho Q1 dẫn thông lúc này ta có dòng Ice là dòng điện chạy qua cuộn dây => Q1 =>
Max, Role đóng tiếp điểm thường mở (ĐK thiết bị nào đó).
DIODE 1 trong mạch có tác dụng chống lại dòng điện cảm ứng do cuộn đây sinh ra
làm hỏng transistor.
Mục đích của R6 là tạo dòng vào cực B của trans tới ngưỡng bão hòa để trans hoạt
động như 1 chiếc khóa có điều kiện.
Cấp nguồn 12V cho mạch -> dòng điện đi qua mạch ổn áp LM7805 cho ra dòng điện
5V -> đi vào Getway được kết với loa -> kết nối GetWay với Device qua chân D1,D2->
nhận dữ liệu (nhiệt độ và độ ẩm) qua module DHT11 -> tín hiệu được gửi về thiết bị
thông qua broker (Getway) nếu nhiệt độ qua 30 oC thiết bị sẽ được nhận cảnh báo,
đèn LED và quạt sẽ được kích hoạt để làm mát và báo động cho người dùng, nếu sau
10s nhiệt độ vẫn không giảm loa sẽ được kích hoạt và tiếp tục gửi tín hiệu về thiết bị.
Từ Device thông qua Transistor, dòng được khuếch đại để C-E nối đất tạo dòng khép
kín, và cho nguồn 5V từ LM7805 để nuôi thiết bị 1 (Led cảnh báo) và thiết bị 2 (quạt).

25
Đồ án 1

CHƯƠNG 4: THI CÔNG MẠCH

4.1 Giới thiệu những thành phần sử dụng trong App:

4.1.1 Ngôn ngữ lập trình C


Ngôn ngữ C được dùng để viết hệ điều hành UNIX bởi Dennis Ritchie vào năm 1971.
Một trong những ưu điểm lớn nhất của C là nó không bị ràng buộc bởi một phần
cứng hay một hệ thống cụ thể. Điều này khiến cho người phát triển có thể sử dụng
để viết chương trình và chạy mà không cần thay đổi cho từng hê thống riêng biệt .
Việc buld để chạy cho các hệ thống khác nhau phụ thuộc vào trình biên dịch. Chẳng
hạn, chúng ta có thể viết chương trình C sau đó sử dụng các trình biên dịch build và
chạy trên windows cũng như Linux.
C cũng được gọi là một ngôn ngữ middle-level bởi nó kết hợp giữa ngôn ngữ bậc cao
và cũng có thể truy cập rất sâu vào hệ thống như ngôn ngữ bậc thấp (chẳng hạn
thông qua con trỏ hay các hàm Assembly nhúng vào chương trình).
Để tạo ra mã máy hiệu quả (eficient high level) không những cần có thiết kế chương
trình tốt mà còn cần chú ý đến các chi tiết cài đặt nhỏ, đặc biệt là đối với hệ thống
nhúng.
Bên cạnh ưu điểm, C cũng có những nhược điểm sau:
Code lớn và không hiệu quả bằng assembly
Không hỗ trợ trực tiếp kiểu stack
Khó viết các hàm xử lý ngắt.
4.1.2 Ngôn ngữ lập trình JavaScript
JavaScript, theo phiên bản hiện hành, là một ngôn ngữ lập trình thông dịch được
phát triển từ các ý niệm nguyên mẫu. Ngôn ngữ này được dùng rộng rãi cho các
trang web (phía người dùng) cũng như phía máy chủ (với Nodejs). Nó vốn được phát
triển bởi Brendan Eich tại Hãng truyền thông Netscape với cái tên đầu tiên Mocha,
rồi sau đó đổi tên thành LiveScript, và cuối cùng thành JavaScript. Giống Java,
26
Đồ án 1
JavaScript có cú pháp tương tự C, nhưng nó gần với Self hơn Java. .js là phần mở
rộng thường được dùng cho tập tin mã nguồn JavaScript.
4.1.3 CSS
CSS là ngôn ngữ tạo phong cách cho trang web – Cascading Style Sheet language. Nó
dùng để tạo phong cách và định kiểu cho những yếu tố được viết dưới dạng ngôn
ngữ đánh dấu, như là HTML. Nó có thể điều khiển định dạng của nhiều trang web
cùng lúc để tiết kiệm công sức cho người viết web. Nó phân biệt cách hiển thị của
trang web với nội dung chính của trang bằng cách điều khiển bố cục, màu sắc, và
font chữ.
4.1.4 HTML
HTML là một ngôn ngữ đánh dấu được thiết kế ra để tạo nên các trang web trên
World Wide Web. Nó có thể được trợ giúp bởi các công nghệ như CSS và các ngôn
ngữ kịch bản giống như JavaScript.

Các trình duyệt web nhận tài liệu HTML từ một web server hoặc một kho lưu trữ cục
bộ và render tài liệu đó thành các trang web đa phương tiện. HTML mô tả cấu trúc
của một trang web về mặt ngữ nghĩa và các dấu hiệu ban đầu được bao gồm cho sự
xuất hiện của tài liệu.

Các phần tử HTML là các khối xây dựng của các trang HTML. Với cấu trúc HTML, hình
ảnh và các đối tượng khác như biểu mẫu tương tác có thể được nhúng vào trang
được hiển thị. HTML cung cấp một phương tiện để tạo tài liệu có cấu trúc bằng cách
biểu thị ngữ nghĩa cấu trúc cho văn bản như headings, paragraphs, lists, links, quotes
và các mục khác. Các phần tử HTML được phân định bằng các tags, được viết bằng
dấu ngoặc nhọn. Các tags như <img /> và <input /> giới thiệu trực tiếp nội dung vào
trang. Các tags khác như <p> bao quanh và cung cấp thông tin về văn bản tài liệu và
có thể bao gồm các thẻ khác làm phần tử phụ. Các trình duyệt không hiển thị các thẻ
HTML, nhưng sử dụng chúng để diễn giải nội dung của trang.

27
Đồ án 1
HTML có thể nhúng các chương trình được viết bằng scripting như JavaScript, điều
này ảnh hưởng đến hành vi và nội dung của các trang web. Việc bao gồm CSS xác
định giao diện và bố cục của nội dung. World Wide Web Consortium (W3C), trước
đây là đơn vị bảo trì HTML và là người duy trì hiện tại của các tiêu chuẩn CSS, đã
khuyến khích việc sử dụng CSS trên HTML trình bày rõ ràng kể từ năm 1997.

4.1.5 NodeJS
Node.js là một hệ thống phần mềm được thiết kế để viết các ứng dụng internet có
khả năng mở rộng, đặc biệt là máy chủ web. Chương trình được viết bằng JavaScript,
sử dụng kỹ thuật điều khiển theo sự kiện, nhập/xuất không đồng bộ để tối thiểu tổng
chi phí và tối đa khả năng mở rộng. Node.js bao gồm có V8 JavaScript engine của
Google, libUV, và vài thư viện khác.
Cách cài đặt:
Truy cập: https://nodejs.org/en/download/

Lựa chọn phiên bản theo máy của bạn

28
Đồ án 1

Tìm file setup:

Hiện ra cửa sổ:


Cài đặt NodeJS trên Windows rất đơn giản, chấp nhận các tùy chọn mặc định
và nhấn "Next .. Next" cho tới bước cuối cùng.

29
Đồ án 1

30
Đồ án 1

Theo mặc định, phần mềm NPM cũng được cài đặt vào hệ thống của bạn. Đây là một
phần mềm quản lý các thư viện Javascript.

31
Đồ án 1

Kiểm tra cấu hình:


Mở cửa sổ CMD và thực thi các lệnh sau để kiểm tra phiên bản của NodeJS và
NPM:
node -v
32
Đồ án 1
npm -v

4.1.5 ReactJS
là một thư viện JavaScript front-end mã nguồn mở miễn phí để xây dựng giao diện
người dùng dựa trên các thành phần UI. Nó được duy trì bởi Meta và một cộng đồng
các nhà phát triển và công ty cá nhân.
Cách cài đặt:
Sử dụng cmd và dán các câu lệnh sau :
npm install -g create-react-app
create-react-app your-app-name
cd your-app-name
npm start
4.1.6 MONGO DB
MongoDB là một hệ quản trị cơ sở dữ liệu mã nguồn mở, là cơ sở dữ liệu thuộc
NoSql và được hàng triệu người sử dụng.
MongoDB là một database hướng tài liệu (document), các dữ liệu được lưu trữ trong
document kiểu JSON thay vì dạng bảng như CSDL quan hệ nên truy vấn sẽ rất nhanh.

33
Đồ án 1
Với CSDL quan hệ chúng ta có khái niệm bảng, các cơ sở dữ liệu quan hệ (như MySQL
hay SQL Server...) sử dụng các bảng để lưu dữ liệu thì với MongoDB chúng ta sẽ dùng
khái niệm là collection thay vì bảng
So với RDBMS thì trong MongoDB collection ứng với table, còn document sẽ ứng với
row , MongoDB sẽ dùng các document thay cho row trong RDBMS.
Các collection trong MongoDB được cấu trúc rất linh hoạt, cho phép các dữ liệu lưu
trữ không cần tuân theo một cấu trúc nhất định.
Thông tin liên quan được lưu trữ cùng nhau để truy cập truy vấn nhanh thông qua
ngôn ngữ truy vấn MongoDB

4.2 CODE hoạt động

Code Getway:
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != btnState) {
btnState = reading;

if (btnState == LOW) {
if (onoff == 0) {
onoff = 1;
digitalWrite(output1, 1);
} else {
onoff = 0;
digitalWrite(output1, 0);
}
guiStateRelay(output1);
}

}
}

34
Đồ án 1

lastBtnState = reading;
}

void button2(){
int reading = digitalRead(BUTTON2);

if (reading != lastBtnState2) {
lastDebounceTime2 = millis();
}

if ((millis() - lastDebounceTime2) > debounceDelay) {


if (reading != btnState2) {
btnState2 = reading;

if (btnState2 == LOW) {
if (onoff2 == 0) {
onoff2 = 1;
checkButton2 = 1;
checkSend = true;
digitalWrite(output2, 1);

} else {
onoff2 = 0;
checkButton2=1;
checkSend = false;
digitalWrite(output2, 0);
}
guiStateRelay(output2);

35
Đồ án 1
}

}
}

lastBtnState2 = reading;
}

void readDHT(){
float h = dht.readHumidity();
float t = dht.readTemperature();

if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
t = random(27,40);
h = random(55,70);
}
humid = h;
temp = t;

// Nếu nhiệt độ lớn hơn 33 thì


if(temp > tempCompareMax && state2 ){ // Nếu nhiệt độ lớn hơn mà động cơ
chưa bật
digitalWrite(output2, 0);
checkButton2 = 0;
onoff2 = 1;
if(!checkSend){
guiStateRelay(output2);
checkSend = true;

36
Đồ án 1
}
}

else if (temp < tempCompareMin && !state2){


if(checkButton2 == 0){
digitalWrite(output2, 1);
digitalWrite(ledRed, 0);
onoff2 = 0;
if(checkSend){
guiStateRelay(output2);
checkSend = false;
}
}
}
}
void demo_TIMER(int w){
if ((unsigned long) millis() - t_demo >= max_demo) {
t_demo = millis();
guiDHT(w);
}
}
void setup() {

Serial.begin (BAUD_RATE);
dht.begin();
//----------
swSer.begin(BAUD_RATE);

pinMode(BUTTON1, INPUT);

37
Đồ án 1
pinMode(BUTTON2, INPUT);
pinMode(output1, OUTPUT);
pinMode(output2, OUTPUT);
// pinMode(Buzzer, OUTPUT);
pinMode(ledRed, OUTPUT);
digitalWrite(output1,1);
digitalWrite(output2,1);
digitalWrite(ledRed,0);
readStateRelay();
Serial.println("\nRSA serial test started");
}
void loop() {
DesLen=0;
if(rsa.Receive(buff,&BEGIN,&END,m,&DesLen))
{
if(DesLen>0)
{
Serial.println("-Nhan tu getway:");
Serial.println((char*)m);
request((char*)m);
}
}
else Serial.println("Nhan error:");
button1();
button2();
if (temp < tempCompareMax){
startMillisTemp = millis();
demo_TIMER(0);
}

38
Đồ án 1
else{
if((unsigned long)millis() - startMillisTemp >= warningTime){ // Nếu trạng thái của
relay1 luôn bật trong khoảng thời gian 10s
//Getway sẽ nhận goi từ esp8266 là nhiệt độ độ ẩm
//còn esp8266 sẽ nhận điều khiển contac từ gói của getway
#include <ESP8266WiFi.h>
#include <MQTT.h>
#define mqtt_server "192.168.43.32"
#define mqtt_user "ThanhNhanViTuong"
#define mqtt_pwd "doan1thanhnhanvituong"
#include "RSAAuth.h" // Rx = D1, Tx = D 2
#define BAUD_RATE 9600
#include <ArduinoJson.h>
DynamicJsonDocument doc(1024);

WiFiClient espClient;
MQTTClient client;

char* ssid = "NhanSgu";


char* pass = "123456789";

char r;
int idrl;
char w;
char cstr[255];
byte en[255];
byte pac[255];
// Hàm kết nối wifi
void setup_wifi() {

39
Đồ án 1
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}

void callback(String topic, String payload) {


deserializeJson(doc, payload);
JsonObject obj = doc.as<JsonObject>();
int IDGW = obj["idgw"];
if(IDGW == 1){
for(int i=0;i<payload.length();i++)
cstr[i]=0;
payload.toCharArray(cstr,payload.length());
yield();
rsa.Send(cstr);
Serial.println("-Gui:");
Serial.println((char*)cstr);
}
}

40
Đồ án 1

// Hàm reconnect thực hiện kết nối lại khi mất kết nối với MQTT Broker
void reconnect() {
// Chờ tới khi kết nối
while (!client.connected()) {

if (client.connect("ESP8266Client",mqtt_user, mqtt_pwd)) {
Serial.print("Attempting MQTT connection...");
// Thực hiện kết nối với mqtt user và pass
Serial.println("connected");
// Khi kết nối sẽ publish thông báo
client.publish("demo", "{\"message\":\"ESP_reconnected\"}");
// ... và nhận lại thông tin này
client.subscribe("doan1/relay");
} else {
Serial.print("failed");
Serial.println(" try again in 5 seconds");
// Đợi 5s
delay(5000);
}
}
}

void request(String payload) {


deserializeJson(doc, payload);
JsonObject obj = doc.as<JsonObject>();
r = obj["r"];
w = obj["w"];
idrl = obj["idrl"];

41
Đồ án 1
}
void setup() {
Serial.begin(BAUD_RATE);
swSer.begin(BAUD_RATE);
setup_wifi();
client.begin(mqtt_server, espClient);
client.onMessage(callback);
reconnect();
Serial.println("\nRSA serial test started");
}
byte buff[255];
int BEGIN=0;
int END=0;
int DesLen=0;

//byte unpac[255];
byte m[255];
void loop() {
client.loop();
if (!client.connected()) {
reconnect();
}

DesLen=0;
if(rsa.Receive(buff,&BEGIN,&END,m,&DesLen))
{
if(DesLen>0)
{
request((char*)m);

42
Đồ án 1
Serial.println("-Nhan tu DV 2:");
Serial.println((char*)m);
Serial.println("=======================================================
====");
if(r==1 && idrl==14){
client.publish("doan1/relay1/state",(char*)m);
return;
Code Device:
#include <ArduinoJson.h>
#include "RSAAuth.h" // Rx = D1, Tx = D 2
#include "DHT.h"
#define DHTTYPE DHT11
#define DHTPin 13 //D7
// output 14/12 / 15
#define BUTTON1 10 // SD3
#define BUTTON2 9 // SD2
#define ledRed 15 // D8
#define output1 14 //D5
#define output2 12 //D6

DHT dht(DHTPin, DHTTYPE); // Initialize DHT sensor.


#define BAUD_RATE 9600
static unsigned long t_demo = 0;
/* current counting time for LCD Display */
unsigned long max_demo = 5*1000;

float tempCompareMax = 32;


float tempCompareMin = 29;
DynamicJsonDocument doc(1024);

43
Đồ án 1
float temp = 1;
float humid = 1;
char cstr[255];

bool checkSend = false;

unsigned long lastDebounceTime = 0;


unsigned long debounceDelay = 20;

unsigned long startMillisTempLed = 0;

int btnState;
int lastBtnState = HIGH;
unsigned char onoff = 0;
unsigned char checkButton2 = 0;
unsigned long lastDebounceTime2 = 0;

int btnState2;

int lastBtnState2 = HIGH;


unsigned char onoff2 = 0;
bool state1 = false;
bool state2 = false;

byte buff[255];
int BEGIN=0;
int END=0;
int DesLen=0;
//byte unpac[255];

44
Đồ án 1
unsigned long startMillisTemp = 0;
unsigned long warningTime = 30000;
bool checkWarning = false;
byte m[255];
void rsaSend(){
Serial.println("-Gui:");
Serial.println((char*)cstr);
yield();
rsa.Send(cstr);
}

void readStateRelay(){
lastBtnState = state1 = digitalRead(output1);
lastBtnState2 = state2 = digitalRead(output2);
}

void guiDHT (int w) {


readDHT();
readStateRelay();
for(int i=0;i<100;i++)
cstr[i]=0;
sprintf(cstr,"{\"idgw\":1,\"t\":%.2f,\"h\":
%.2f,\"iddv\":1,\"st1\":\"%s\",\"st2\":\"%s\",\"w\":%d}",
temp,humid, state1 ? "OFF":"ON", state2 ? "OFF":"ON",w);
rsaSend();
}

void guiStateRelay (int idrl) {


readStateRelay();

45
Đồ án 1
for(int i=0;i<100;i++)
cstr[i]=0;
sprintf(cstr,"{\"idgw\":1,\"t\":%.2f,\"h\":
%.2f,\"iddv\":1,\"st1\":\"%s\",\"st2\":\"%s\",\"idrl\":%d,\"r\":1}",
temp,humid, state1 ? "OFF":"ON", state2 ? "OFF":"ON", idrl);
rsaSend();
}

void request(String payload) {


deserializeJson(doc, payload);
JsonObject obj = doc.as<JsonObject>();
int IDRL = obj["idrl"];
int ID = obj["iddv"];
int IDGW = obj["idgw"];
String con = obj["state"].as<String>();

if(IDGW == 1 && ID ==1)


{
switch(IDRL){
case output1:{
if(con=="on"){
digitalWrite(output1,0);
onoff = 1;
delay(100);
}
else{
digitalWrite(output1,1);
onoff = 0;
delay(100);

46
Đồ án 1
}
break;
}
case output2:{
if(con=="on"){
digitalWrite(output2,0);
onoff2 = 1;
delay(100);
}
else{
digitalWrite(output2,1);
onoff2 = 0;
delay(100);
}
break;
}
}
guiStateRelay(IDRL);
}
}

void button1(){
int reading = digitalRead(BUTTON1);

if (reading != lastBtnState) {
lastDebounceTime = millis();
}
// mà nhiệt độ vẫn trên mức báo động thì bật led đỏ thông báo đến người dùng
if((unsigned long)millis() - startMillisTempLed >= 500){

47
Đồ án 1
readDHT();
if(digitalRead(ledRed))
digitalWrite(ledRed, 0);
else {
digitalWrite(ledRed, 1);
guiDHT(1); //neu check bang 1 thi van warning
}
startMillisTempLed = millis();
}
}
else demo_TIMER(0);
}
}
}
if(r==1 && idrl==12){
client.publish("doan1/relay2/state",(char*)m);
return;
}
if(w==1){
client.publish("doan1/warning",(char*)m);
return;
}

//xử lý đưa nhiệt độ độ ẩm lên App c# ở đây


client.publish("doan1/dht11",(char*)m);
}
}
else Serial.println("Nhan error:");

48
Đồ án 1
}
device
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != btnState) {
btnState = reading;

if (btnState == LOW) {
if (onoff == 0) {
onoff = 1;
digitalWrite(output1, 1);
} else {
onoff = 0;
digitalWrite(output1, 0);
}
guiStateRelay(output1);
}

}
}

lastBtnState = reading;
}

void button2(){
int reading = digitalRead(BUTTON2);

if (reading != lastBtnState2) {
lastDebounceTime2 = millis();
}

49
Đồ án 1

if ((millis() - lastDebounceTime2) > debounceDelay) {


if (reading != btnState2) {
btnState2 = reading;

if (btnState2 == LOW) {
if (onoff2 == 0) {
onoff2 = 1;
checkButton2 = 1;
checkSend = true;
digitalWrite(output2, 1);

} else {
onoff2 = 0;
checkButton2=1;
checkSend = false;
digitalWrite(output2, 0);
}
guiStateRelay(output2);
}

}
}

lastBtnState2 = reading;
}

void readDHT(){
float h = dht.readHumidity();

50
Đồ án 1
float t = dht.readTemperature();

if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
t = random(27,40);
h = random(55,70);
}
humid = h;
temp = t;

// Nếu nhiệt độ lớn hơn 33 thì


if(temp > tempCompareMax && state2 ){ // Nếu nhiệt độ lớn hơn mà động cơ
chưa bật
digitalWrite(output2, 0);
checkButton2 = 0;
onoff2 = 1;
if(!checkSend){
guiStateRelay(output2);
checkSend = true;
}
}

else if (temp < tempCompareMin && !state2){


if(checkButton2 == 0){
digitalWrite(output2, 1);
digitalWrite(ledRed, 0);
onoff2 = 0;
if(checkSend){
guiStateRelay(output2);

51
Đồ án 1
checkSend = false;
}
}
}
}
void demo_TIMER(int w){
if ((unsigned long) millis() - t_demo >= max_demo) {
t_demo = millis();
guiDHT(w);
}
}
void setup() {

Serial.begin (BAUD_RATE);
dht.begin();
//----------
swSer.begin(BAUD_RATE);

pinMode(BUTTON1, INPUT);
pinMode(BUTTON2, INPUT);
pinMode(output1, OUTPUT);
pinMode(output2, OUTPUT);
// pinMode(Buzzer, OUTPUT);
pinMode(ledRed, OUTPUT);
digitalWrite(output1,1);
digitalWrite(output2,1);
digitalWrite(ledRed,0);
readStateRelay();
Serial.println("\nRSA serial test started");

52
Đồ án 1
}
void loop() {
DesLen=0;
if(rsa.Receive(buff,&BEGIN,&END,m,&DesLen))
{
if(DesLen>0)
{
Serial.println("-Nhan tu getway:");
Serial.println((char*)m);
request((char*)m);
}
}
else Serial.println("Nhan error:");
button1();
button2();
if (temp < tempCompareMax){
startMillisTemp = millis();
demo_TIMER(0);
}
else{
if((unsigned long)millis() - startMillisTemp >= warningTime){ // Nếu trạng thái của
relay1 luôn bật trong khoảng thời gian 10s
//Getway sẽ nhận goi từ esp8266 là nhiệt độ độ ẩm
//còn esp8266 sẽ nhận điều khiển contac từ gói của getway
#include <ESP8266WiFi.h>
#include <MQTT.h>
#define mqtt_server "192.168.43.32"
#define mqtt_user "ThanhNhanViTuong"
#define mqtt_pwd "doan1thanhnhanvituong"

53
Đồ án 1
#include "RSAAuth.h" // Rx = D1, Tx = D 2
#define BAUD_RATE 9600
#include <ArduinoJson.h>
DynamicJsonDocument doc(1024);

WiFiClient espClient;
MQTTClient client;

char* ssid = "NhanSgu";


char* pass = "123456789";

char r;
int idrl;
char w;
char cstr[255];
byte en[255];
byte pac[255];
// Hàm kết nối wifi
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");

54
Đồ án 1
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}

void callback(String topic, String payload) {


deserializeJson(doc, payload);
JsonObject obj = doc.as<JsonObject>();
int IDGW = obj["idgw"];
if(IDGW == 1){
for(int i=0;i<payload.length();i++)
cstr[i]=0;
payload.toCharArray(cstr,payload.length());
yield();
rsa.Send(cstr);
Serial.println("-Gui:");
Serial.println((char*)cstr);
}
}

// Hàm reconnect thực hiện kết nối lại khi mất kết nối với MQTT Broker
void reconnect() {
// Chờ tới khi kết nối
while (!client.connected()) {

if (client.connect("ESP8266Client",mqtt_user, mqtt_pwd)) {
Serial.print("Attempting MQTT connection...");
// Thực hiện kết nối với mqtt user và pass
Serial.println("connected");

55
Đồ án 1
// Khi kết nối sẽ publish thông báo
client.publish("demo", "{\"message\":\"ESP_reconnected\"}");
// ... và nhận lại thông tin này
client.subscribe("doan1/relay");
} else {
Serial.print("failed");
Serial.println(" try again in 5 seconds");
// Đợi 5s
delay(5000);
}
}
}

void request(String payload) {


deserializeJson(doc, payload);
JsonObject obj = doc.as<JsonObject>();
r = obj["r"];
w = obj["w"];
idrl = obj["idrl"];
}
void setup() {
Serial.begin(BAUD_RATE);
swSer.begin(BAUD_RATE);
setup_wifi();
client.begin(mqtt_server, espClient);
client.onMessage(callback);
reconnect();
Serial.println("\nRSA serial test started");
}

56
Đồ án 1
byte buff[255];
int BEGIN=0;
int END=0;
int DesLen=0;

//byte unpac[255];
byte m[255];
void loop() {
client.loop();
if (!client.connected()) {
reconnect();
}

DesLen=0;
if(rsa.Receive(buff,&BEGIN,&END,m,&DesLen))
{
if(DesLen>0)
{
request((char*)m);
Serial.println("-Nhan tu DV 2:");
Serial.println((char*)m);
Serial.println("=======================================================
====");
if(r==1 && idrl==14){
client.publish("doan1/relay1/state",(char*)m);
return;

57
Đồ án 1

4.3 Thành phẩm

58
Đồ án 1

Hình 4.7.1: Sơ đồ mô phỏng

Hình 4.7.2: sơ đồ mạch in

59
Đồ án 1

Hình 4.7.3: mạch thực tế


Cấu trúc thư mục của server express nơi thực hiện các thao tác liên quan đến
cơ sở dữ liệu

60
Đồ án 1

Cấu trúc thư mục của App Reactjs nơi tạo nên các element giúp người dùng có
thể tương tác được với hệ thống
Source code của hệ thống

61
Đồ án 1
https://drive.google.com/drive/folders/1RNLrTGaVyb8bQEZ6SiNF8tbl-
dHtwGWN?usp=sharing

Cấu trúc thư mục của broker MQTT

62
Đồ án 1

Trang đăng nhập

63
Đồ án 1

Nếu tài khoản chưa đăng ký

Tràn đăng ký

64
Đồ án 1

Sau khi đăng ký xong thì đăng nhập vào broker

Trang chủ

65
Đồ án 1

66
Đồ án 1

67
Đồ án 1

68
Đồ án 1
Trang nhiệt độ độ ẩm

69
Đồ án 1

70
Đồ án 1

71
Đồ án 1

Trang thiết bị 2

72
Đồ án 1

73
Đồ án 1

Cảnh báo

74
Đồ án 1

Cơ sở dữ liệu

Các trường của document dht11 khóa chính là ID

Các trường của document email khóa chính là ID

Các trường của document relay1 khóa chính là ID

75
Đồ án 1

Các trường của document relay2 khóa chính là ID

Các trường của document user khóa chính là ID

76
Đồ án 1

CHƯƠNG 5: KẾT LUẬT VÀ HƯỚNG PHÁT TRIỂN

5.1 Ưu nhược điểm của hệ thống:

Ưu điểm:
Dễ sử dụng
Có thể thay thế 2 ESP8266 bằng Arduino hay con vi điều khiển khác
Giá linh kiện rẻ
Nhược điểm
Khoảng cách liên kết của hai ESP ngắn

5.2 Hướng phát triển

77
Đồ án 1

TÀI LIỆU THAM KHẢO

1 https://dientutuonglai.com/mach-on-ap-su-dung-lm7805.html
2 https://vi.wikipedia.org/wiki/Node.js
3 https://vi.wikipedia.org/wiki/JavaScript
4 https://viblo.asia/p/mongodb-la-gi-co-so-du-lieu-phi-quan-he-bJzKmgoPl9N
5 https://viblo.asia/p/bat-dau-voi-reactjs-YWOZrDGP5Q0
6 https://www.tma.vn/Hoi-dap/Cam-nang-nghe-nghiep/Su-dung-C-de-lap-trinh-
nhung/21416
7 https://openplanning.net/12117/bat-dau-nhanh-voi-react
8 https://vi.wikipedia.org/wiki/HTML
9 https://openplanning.net/11921/cai-dat-nodejs-tren-windows
10 https://www.hostinger.vn/huong-dan/css-la-gi
11 https://vi.wikipedia.org/wiki/Internet_V%E1%BA%A1n_V%E1%BA%ADt
12 https://dientutuonglai.com/arduino-ide-la-gi.html
13 https://dientutuonglai.com/giao-tiep-uart-la-gi.html
14 https://viblo.asia/p/mqtt-la-gi-vai-tro-cua-mqtt-trong-iot-V3m5WL3bKO7
15 https://vi.wikipedia.org/wiki/RSA_(m%C3%A3_h%C3%B3a)

78
Đồ án 1

NHỮNG TỪ VIẾT TẮT VÀ THUẬT NGỮ THƯỜNG SỬ DỤNG

Từ viết tắt:
IoT: Internet of Things (Internet vạn vật)
MQTT: Message Queuing Telemetry Transport (Giao thức mạng kích thước nhỏ)
UART: Universal asynchronous receiver transmitter (bộ truyền nhận nối tiếp bất
đồng bộ).
IDE: Integrated Development Environment (Môi trường thiết kế hợp nhất)
JS: JavaScript
CSS: Cascading Style Sheet
HTML: HyperText Markup Language hay (Ngôn ngữ Đánh dấu Siêu văn bản)
UI: User Interface (Giao diện người dùng)
JSON: JavaScript Object Notation
SQL Server/ MySQL: Structure Query Language
RDBMS: Relational database management system
Thuật ngữ
_id : Là trường bắt buộc có trong mỗi document. Trường _id đại diện cho một giá trị
duy nhất trong document MongoDB. Trường _id cũng có thể được hiểu là khóa chính
trong document. Nếu bạn thêm mới một document thì MongoDB sẽ tự động sinh ra
một _id đại diện cho document đó và là duy nhất trong cơ sở dữ liệu MongoDB.

Collection : Là nhóm của nhiều document trong MongoDB. Collection có thể được
hiểu là một bảng tương ứng trong cơ sở dữ liệu RDBMS (Relational Database
Management System). Collection nằm trong một cơ sở dữ liệu duy nhất. Các
collection không phải định nghĩa các cột, các hàng hay kiểu dữ liệu trước.

Cursor: Đây là một con trỏ đến tập kết quả của một truy vấn. Máy khách có thể lặp
qua một con trỏ để lấy kết quả.

Database: Nơi chứa các Collection, giống với cơ sở dữ liệu RDMS chúng chứa các
bảng. Mỗi Database có một tập tin riêng lưu trữ trên bộ nhớ vật lý. Một mấy chủ
MongoDB có thể chứa nhiều Database.

Document: Một bản ghi thuộc một Collection thì được gọi là một Document. Các
Document lần lượt bao gồm các trường tên và giá trị.

Field: Là một cặp name – value trong một document. Một document có thể có không
hoặc nhiều trường. Các trường giống các cột ở cơ sở dữ liệu quan hệ.

JSON: Viết tắt của JavaScript Object Notation. Con người có thể đọc được ở định
dạng văn bản đơn giản thể hiện cho các dữ liệu có cấu trúc. Hiện tại JSON đang hỗ
trợ rất nhiều ngôn ngữ lập trình.

79
Đồ án 1
Index: Là những cấu trúc dữ liệu đặc biệt, dùng để chứa một phần nhỏ của các tập
dữ liệu một cách dễ dàng để quét. Chỉ số lưu trữ giá trị của một fields cụ thể hoặc
thiết lập các fields, sắp xếp theo giá trị của các fields này. Index hỗ trợ độ phân tích
một cách hiệu quả các truy vấn. Nếu không có chỉ mục, MongoDB sẽ phải quét tất cả
các documents của collection để chọn ra những document phù hợp với câu truy vấn.
Quá trình quét này là không hiệu quả và yêu cầu MongoDB để xử lý một khối lượng
lớn dữ liệu.

80

You might also like