Professional Documents
Culture Documents
1
liền mạch giữa các thiết bị và nền tảng đám mây. Các tính năng của nền tảng kết nối
IoT bao gồm: quản lý kết nối, cập nhật qua Internet, định vị vị trí, cung cấp thiết bị, …
Nền tảng này chỉ cung cấp một giao diện trực quan duy nhất, cho phép người dùng có
thể giám sát, quản lý và triển khai mọi thiết bị của mình.
- Nền tảng thiết bị IoT: Trong quá trình phát triển sản phẩm IoT, phần cứng đảm
nhiệm vai trò cực kỳ quan trọng. Nền tảng thiết bị IoT có nhiệm vụ cung cấp “nguyên
liệu” xây dựng phần cứng. Nhờ đó, người dùng có thể cải tiến và phát triển các thiết bị
Io của mình.
- Nền tảng phân tích dữ liệu IoT: Các sản phẩm công nghệ IoT được tạo ra không
chỉ phục vụ nhu cầu thu thập dữ liệu mà chúng còn cung cấp những thông tin chi tiết
và hữu ích cho người dùng. Hiện nay, một số nền tảng IoT cung cấp chức năng phân
tích dữ liệu và khoa học dữ liệu dựa trên công nghệ AI. Đồng thời trực quan hoá dữ
liệu và giao diện người dùng.
Hình 4.2: Mô hình giải pháp dựa trên nền tảng IoT
2
Hình 4.3: Sơ đồ hệ thống IoT dựa trên nền tảng ThingSpeak
Một hệ thống IoT bao gồm: các thiết bị thông minh (IoT node), máy chủ đám mây
và phát triển thuật toán phân tích dữ liệu. ThingSpeak phù hợp với phần đám mây của
sơ đồ hệ thống IoT và cung cấp nền tảng để thu thập và phân tích dữ liệu từ các cảm
biến được kết nối Internet.
ThingSpeak cho phép tích hợp, trực quan hóa và xem xét các nguồn dữ liệu trực
tiếp trên đám mây. Dữ liệu được xử lý trong các kênh trong ThingSpeak. Các kênh này
có thể lưu trữ tối đa 8 trường dữ liệu. ThingSpeak lưu tất cả thông tin được gửi lên
đám mây ở một vị trí để có thể xem dữ liệu để xử lý ngoại tuyến hoặc trực tuyến. Khóa
API (Application Programming Interface) cũng được cung cấp để bảo mật dữ liệu và
dữ liệu này có thể được tải xuống an toàn từ đám mây khi đăng nhập vào tài khoản
ThingSpeak. Dữ liệu có thể được đọc theo chương trình ở định dạng CSV hoặc JSON
với sự trợ giúp của lệnh gọi API REST (Representational State Transfer) và khóa API
thích hợp. ThingSpeak tự động ánh xạ dữ liệu và theo dõi các thiết bị từ xa từ mọi nơi.
Nó hiển thị dữ liệu từ thiết bị thông minh hoặc máy chủ Web và dữ liệu chỉ đọc có thể
được chia sẻ với khách hàng và đồng nghiệp. Ngoài ra, ThingSpeak có thể được sử
dụng để xử lý dữ liệu và xây dựng giao diện người dùng riêng để khách hàng đăng
nhập. Ngoài ra, nó còn có các tính năng như phần mềm kiểm soát thời gian và phản
ứng để hệ thống hóa các phân tích. Thông qua phần mềm quản lý thời gian, một quy
3
trình có thể được lập trình để chạy mỗi ngày một lần, mỗi giờ một lần hoặc 5 phút một
lần. Ứng dụng React được sử dụng để phân tích các hoạt động. Chúng ta có thể theo
dõi dữ liệu hệ thống và thiết lập cảnh báo khi dữ liệu bất thường.
Một số tính năng chính của ThingSpeak:
- Dễ dàng định cấu hình thiết bị để truyền dữ liệu tới ThingSpeak bằng các giao
thức IoT phổ biến.
- Trực quan hóa dữ liệu cảm biến của theo thời gian thực.
- Tổng hợp dữ liệu theo yêu cầu từ các nguồn khác nhau.
- Sử dụng sức mạnh của MATLAB để phân tích dữ liệu IoT.
- Phân tích dữ liệu IoT tự động dựa trên lịch trình hoặc sự kiện.
- ThingSpeak bao gồm một Web Service (REST API) hỗ trợ cho việc thu thập, lưu
trữ dữ liệu cảm biến trên cloud và phát triển các ứng dụng IoT.
- ThingSpeak làm việc được với các board mạch phần cứng như: Arduino,
EPS8266, ESP32, NodeMCU, Raspberry Pi, …
Nguyên lý hoạt động của Thinkspeak: Thingspeak hoạt động với điện toán đám
mây, tất cả các thiết bị mà bạn muốn lấy dữ liệu phải nằm trong mạng với cơ sở dữ
liệu đám mây. Thingspeak cũng kết nối với cơ sở dữ liệu đám mây và hiển thị
luồng dữ liệu. Thingspeak hoạt động với 3 chức năng chính gồm: thu thập dữ liệu,
phân tích và thực hiện một hành động.
Nền tảng IoT Thinkspeak được ứng dụng nhiều trong các lĩnh vực như:
- Giáo dục
- Giám sát chất lượng không khí
- Giám sát năng lượng (tấm pin mặt trời)
- Giám sát để canh tác thông minh
- Nhà thông minh và tự động hóa
4
(a) (b)
(c) (d)
5
REST như GET, POST, PUT và DELETE, bạn có thể tạo kênh và cập nhật nguồn cấp
dữ liệu của kênh đó, cập nhật kênh hiện có, xóa nguồn cấp dữ liệu kênh và xóa kênh.
Trong mỗi Channel có 8 trường (Field) để lưu dữ liệu, cho phép lưu trữ tối đa 8 dữ
liệu khác nhau trong một Channel.
6
Hình 4.8: Ứng dụng trên ThingSpeak
- Ứng dụng phân tích và trực quan hoá dữ liệu dựa trên công cụ MATLAB trực
tuyến. Các ứng dụng phân tích và trực quan hóa dữ liệu cung cấp code mẫu để hỗ trợ
thực hiện các thao tác cơ bản trên dữ liệu đã lưu trữ hoặc dữ liệu trực tiếp.
Phân tích dữ liệu bằng công cụ MATLAB (MATLAB Analysis):
+ Khám phá dữ liệu được thu thập trong một kênh hoặc được lấy từ một trang web
+ Tìm và xóa dữ liệu xấu
+ Chuyển đổi dữ liệu sang các đơn vị khác nhau
+ Tính toán dữ liệu mới
+ Xây dựng mô hình dữ liệu
Hình 4.9: Ứng dụng phân tích và trực quan hoá dữ liệu
- Sử dụng các ứng dụng Actions để kích hoạt hành động hoặc chuyển đổi và trực
quan hóa dữ liệu. Bạn có thể tải dữ liệu lên từ web hoặc gửi dữ liệu từ thiết bị tới kênh
7
nền tảng ThingSpeak IoT. Sử dụng các ứng dụng này để chuyển đổi và trực quan hóa
dữ liệu trên các kênh ThingSpeak hoặc kích hoạt một hành động.
https://www.mathworks.com/help/thingspeak/mqtt-basics.html
8
IoT sensor/IoT node
(NodeMCU)
Hình 4.11: Hệ thống IoT thu thập dữ liệu với NodeMCU và ThingSpeak
Việc giao tiếp dữ liệu giữa NodeMCU và ThingSpeak được thực hiện theo hai
chiều:
4.4.1 NodeMCU truyền dữ liệu (hay ghi dữ liệu) đến ThingSpeak
NodeMCU ghi dữ liệu đến ThingSpeak thông qua các Field trong Channel. Trên
ThingSpeak cấu hình các Field Chart, Widget kết nối với các Field tương ứng để hiển
thị dữ liệu. Để ghi dữ liệu đến Field trong Channel trên ThingSpeak chúng ta sử dụng
hàm trong thư viện ThingSpeak như sau:
- WriteSingleField: Ghi dữ liệu lên 1 Field sử dụng hàm:
ThingSpeak.writeField(ChannelNumber, FieldNumber, Data, WriteAPIKey);
Trong đó:
ChannelNumber: Channel ID
Nếu dữ liệu được ghi thành công lên Field thì hàm này sẽ trả về giá trị là 200.
Ví dụ 4.2: Ghi dữ liệu trong biến mydata lên Channel ThingSpeak thông qua Field 1.
int mydata = random(0,100);
ThingSpeak.writeField(ChannelNumber, 1, mydata, WriteAPIKey);
Lưu ý: Trong trường hợp ghi nhiều dữ liệu lên nhiều Field thì hạn chế sử dụng
WriteSingleField
9
- WriteMultipleFields: Ghi nhiều dữ liệu lên nhiều Field cùng lúc sử dụng các hàm:
+ Đặt các Field cần lưu dữ liệu tương ứng:
ThingSpeak.setField(FieldNumber, Data);
Trong đó:
FieldNumber: Trường chứa dữ liệu
Nếu dữ liệu được ghi thành công lên Field thì hàm này sẽ trả về giá trị là 200.
Ví dụ 4.3: Ghi đồng thời dữ liệu đang được lưu trong 3 biến myData1, myData2 và
myData3 lên Channel trên ThingSpeak tương ứng Field 1, Field 2 và Field 3.
ThingSpeak.setField(1, myData1);
ThingSpeak.setField(2, myData2);
ThingSpeak.setField(3, myData3);
ThingSpeak.writeFields(ChannelNumber, WriteAPIKey);
Ví dụ 4.4: Xây dựng hệ thống IoT với NodeMCU và ThingSpeak thu thập giá trị biến
trở và giá trị ngẫu nhiên được tạo ra từ hàm random(). Sau đó ghi lên Field 1 và Field 2
trong Channel trên ThingSpeak.
Hình 4.12: Mô hình demo hệ thống IoT ghi dữ liệu từ NodeMCU lên ThingSpeak
10
Bước 1: Tạo tài khoản MathWorks và đăng nhập vào ThingSpeak
Truy cập vào link: https://thingspeak.com/
Chọn Create one! để tạo tài khoản MathWorks.
Sau khi tạo xong tài khoản MathWorks tiến hành đăng nhập vào ThingSpeak.
11
Hình 4.15: Cấu hình Channel
12
- Thông tin channel gồm: Channel ID, Author, Access
- Các chức năng trong channel: Private View, Public View, Channel Settings,
Sharing, API Keys, Data Import/Export.
Ở đây chúng ta cần lưu ý các thông số quan trọng: Channel ID, Write API Key,
Read API Key.
Sau đó trở về My Channels sẽ hiển thị Channel đã tạo. Chúng ta có thể thực hiện
các chức năng xem, chỉnh sửa, chia sẻ Channel.
13
Bước 3: Cài đặt thư viện ThingSpeak trên Arduino IDE
ThingSpeak hỗ trợ thư viện giao tiếp với các board mạch vi điều khiển thông dụng
như: Arduino, ESP32, ESP8266, …
Cài đặt thư viện ThingSpeak trên Arduino IDE:
Sketch -> Include Library -> Manage Libraries
Tìm tên thư viện ThingSpeak, sau đó nhấn Install để cài đặt.
Hình 4.19: Cài đặt thư viện ThingSpeak trên Arduino IDE
14
Trong đó:
+ MySSID: tên WiFi
+ MyPassword: mật khẩu WiFi
+ SECRET_CH_ID: nhập vào channel ID
+ SECRET_WRITE_APIKEY: nhập vào Write API Key
- Viết code điều khiển cho IoT node trong file: WriteMultipleFields.ino để thu thập
dữ liệu và truyền dữ liệu lên máy chủ ThingSpeak.
#include <ESP8266WiFi.h>
#include "secrets.h"
#include "ThingSpeak.h"
void setup() {
Serial.begin(115200); // Initialize serial
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo native USB port only
}
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client); // Initialize ThingSpeak
}
void loop() {
// Connect or reconnect to WiFi
if(WiFi.status() != WL_CONNECTED){
Serial.print("Attempting to connect to SSID: ");
Serial.println(SECRET_SSID);
while(WiFi.status() != WL_CONNECTED){
WiFi.begin(ssid, pass); // Connect to WPA/WPA2 network. Change this line if using
open or WEP network
Serial.print(".");
delay(5000);
}
Serial.println("\nConnected.");
}
int potVal = analogRead(A0);
int randomVal = random(0,100);
ThingSpeak.setField(1, potVal);
ThingSpeak.setField(2, randomVal);
ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
15
Kết quả hiển thị giá trị của biến trở và giá trị của hàm random(0,100) lên hai đồ thị
(Chart) tương ứng như sau:
Hình 4.20: Hiển thị kết quả dữ liệu trên các Field Chart
+ Private Channel:
int data1 = ThingSpeak.readIntField(ChannelNumber, FieldNumber, ReadAPIKey);
float data2 = ThingSpeak.readFloatField(ChannelNumber, FieldNumber,
ReadAPIKey); long data3 = ThingSpeak.readLongField(ChannelNumber, FieldNumber,
ReadAPIKey);
Ghi chú: Để kiểm tra trạng thái của thao tác đọc dữ liệu đã thành công hay chưa,
thì chúng ta sử dụng hàm như sau:
16
int statusCode = 0;
statusCode = ThingSpeak.getLastReadStatus();
Nếu dữ liệu được đọc thành công từ Field thì hàm này sẽ trả về mã trạng thái là
200.
- ReadMultipleFields: Đọc tất cả dữ liệu hiện tại của các Field trên Channel và lưu dữ
liệu vào các biến theo kiểu dữ liệu tương ứng.
+ Publish Channel:
int statusCode = 0;
statusCode = ThingSpeak.readMultipleFields(ChannelNumber);
if(statusCode == 200)
{
int data1 = ThingSpeak.getFieldAsInt(FieldNumber);
float data2 = ThingSpeak.getFieldAsFloat(FieldNumber);
long data3 = ThingSpeak.getFieldAsLong(FieldNumber);
Serial.println("Data1 Value: " + String(data1));
Serial.println("Data2 Value: " + String(data2));
Serial.println("Data3 Value: " + String(data3));
}
else{
Serial.println("Error code: " + String(statusCode));
}
+ Private Channel:
int statusCode = 0;
statusCode = ThingSpeak.readMultipleFields(ChannelNumber, ReadAPIKey);
if(statusCode == 200)
{
int data1 = ThingSpeak.getFieldAsInt(FieldNumber);
float data2 = ThingSpeak.getFieldAsFloat(FieldNumber);
long data3 = ThingSpeak.getFieldAsLong(FieldNumber);
Serial.println("Data1 Value: " + String(data1));
Serial.println("Data2 Value: " + String(data2));
Serial.println("Data3 Value: " + String(data3));
}
else{
Serial.println("Error code: " + String(statusCode));
}
17
Lưu ý: Thiết lập cấu hình trong file secrets.h
#define SECRET_SSID "MySSID" // replace MySSID with your WiFi network name
#define SECRET_PASS "MyPassword" // replace MyPassword with your WiFi password
#define SECRET_CH_ID ?????? // replace ?????? with your channel number
#define SECRET_READ_APIKEY "?????" // replace ????? with your channel read API Key
Trong đó:
+ MySSID: tên WiFi
+ MyPassword: mật khẩu WiFi
+ SECRET_CH_ID: nhập vào channel ID
+ SECRET_READ_APIKEY: nhập vào Read API Key
Ví dụ 4.5: Đọc dữ liệu trong Field 1 và Field 2 từ Channel (Private Channel) đã tạo ở
ví dụ 4.4. Sau đó hiển thị giá trị đọc được lên Serial Monitor.
Bước 1: Thiết lập cấu hình trong file secrets.h
#define SECRET_SSID "MySSID" // replace MySSID with your WiFi network name
#define SECRET_PASS "MyPassword" // replace MyPassword with your WiFi password
#define SECRET_CH_ID ?????? // replace ?????? with your channel number
#define SECRET_READ_APIKEY "?????" // replace ????? with your channel read API Key
int statusCode = 0;
void setup() {
Serial.begin(115200); // Initialize serial
while (!Serial) {
; // wait for serial port to connect.
}
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client); // Initialize ThingSpeak
18
// Connect or reconnect to WiFi
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(SECRET_SSID);
while (WiFi.status() != WL_CONNECTED) {
WiFi.begin(ssid, pass); // Connect to WPA/WPA2 network.
Serial.print(".");
delay(5000);
}
Serial.println("\nConnected");
}
}
void loop() {
int statusCode = 0;
statusCode = ThingSpeak.readMultipleFields(ChannelNumber, ReadAPIKey);
if (statusCode == 200)
{
int data1 = ThingSpeak.getFieldAsInt(1);
float data2 = ThingSpeak.getFieldAsFloat(2);
Serial.println();
delay(5000);
}
Ví dụ 4.6: Đọc giá trị độ ẩm và nhiệt độ tương ứng trong Field 3 và Field 4 ckênh
WeatherStation (Publish Channel). Sau đó hiển thị giá trị này lên Serial Monitor.
19
Hình 4.22: Giá trị độ ẩm và nhiệt độ kênh WeatherStation
Bước 2: Thiết lập cấu hình trong file secrets.h
#define SECRET_SSID "MySSID" // replace MySSID with your WiFi network name
#define SECRET_PASS "MyPassword" // replace MyPassword with your WiFi password
#define SECRET_CH_ID 12397 //Publish Channel - WeatherStation
int statusCode = 0;
void setup() {
Serial.begin(115200); // Initialize serial
while (!Serial) {
}
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client); // Initialize ThingSpeak
20
// Connect or reconnect to WiFi
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(SECRET_SSID);
while (WiFi.status() != WL_CONNECTED) {
WiFi.begin(ssid, pass); // Connect to WPA/WPA2 network. Change this line if using
open or WEP network
Serial.print(".");
delay(5000);
}
Serial.println("\nConnected");
}
}
void loop() {
int statusCode = 0;
statusCode = ThingSpeak.readMultipleFields(ChannelNumber);
if (statusCode == 200)
{
float humi = ThingSpeak.getFieldAsFloat(3);
float temp = ThingSpeak.getFieldAsFloat(4);
Serial.println("Humi Value: " + String(humi));
Serial.println("Temp Value: " + String(temp));
}
else {
Serial.println("Error code: " + String(statusCode));
}
Serial.println();
delay(5000);
}
21
Bước 2: Viết code đọc dữ liệu và in ra Serial Monitor
#include <ESP8266WiFi.h>
#include "secrets.h"
#include "ThingSpeak.h"
// Private channel
unsigned long priChannelNumber = SECRET_CH_ID_PRI;
const char * ReadAPIKey = SECRET_READ_APIKEY;
// Publish Channel
unsigned long pubChannelNumber = SECRET_CH_ID_PUB;
int statusCode = 0;
void setup() {
Serial.begin(115200); // Initialize serial
while (!Serial) {
;
}
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client); // Initialize ThingSpeak
void loop() {
int statusCode = 0;
//Private Channel
statusCode = ThingSpeak.readMultipleFields(priChannelNumber, ReadAPIKey);
if (statusCode == 200)
{
int data1 = ThingSpeak.getFieldAsInt(1);
float data2 = ThingSpeak.getFieldAsFloat(2);
Serial.println("Data1 Value: " + String(data1));
Serial.println("Data2 Value: " + String(data2));
}
else {
Serial.println("Error code: " + String(statusCode));
}
Serial.println();
delay(5000);
22
//Publish Channel
statusCode = ThingSpeak.readMultipleFields(pubChannelNumber);
if (statusCode == 200)
{
float humi = ThingSpeak.getFieldAsFloat(3);
float temp = ThingSpeak.getFieldAsFloat(4);
Serial.println("Humi Value: " + String(humi));
Serial.println("Temp Value: " + String(temp));
}
else {
Serial.println("Error code: " + String(statusCode));
}
Serial.println();
delay(5000);
}
23
Ví dụ 4.8: Cấu hình Gauge hiển thị giá trị của biến trở (POT)
Ví dụ 4.9: Cấu hình Lamp để bật đèn cảnh báo khi giá trị của biến trở vượt quá 500.
Trường hợp giá trị của biến trở nhỏ hơn 500:
24
Trường hợp giá trị của biến trở lớn hơn hoặc bằng 500:
25
Trong đó có các trường dùng để phân tích dữ liệu trên Field Chart:
- Results (kết quả): Sampling time (the number of data point shown on the chart)
- Average (tính giá trị trung bình): Lấy trung bình trong các khoảng thời gian: 10, 15,
20, 30, 60, 240, 720, 1440, "hàng ngày". Lưu ý: Giá trị NaN được hiểu là 0 khi tính giá
trị trung bình.
- Median (tính giá trị trung vị): Lấy trung vị của các giá trị hợp lệ trong khoảng thời
gian: 10, 15, 20, 30, 60, 240, 720, 1440, "hàng ngày".
- Sum (tính tổng): (Optional) Tính tổng giá trị trong khoảng thời gian: 10, 15, 20, 30,
60, 240, 720, 1440, "hàng ngày".
4.7 Phân tích và trực quan hoá dữ liệu bằng MATLAB trên ThingSpeak
Trên ThingSpeak, từ dữ liệu đã thu thập chúng ta có thể phân tích và trực quan hoá
dữ liệu bằng MATLAB.
Chọn Apps -> MATLAB Visualizations -> Chọn New
26
Sử dụng code mẫu MATLAB trên ThingSpeak để trực quan hoá dữ liệu:
Chọn Examples: Sample code to visualize data
-> Use a histogram to understand variation in data
27
Từ code mẫu này chúng ta cần điều chỉnh lại code MATLAB để trực quan hoá dữ
liệu mong muốn. Trong đó cầu cấu hình các thông số chính xác với trường dữ liệu và
kênh đã tạo. Code mẫu như sau:
% Channel ID to read data from
readChannelID = ???;
% Temperature Field ID
TemperatureFieldID = ??;
readAPIKey = '?????';
tempF = thingSpeakRead(readChannelID,'Fields',TemperatureFieldID,...
'NumMinutes',10*60, 'ReadKey',readAPIKey);
histogram(tempF);
xlabel('Temperature (F)');
ylabel('Number of Measurements\newline for Each Temperature');
title('Histogram of Temperature Variation');
Sau đó chọn Save an Run. Hiển thị kết quả trên MATLAB Plot Output.
28
Chọn kênh để hiển thị kết quả:
29