Professional Documents
Culture Documents
ĐỒ ÁN 1
2
Đồ án 1
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
Đồ án 1
4.1.5 ReactJS...............................................................................................................................32
4.1.6 MONGO DB........................................................................................................................32
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
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”.
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,…
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
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
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.
Đ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.
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.
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.
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:
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.
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:
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.
16
Đồ án 1
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.
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.
18
Đồ án 1
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
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ị.
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
22
Đồ án 1
23
Đồ án 1
3.3 Sơ đồ nguyên lý
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
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/
28
Đồ án 1
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
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
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 (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;
36
Đồ án 1
}
}
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 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());
}
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);
}
}
}
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
43
Đồ án 1
float temp = 1;
float humid = 1;
char cstr[255];
int btnState;
int lastBtnState = HIGH;
unsigned char onoff = 0;
unsigned char checkButton2 = 0;
unsigned long lastDebounceTime2 = 0;
int btnState2;
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);
}
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();
}
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;
}
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 (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;
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 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());
}
// 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);
}
}
}
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
58
Đồ án 1
59
Đồ án 1
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
62
Đồ án 1
63
Đồ án 1
Tràn đăng ký
64
Đồ án 1
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
75
Đồ án 1
76
Đồ án 1
Ư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
77
Đồ án 1
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
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