Chuyên ngành: Công nghệ phần mềm Tên đề tài: Xây dựng hệ thống dự báo nhiệt độ sau 1 giờ dựa trên mô hình Họ và tên giảng viên hướng dẫn: Huỳnh Nam NHẬN XÉT 1. Về nội dung đề tài và khối lượng thực hiện ……………………………………………………………………………………………… ……………………………………………………………………………………………… ……………………………………………………………………… 2. Ưu điểm ……………………………………………………………………………………………… ……………………………………………………………………………………………… ……………………………………………………………………… 3. Khuyết điểm ……………………………………………………………………………………………… ……………………………………………………………………………………………… ……………………………………………………………………… 4. Đánh giá loại: ………………………………………………………………………….................... 5. Điểm: ……………………………………………………………………………………… TP. Hồ Chí Minh, ngày…tháng…năm 2020 Giảng viên hướng dẫn (Ký & ghi rõ họ tên) Nhóm thực hiên LỜI CẢM ƠN đề tài xin chân thành cảm ơn Thầy Huỳnh Nam – giảng viên môn học Điện toán đám mây (Cloud Computing), đã giúp đỡ chúng em rất nhiều trong viêc lựa chọn đề tài, hướng dẫn thực hiên, nêu ý kiến nhân xét, cung cấp tài liêu tham khảo trong quá trình thực hiên đề tài. Chúng em còn gửi lời cảm ơn đến quý thầy cô khoa Công nghê ̣ thông tin trường đã giúp đỡ, giải đáp thắc mắc trong quá trình thực hiêṇ . Đồng thời cảm ơn các anh chị khóa trước đã cung cấp nhiều thông tin, tài liêu tham khảo; các bạn cùng khóa cùng nhau trao đổi kinh nghiêm để thực hiên đề tài tốt hơn. Nhóm chúng em rất mong nhân được những ý kiến đóng góp của thầy và các bạn để đề tài ngày càng hoàn thiêṇ . Xin chân thành cảm ơn! Nhóm thực hiên đề tài. TP.HCM, ngày 05 tháng 07 năm 2020 Nhóm SV thực hiêṇ Mục lục PHIẾU NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN 3 LỜI CẢM ƠN 4 1. Kế hoạch làm việc 6 2. Bản đánh giá các thành viên và tỉ lệ đóng góp 7 3. Mô tả bài toán 8 4. Kiến trúc tổng quát của hệ thống 9 5. Quá trình xây dựng 9 a. Module IoT 9 i. Mô tả thiết bị 9 ii. Mô hình triển khai 11 iii. Mã nguồn 12 iv. Cài đặt và vận hành 15 v. Kết quả 17 b. Mô đun AI 18 i. Mô tả phương pháp xử lý, xây dựng dữ liệu huấn luyện 18 ii. Mô hình huấn luyện 18 iii. Mã nguồn 20 iv. Kết quả 21 c. Module Restful API 22 i. Giới thiệu về Restful API 22 i. Mô tả 23 ii. Mô hình triển khai 24 iii. Mã nguồn 24 iv. Cài đặt và vận hành 29 v. Kết quả 32 b. Module Mobile (React) 36 i. Mô tả 36 ii. Mô hình triển khai 37 iii. Mã nguồn 37 iv. Cài đặt và vận hành 40 v. Kết quả 44 6. Kết quả hệ thống 44 7. Ưu điểm và nhược điểm 45 8. Kết luận 46 9. Phương hướng phát triển 47 10. Tham khảo 48 1. Kế hoạch làm việc Thời gian Công việc 21/04/2020-29/05/2020 (Phase 1) - Tìm hiểu kiến thức về lập trình Arduino. - Tìm và đặt mua thiết bị cần thiết. - Tiến hành cài đặt, triển khai, nạp code cho thiết bị để lấy và đưa dữ liệu cảm biến lên Firebase. 30/05/2020-04/06/2020 (Phase 2) - Chuẩn bị kiển thức về lập trình Python. - Sử dụng ngôn ngữ Python để viết chương trình lấy và xử lí dữ liệu từ Firebase. 05/06/2020-21/06/2020 (Phase 2 – tiếp tục) - Xử lí dữ liệu để phù hợp với module AI. - Cài đặt module AI để phục vụ cho đề tài. 22/06/2020-28/06/2020 - Chuẩn bị kiến thức về restful API. - Nghiên cứu module AI trường hợp 2 biến. - Tiến hành cài đặt restful API. - Chuẩn bị kiến thức về React Native để tạo ứng dụng mobile sử dụng API hiển thị và dự báo thời tiết. 29/06/2020-05/07/2020 - Chỉnh sửa các module để phù hợp với mô hình 2 biến. - Hoàn thiện module API và deploy lên AWS. - Tạo ứng dụng mobile bằng React Native sử dụng API để hiển thị và dự báo nhiệt độ. - Viết báo cáo.
Kế hoạch làm việc
- Tìm hiểu kiến thức về lập trình Arduino.
- Tìm và đặt mua thiết bị cần thiết.
- Tiến hành cài đặt, triển khai, nạp code cho thiết bị để lấy và đưa dữ liệu cảm biến lên Firebase.
(Phase 2) - Chuẩn bị kiển thức về lập trình Python.
- Sử dụng ngôn ngữ Python để viết chương trình lấy và xử lí dữ liệu từ Firebase.
(Phase 2 – tiếp tục) - Xử lí dữ liệu để phù hợp với module AI.
- Cài đặt module AI để phục vụ cho đề tài.
22/06/2020-28/06/2020 - Chuẩn bị kiến thức về restful API.
- Nghiên cứu module AI trường hợp 2 biến.
- Tiến hành cài đặt restful API.
Để tạo ứng dụng di động sử dụng API hiển thị và dự báo thời tiết bằng React Native, cần chuẩn bị kiến thức vững vàng về công nghệ này Từ ngày 29/06/2020 đến 05/07/2020, tiến hành chỉnh sửa các module để phù hợp với mô hình 2 biến.
- Hoàn thiện module API và deploy lên AWS.
- Tạo ứng dụng mobile bằng React Native sử dụng API để hiển thị và dự báo nhiệt độ.
Bản đánh giá các thành viên và tỉ lệ đóng góp
Tên thành viên Công việc Đánh giá Tỉ lệ đóng góp
Viet báo cáo về phần module API.
Xây dựng ứng dụng mobile.
Phát triển mô hình hồi quy tuyến tính đa biến.
Viết báo cáo phần hồi quy tuyến tính.
Hỗ trợ chỉnh sửa các module cho phù hợp.
Hỗ trợ hoàn thiện báo cáo.
Xây dựng module AI Viết báo cáo về phần module AI.
Xây dựng module IoT Viết báo cáo về phần module IoT.
Mô tả bài toán
- Xây dựng hệ thống dự báo nhiệt độ sau 1 giờ đựa trên mô hình
Dữ liệu sẽ được ghi lại mỗi 5 giây, và thuật toán AI sẽ cung cấp phương trình hồi quy tuyến tính đa biến Mo đun API sẽ hiển thị và tính toán dự báo nhiệt độ sau 1 giờ.
Yêu cầu hệ thống phải giải quyết được những vấn đề sau
- Vấn đề ở thiết bị IoT
+ Khoảng thời gian giữa mỗi lần ghi giữ liệu
+ Mất dữ liệu và cách giải quyết khi mất dữ liệu
- Vấn đề ở Mo đun AI
+ Thuật toán để xử lý dữ liệu
+ Trả về được dữ liệu của nhiệt độ hiện tại, dự báo nhiệt độ
- Vấn đề ở Mo đun Mobile
+ lấy được dữ liệu từ Restful API và hiển thị lên cho người dùng
Kiến trúc tổng quát của hệ thống
- Hệ thống bao gồm 4 mô đun chính
• IoT: ghi giữ liệu vào DB firebase
• AI: nhận và định dạng dữ liệu, tính toán dữ liệu để trả về phương trình
• Restful API: Thiết kế để các ứng dụng web, mobile giao tiếp với nhau, chuẩn hóa dữ liệu từ DB
• Mobile(React): Ứng dụng hiển thị nhiệt độ và dự báo nhiệt độ sau 1 giờ
Quá trình xây dựng
Nhóm chúng em đã thiết kế một module IoT nhằm đo nhiệt độ và độ ẩm, sau đó lưu trữ dữ liệu lên Firebase, dịch vụ cơ sở dữ liệu đám mây của Google Module này bao gồm bộ cảm biến DHT11 để đo nhiệt độ và độ ẩm, cùng với module thu phát wifi ESP8266 được lập trình bằng Arduino để kết nối wifi và truyền dữ liệu lên Firebase.
• Cảm biến độ ẩm và nhiệt độ DHT11
Cảm biến hiện nay rất phổ biến nhờ chi phí thấp và khả năng thu thập dữ liệu dễ dàng qua giao thức 1 wire Giao thức này sử dụng một chân Digital để truyền dữ liệu Ngoài ra, bộ tiền xử lý tín hiệu tích hợp trong cảm biến giúp đảm bảo việc đọc dữ liệu chính xác mà không cần thực hiện bất kỳ phép tính nào.
Thông số kỹ thuật của cảm biến:
Điện áp hoạt động: 3V - 5V (DC)
Dãi độ ẩm hoạt động: 20% - 90% RH, sai số ±5%RH
Dãi nhiệt độ hoạt động: 0°C ~ 50°C, sai số ±2°C
Khoảng cách truyển tối đa: 20m
Mạch thu phát Wifi ESP8266, đặc biệt là ESP-01S, được thiết kế nhỏ gọn và sử dụng giao tiếp UART để kết nối với vi điều khiển, cho phép truyền nhận dữ liệu qua Wifi Nó rất phổ biến trong các ứng dụng IoT và điều khiển thiết bị từ xa qua Wifi, với nhiều thư viện và mã mẫu phong phú từ cộng đồng.
Model: ESP8266 UART ESP-01S Ai-Thinker
Điện áp sử dụng: 3.0V~3.6V(Optimal 3.3V)
Dòng tiêu thụ: Max 320mA
Wi-Fi 2.4 GHz, hỗ trợ các chuẩn bảo mật như: OPEN, WEP, WPA_PSK, WPA2_PSK, WPA_WPA2_PSK.
Hỗ trợ cả 2 giao tiếp TCP và UDP.
Chuẩn giao tiếp UART với Firmware hỗ trợ bộ tập lệnh AT Command, tốc độ Baudrate mặc định 9600 hoặc 115200.
Có 3 chế độ hoạt động: Client, Access Point, Both Client and Access Point.
Kích thước: 24.8 x 14.3mm ii Mô hình triển khai deployment Deployment View ôdeviceằ
NTP Client GET Methods, UDP Protocol, Port 123 NTP Server return unsigned long
DHT dht.ReadHumidity() dht.ReadTemperature() return float ôdeviceằ
• Module thu phát wifi được tích hợp mã nguồn, mã nguồn khi thực thi sẽ gọi module cảm biến để lấy dữ liệu.
• Dữ liệu cần ở đây là nhiệt độ, độ ẩm và thời gian.
Đối tượng của lớp NTP Client sẽ kết nối với NTP Server thông qua phương thức GET NTP Server lắng nghe trên Port 123 sử dụng giao thức UDP và sẽ trả về thời gian hiện tại.
Đối tượng DHT được khởi tạo từ đầu sẽ được sử dụng để đọc dữ liệu, thông qua các hàm ReadHumidity() và ReadTemperature() Kết quả trả về sẽ là hai giá trị độ ẩm và nhiệt độ dưới dạng kiểu dữ liệu float.
• 3 giá trị dữ liệu sau khi lấy được sẽ được đưa lên Firebase bằng phương thức PUSH. iii Mã nguồn
Khai báo thư viện của các module, tên, địa chỉ và secret key của project trên firebase, thông tin kết nối wifi… Ở đây những thông số cần quan tâm:
FIREBASE_HOST : địa chỉ của Realtime Database trên Firebase
FIREBASE_AUTH : secret key lấy từ Project trên Firebase dùng để xác thực
WIFI_SSID và WIFI_PASSWORD : SSID và mật khẩu của wifi mà module wifi sẽ kết nối đến.
Đối tượng timeClient của lớp NTPClient dùng để đồng bộ thời gian của hệ thống với máy chủ thời gian NTP.
#include // esp8266 library
#include // dht11 temperature and humidity sensor library
#define NTP_OFFSET 0 // In seconds
#define NTP_INTERVAL 60 * 1000 // In miliseconds
#define NTP_ADDRESS "europe.pool.ntp.org"
#define FIREBASE_HOST "flask-weather-ef89d.firebaseio.com" // the project name address from firebase id
#define FIREBASE_AUTH "2GDPtvSDWP1qFInnpRz5LouoZOXTGJhOitZrmvd5" // the secret key generated from firebase
#define WIFI_SSID "Nguyet Chi Tu" // input your home or public wifi name
#define WIFI_PASSWORD "hoilamgi" //password of wifi ssid
#define DHTPIN D4 // what digital pin we're connected to
#define DHTTYPE DHT11 // select dht type as DHT
NTPClient timeClient(ntpUDP, NTP_ADDRESS, NTP_OFFSET, NTP_INTERVAL);
• Phương thức setup(): chỉ khởi chạy một lần khi bắt đầu void setup() { timeClient.begin(); Serial.begin(9600); delay(1000);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); with wifi Serial.print("Connecting to "); Serial.print(WIFI_SSID); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500);
Serial.println(); Serial.print("Connected to "); Serial.println(WIFI_SSID); Serial.print("IP Address is : ");
//print local IP address Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);// connect to firebase dht.begin();//Start reading dht sensor }
Kết nối với wifi đã được thiết lập trước, nếu thành công, tiếp tục kết nối đến Firebase bằng phương thức Firebase.begin() với hai tham số đã được khai báo Sau khi kết nối với Firebase, khởi động cảm biến DHT để thu thập dữ liệu.
Phương thức loop() thực hiện việc lặp lại mỗi 15 giây, đồng bộ hóa thời gian và lưu trữ thời gian hiện tại vào biến timeStamp Đồng thời, nó cũng lấy độ ẩm và nhiệt độ tại thời điểm đó thông qua các phương thức readHumidity() và readTemperature().
The data, including time, humidity, and temperature, is uploaded to Firebase using the pushString() method In the loop function, the time is updated with timeClient.update(), and the epoch time is retrieved via timeClient.getEpochTime() The humidity is read with dht.readHumidity(), which takes approximately 250 milliseconds, while the temperature is obtained using dht.readTemperature() in Celsius If either the humidity or temperature readings are invalid (isnan), the process will handle the error accordingly.
// Check if any reads failed and exit early (to try again) Serial.println(F("Failed to read from DHT sensor!")); return;
Serial.print("Timestamp: "); Serial.print(timeStamp); String fireTime = String(timeStamp); Serial.print("Humidity: "); Serial.print(h);
String fireHumid = String(h);//convert integer humidity to string humidity Serial.print("% Temperature: "); Serial.print(t); Serial.println("°C ");
String fireTemp = String(t);//convert integer temperature to string temperature
Firebase.pushString("/DHT11/Time", fireTime); Firebase.pushString("/DHT11/Humidity", fireHumid); and send readings Firebase.pushString("/DHT11/Temperature", fireTemp); and send readings delay(15000);
} iv Cài đặt và vận hành
Arduino IDE : tải về tại đây
Cài đặt các thư viện cho Arduino IDE gồm:
- ArduinoJson (https://github.com/bblanchon/ArduinoJson)
- NTPClient (https://github.com/arduino-libraries/NTPClient)
Mở cửa sổ Preferences trong Arduino IDE.
Nhập chuỗi https://arduino.esp8266.com/stable/package_esp8266com_index json vào Additional Board Manager URLs.
Mở Boards Manager trong Tools > Board menu và cài đặt esp8266 (sau đó chọn ESP8266 board từ menu Tools > Board menu).
- FirebaseArduino (https://github.com/FirebaseExtended/firebase- arduino)
- DHT (https://github.com/adidax/dht11)
File mã nguồn thực thi : iot.ino
Khởi động Arduino IDE và mở file iot.ino
Compile và nạp code lên board v Kết quả
Realtime Database trên Firebase có cấu trúc và dữ liệu đã được thiết lập Tuy nhiên, do khối lượng dữ liệu lớn, việc xem trực tiếp trên trình duyệt có thể gây treo máy.
Thay vì chỉ nhìn vào tổng dung lượng, bạn có thể theo dõi dung lượng đã sử dụng, với khoảng 600MB đã được tiêu thụ Đối với mô-đun AI, cần mô tả rõ phương pháp xử lý và cách xây dựng dữ liệu huấn luyện.
Ngôn ngữ Python là công cụ mạnh mẽ cho phân tích dữ liệu, cho phép xây dựng các phương trình hồi quy đa biến từ tập dữ liệu lớn trong mô hình huấn luyện train-test Nhờ đó, chúng ta có thể dự đoán nhiệt độ trong tương lai gần một cách chính xác.
- Dữ liệu trên firebase sẽ được lấy về toàn bộ để phục vụ cho việc hình thành phương trình hồi quy
- Dữ liệu sẽ được tổ chức theo mô hình huấn luyện train-test theo tỉ lệ 8-2
- Phân tích mô hình để trả về tham số phương trình hồi quy đa biến
- Sử dụng tham số của phương trình để dự đoán nhiệt độ tiếp theo ii Mô hình huấn luyện
Mô hình train-test với tỷ lệ 8-2 chia dữ liệu thành hai phần: 80% dùng để phân tích và tính toán nhằm xây dựng phương trình hồi quy đa biến, trong khi 20% còn lại được sử dụng để kiểm tra độ chính xác của phương trình.
) f(x, y) f(x,y) iii Mã nguồn iv Kết quả
Mô đun được phát triển trên máy chủ local, sử dụng dữ liệu từ Firebase để trả về các tham số của phương trình hồi quy đa biến Người dùng có thể sử dụng các tham số a, b, c để truyền vào RESTful API nhằm thực hiện các tác vụ cần thiết Giới thiệu về RESTful API.
API (Giao diện lập trình ứng dụng) là tập hợp các quy tắc và cơ chế cho phép các ứng dụng hoặc thành phần tương tác với nhau Nó cung cấp dữ liệu cần thiết cho ứng dụng của bạn dưới các định dạng phổ biến như JSON hoặc XML.
REST (REpresentational State Transfer) là một kiến trúc API sử dụng phương thức HTTP đơn giản để giao tiếp giữa các máy Thay vì sử dụng một URL để xử lý thông tin người dùng, REST gửi các yêu cầu HTTP như GET, POST, DELETE đến một URL để quản lý dữ liệu hiệu quả.
Kết quả hệ thống
Ta có một hệ thống hoàn chỉnh đáp ứng được yêu cầu của bài toán đặt ra và giải quyết được các công đoạn cần thiết như:
Mô hình thiết bị bao gồm ESP và cảm biến nhiệt độ, độ ẩm DHT11, sử dụng nguồn từ cáp USB-Type B để đo nhiệt độ và độ ẩm môi trường Dữ liệu đo được sẽ được lưu trữ trên cơ sở dữ liệu đám mây Firebase, phục vụ cho các công đoạn tiếp theo.
- Xử lí và phân tích dữ liệu đã thu thập: ta có một module AI
Ưu điểm và nhược điểm
- Mô đun IoT đơn giản, dễ cài đặt và sử dụng
- Dữ liệu ở IoT mô đun đã được xử lý việc missing, liên tục, chuẩn hóa dữ liệu ngày, độ ẩm để xử lý
Ứng dụng này sử dụng phương pháp dự báo nhiệt độ thông qua hồi quy tuyến tính đa biến với hai biến chính, nhằm nâng cao độ chính xác trong việc dự đoán Công nghệ AI được tích hợp giúp cải thiện hiệu suất và độ chính xác của quá trình dự báo.
- Ứng dụng REACT hoạt động tốt, mượt mà, thể hiện được tính năng yêu cầu + Giao diện trực quan, thân thiện với người dùng
+ Tự động tuỳ biến màn hình theo thời tiết
+ Thông tin đo đạc và dự báo đạt độ chính xác khá cao.
- Hệ thống hoàn thiện, trơn tru, các khối hoạt động thống nhất, các mô đun liên kết với nhau chặt chẽ.
Dữ liệu thu thập từ mô đun IoT có thể bị ảnh hưởng bởi nhiều yếu tố như đường truyền, tốc độ mạng, hiệu suất và môi trường, dẫn đến hiện tượng mất dữ liệu (missing).
- Khi muốn lấy nhiệt độ hiện tại ở mô đun Restful, thì toàn độ dữ liệu phải được tải xuống để lấy dữ liệu mới nhất
- Việc deploy RESTful API lên AWS yêu cầu file cấu hình phải tuân thủ các nguyên tắc nghiêm ngặt, dẫn đến việc deploy gặp nhiều khó khăn
Trong mô đun REACT, tốc độ mạng ảnh hưởng đến việc hiển thị dữ liệu, dẫn đến tình trạng chậm trễ Tuy nhiên, bạn có thể cải thiện hiệu suất bằng cách thay đổi sang server có khả năng truyền tải tốt hơn.
Phương hướng phát triển
Trong quá trình thực hiện đề tài, nhóm chúng em đã nỗ lực hết mình để tạo ra sản phẩm hoàn thiện Tuy nhiên, chúng em nhận thấy vẫn còn một số chi tiết cần được phát triển thêm.
Hiện tại, Module AI đang hoạt động cục bộ và việc kết nối với Restful API vẫn cần thực hiện thủ công Nhóm phát triển mong muốn sửa đổi Module AI để nó có thể chạy trên một máy chủ khác Sau một khoảng thời gian nhất định, Module sẽ tiến hành đào tạo và cung cấp dữ liệu cho Restful API, nhằm tự động hóa quy trình mà không cần can thiệp của con người.
Việc đọc dữ liệu từ Firebase qua Restful API hiện tại yêu cầu tải toàn bộ dữ liệu, điều này có thể làm giảm hiệu suất phản hồi, đặc biệt khi dữ liệu lớn Nhằm cải thiện hiệu năng và giảm thời gian chờ đợi phản hồi từ API, nhóm sẽ nghiên cứu và phát triển giải pháp chỉ đọc một dòng dữ liệu mới nhất.
Việc dự báo hiện tại chưa đạt độ chính xác cao, thường có sự chênh lệch lớn giữa kết quả thực tế và dự báo Do đó, cần tiến hành nghiên cứu và cải tiến mô hình AI để nâng cao tỷ lệ chính xác.