You are on page 1of 29

Chương 4: NỀN TẢNG IOT - IOT PLATFORM

4.1 Giới thiệu nền tảng IoT


Nền tảng Internet of Things (IoT Platform) là một dạng phần mềm trung gian, kết
nối giữa các thiết bị IoT và các ứng dụng từ đó tạo hệ thống kết nối IoT. IoT platform
có nhiệm vụ thu thập và trao đổi dữ liệu qua các giao thức, cấu trúc mạng liên kết khác
nhau. Quản lý, điều khiển các thiết bị từ xa, cập nhật các chương trình qua mạng. IoT
platform tích hợp hầu hết trên các thiết bị có thể kết nối internet và hòa hợp với ứng
dụng của bên thứ ba. Sự độc lập của IoT platform cho phép quản lý bất kỳ loại thiết bị
được kết nối nào qua một mạng duy nhất. IoT platform hiện đại có nhiều tính năng có
giá trị cho cả lớp phần cứng và phần mềm. Nó cung cấp giao diện người dùng, phân
tích, xử lý dữ liệu dựa trên cơ sở điện toán đám mây. Trên nền tảng IoT, chúng ta có
thể thu thập dữ liệu từ xa, chia sẻ dữ liệu, xử lý dữ liệu, giám sát và quản lý tất cả các
thiết bị được kết nối internet từ một hệ thống duy nhất.

Hình 4.1: Nền tảng IoT

Có 4 loại nền tảng IoT phổ biến gồm:


- Nền tảng dịch vụ đám mây cho IoT (Cloud service): Nền tảng này thực hiện các
chức năng như: vận chuyển, lưu trữ, phân ích và hiển thị dữ liệu. Đồng thời quản lý
phần mềm, phần cứng và bảo mật. Nền tảng đám mây cho IoT có khả năng tối ưu hóa
tính phức tạp của quá trình thiết lập một giải pháp IoT.
- Nền tảng kết nối IoT: Khả năng kết nối là một trong những nhân tố quan trọng
trong hệ thống IoT. Thông qua đó, các thiết bị IoT có thể liên kết với nền tảng đám
mây hoặc những kho lưu trữ khác. Nền tảng kết nối IoT có vai trò đảm bảo tính kết nối

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

4.2 Nền tảng Thingspeak


ThingSpeak là nền tảng IoT mã nguồn mở với khả năng phân tích dữ liệu và trực
quan hóa dữ liệu bằng công cụ MATLAB. ThingSpeak cho phép thu thập dữ liệu, lưu
trữ dữ liệu, tổng hợp dữ liệu, trực quan hóa và phân tích các luồng dữ liệu trực tiếp trên
đám mây.

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.

Hình 4.4: Nền tảng ThingSpeak

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)

Hình 4.5: Hệ thống IoT dựa trên nền tảng ThingSpeak

Ví dụ 4.1: Hệ thống IoT giám sát nhiệt độ và độ ẩm của mô trường. Trong hệ


thống này IoT node (gồm board mạch điều khiển và cảm biến) được kết nối nói vào
nền tảng Thinkspeak thông qua các API REST. IoT node sẽ thu thập dữ liệu của cảm
biến nhiệt độ và độ ẩm, sau đó truyền dữ liệu này lên đám mây để hiển thị trực quan
trên Thingspeak.

4.3 Các chức năng trên ThingSpeak


 Kênh dữ liệu - Channel
ThingSpeak là nền tảng IoT sử dụng các kênh (Channel) để lưu trữ dữ liệu được
gửi từ ứng dụng hoặc thiết bị. Với phần cài đặt kênh được mô tả trong cấu hình kênh,
cần tạo một kênh, sau đó gửi và truy xuất dữ liệu đến và đi từ kênh. Có thể đặt kênh
của mình ở chế độ công khai để chia sẻ dữ liệu. Bằng cách sử dụng các lệnh gọi API

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.

Hình 4.6: Kênh dữ liệu ThingSpeak

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.

Hình 4.7: Các Field trong Channel

 Ứng dụng trên ThingSpeak - Apps


Kênh ThingSpeak lưu trữ dữ liệu, tải dữ liệu lên từ web hoặc gửi dữ liệu từ thiết bị
tới kênh ThingSpeak. Sử dụng các ứng dụng Apps để chuyển đổi và trực quan hóa dữ
liệu hoặc kích hoạt một hành động.

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.

Hình 4.10: Các ứng dụng Actions

- Sử dụng API MQTT để cập nhật các kênh ThingSpeak

https://www.mathworks.com/help/thingspeak/mqtt-basics.html

4.4 Thu thập dữ liệu IoT với NodeMCU và ThingSpeak


Chức năng chính trong một hệ thống IoT đó là việc thu thập dữ liệu từ các cảm
biến môi trường và lưu trữ lên nền tảng máy chủ đám mây (Cloud Server). Trong mô
hình hệ thống IoT ở đây, chúng ta sử dụng board mạch NodeMCU ESP8266 để thu
thập dữ liệu từ cảm biến (IoT sensor/IoT node) và truyền dữ liệu lên nền tảng
ThingSpeak.

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

FieldNumber: Trường chứa dữ liệu

Data: Dữ liệu cần ghi vô Field

WriteAPIKey: Khoá ghi API

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

Data: Dữ liệu cần ghi vô Field

+ Ghi các dữ liệu lên các Field đã đặt.


ThingSpeak.writeFields(ChannelNumber, WriteAPIKey);
Trong đó:
ChannelNumber: Channel ID

WriteAPIKey: Khoá ghi API

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.

Hình 4.13: Giao diện web tạo tài khoản MathWorks

Bước 2: Tạo Channel


Chọn Channels -> My Channels -> New Channel

Hình 4.14: Giao diện web tạo mới Channel

Nhập vào các trường như sau:


- Name: nhập tên cho channel
- Description: thông tin mô tả channel
- Field: trường chứa dữ liệu, ở đây chúng ta sử dụng 2 Field.

11
Hình 4.15: Cấu hình Channel

Sau đó chọn Save Channel

Hình 4.16: Thông tin Channel đã tạo

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.

Hình 4.17: Các khoá đọc ghi dữ liệu - API Keys

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.

Hình 4.18: Chỉnh sửa Channel đã tạo

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

Bước 4: Viết code cho NodeMCU ESP8266


Sử dụng code mẫu WriteMultipleFields trong thư viện của ThinkSpeak.
File -> Examples -> ThingSpeak -> ESP8266 -> program board directly -> chọn
WriteMultipleFields
Trong code mẫu của ThingSpeak bao gồm 2 file như sau:
WriteMultipleFields.ino : lưu code mẫu điều khiển IoT node.
secrets.h : lưu các thông số cấu hình kết nối WiFi (SSID và PASS) và kết nối đến
channel của ThingSpeak (Channel ID và WRITE_APIKEY).

- 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_WRITE_APIKEY "?????????" // replace ????????? with your channel write API Key

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"

char ssid[] = SECRET_SSID; // your network SSID (name)


char pass[] = SECRET_PASS; // your network password
int keyIndex = 0; // your network key Index number (needed only for WEP)
WiFiClient client;

unsigned long myChannelNumber = SECRET_CH_ID;


const char * myWriteAPIKey = SECRET_WRITE_APIKEY;

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);

delay(15000); // Wait 15 seconds to update the channel again


}

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

4.4.2 NodeMCU nhận dữ liệu (hay đọc dữ liệu) từ ThingSpeak


NodeMCU đọc dữ liệu hiện tại từ các Field trong Channel trên ThingSpeak. Việc
đọc dữ liệu từ Channel công khai (Publish Channel) thì không yêu cầu khóa
ReadAPIKey. Trường hợp đọc dữ liệu từ Channel riêng tư (Private Channel) thì yêu
cầu khóa ReadAPIKey của Channel đó. Các hàm được sử dụng để đọc dữ liệu như sau:
- ReadField: Đọc dữ liệu hiện tại của từng Field trên Channel và lưu dữ liệu vào biến
theo kiểu dữ liệu tương ứng.
+ Publish Channel:
int data1 = ThingSpeak.readIntField(ChannelNumber, FieldNumber);
float data2 = ThingSpeak.readFloatField(ChannelNumber, FieldNumber);
long data3 = ThingSpeak.readLongField(ChannelNumber, FieldNumber);

+ 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

Bước 2: Viết code đọc dữ liệu và in ra Serial Monitor


#include <ESP8266WiFi.h>
#include "secrets.h"
#include "ThingSpeak.h"

char ssid[] = SECRET_SSID; // your network SSID (name)


char pass[] = SECRET_PASS; // your network password
int keyIndex = 0; // your network key Index number (needed only for WEP)
WiFiClient client;

unsigned long ChannelNumber = SECRET_CH_ID;


const char * ReadAPIKey = SECRET_READ_APIKEY;

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("Data1 Value: " + String(data1));


Serial.println("Data2 Value: " + String(data2));
}
else {
Serial.println("Error code: " + String(statusCode));
}

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.

Bước 1: Vào Channels -> Publish Channels -> Chọn WeatherStation

Hình 4.21: Chọn Publish Channel

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

Bước 3: Viết code đọc dữ liệu và in ra Serial Monitor


#include <ESP8266WiFi.h>
#include "secrets.h"
#include "ThingSpeak.h"

char ssid[] = SECRET_SSID; // your network SSID (name)


char pass[] = SECRET_PASS; // your network password
int keyIndex = 0; // your network key Index number
WiFiClient client;

unsigned long ChannelNumber = SECRET_CH_ID;

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);
}

 Đọc dữ liệu từ nhiều Channel khác nhau:


Chúng ta có thể đọc nhiều dữ liều từ nhiều kênh khác nhau bao gồm cả Private
Channel và Publish Channel.
Ví dụ 4.7: Đọc dữ liệu trong Field 1 và Field 2 từ Channel (Private Channel) đã tạo
ở ví dụ 4.4. Đồng thời đọc giá trị độ ẩm và nhiệt độ trong Field 3 và Field 4 của kênh
WeatherStation (Publish Channel). Sau đó hiển thị các giá trị này 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
//Private Channel
#define SECRET_CH_ID_PRI ?????
#define SECRET_READ_APIKEY "?????"

//Publish Channel - WeatherStation


#define SECRET_CH_ID_PUB ?????

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"

char ssid[] = SECRET_SSID; // your network SSID (name)


char pass[] = SECRET_PASS; // your network password
int keyIndex = 0; // your network key Index number
WiFiClient client;

// 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

// 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);
Serial.print(".");
delay(5000);
}
Serial.println("\nConnected");
}
}

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);
}

4.5 Các tiện ích hiển thị (Widgets)


Chọn Add Widgets -> chọn Widget mong muốn sử dụng.
Trong đó có các Widgets như:
+ Gauge: hiển thị dữ liệu dưới dạng đồng hồ
+ Numerric Display: hiển thị dữ liệu dưới dạng số
+ Lamp Indicator: đèn LED cảnh báo
+ Image Display: hiển thị hình ảnh.

Hình 4.23: Tiện ích hiển thị (Widgets)

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:

4.6 Phân tích dữ liệu trên Field Chart


Ví dụ 4.10: Phân tích dữ liệu của hàm random().

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

You might also like