在介紹過Dweet.io這個雲端網站的內容與功能之後,接下來就先針對資料上傳部分做一個示範;在這個範例中將使用ESP8266這顆無線WiFi晶片,配上DHT11這塊溫/濕度感測器模組,將所量測到的環境溫/濕度上傳及暫存(因為免費使用只能保存24小時)到Dweet.io這個雲端網站上。
二•1 使用ESP8266及DHT11構成一環境溫/溼度
量測傳送系統
由於DHT11這塊溫/濕度感測器模組所使用的硬體介面接腳只有一根雙向的資料傳輸腳,在此是接到ESP8266的GPIO2,也就是ESP8266郵票貼片板上的LED指示腳;而對於一般常會使用的延伸開發板,如NodeMcu或WeMos D1/R2等,這隻GPIO2腳是標示為D4,下面的電路圖是這些延伸開發板與DHT11的接線圖:
如果想了解更多ESP8266與DHT11溫/濕度感測器模組一起使用的相關知識,可以先到下列網站去瀏覽一下:
http://musthtc100.blogspot.com/2020/09/6-4-dht1122.html
下面這種市面上常見的ESP-01+DHT11溫/濕度感測器模組也是可以直接適用本範例的程式,因為它上面的DHT11資料接腳也是接在ESP-01的GPIO2腳上。
以下是本實習的完整範例程式列表:
// Libraries
#include <ESP8266WiFi.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN,DHTTYPE);
// WiFi parameters
const char* ssid = "yourSSID"; // 換成你的WiFi SSID名稱
const char* password = "yourPassword"; // 換成你的WiFi 密碼
// Host
const char* host = "dweet.io";
String DHT11Num="001"; // DHT11編號
String dweeting="";
void setup() {
// Start Serial
Serial.begin(115200);
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
dht.begin();
} // setup()結束
// 主迴圈 loop()開始 :
void loop()
{
// Reading temperature and humidity
float hum=dht.readHumidity();
float tem=dht.readTemperature();
Serial.println("DHT11測量結果為");
Serial.print("Humidity = ");
Serial.print(hum);
Serial.print("%\t");
Serial.print("Temperature = ");
Serial.print(tem);
Serial.println("*C");
String myThing="ESP_DHT11?DHT11Num="+DHT11Num+"&humidity="+
String(hum)+"&temperature="+String(tem);// Serial.println(myThing);
dweeting="GET /dweet/for/"+myThing+
" HTTP/1.1\r\nHost: dweet.io\r\nConnection: close\r\n\r\n";
// Use WiFiClient class to create TCP connections
WiFiClient client;
const int httpPort = 80;
Serial.print("開始連接到 : ");
Serial.print(host);
Serial.println(".......");
Serial.println();
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
client.print(dweeting);
delay(10);
String payLoad="";
Serial.println();
Serial.println("[dweet.io Response:]");
while (client.connected())
{
if (client.available())
{
String line = client.readStringUntil('\n');
payLoad+=line;
Serial.println(line);
}
}
Serial.println();
Serial.println("[dweet.io Response End!]");
client.stop();
Serial.println("\n[Disconnected]");
Serial.println();
payLoad=payLoad.substring(payLoad.indexOf(":{")+1,payLoad.indexOf("}")+1);
Serial.print("你的Iot內容為 ==> ");
Serial.println(payLoad);
Serial.println();
// 每 5 秒重複發送一次
delay(5000);
}
程式一開始除了引入兩個會用到的函式庫之外,還宣告了”dht”這個類別為”DHT”的物件變數,這個物件是"DHT11",而且資料介面腳接在ESP8266的”GPIO2”腳上。
// Libraries
#include <ESP8266WiFi.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN,DHTTYPE);
接著是你要連線的WiFi分享器名稱與連線密碼:
const char* ssid = "yourSSID"; // 換成你的WiFi SSID名稱
const char* password = "yourPassword"; // 換成你的WiFi 密碼
再來就是我們要上傳的雲端網站名稱,及你想要給這塊DHT11感測的編號,如果你的系統會使用到多顆DHT11感測器的話,就必須給他們不同的編號以便區分。
const char* host = "dweet.io";
String DHT11Num="001"; // DHT11編號
在程式初始化(setup())部分主要在做兩件事,一是初始化WiFi並連線WiFi分享器(29~33行),二是初始化DHT11。
dht.begin();
在主迴圈程式區(loop())中,一開始就先測量並讀取DHT11所測試到的溫/濕度值,這兩種結果分別存放在變數”hum”(濕度)及”tem”(溫度)上,並且會顯示在Arduino IDE的序列監控視窗中,以作為我們偵錯之用。
float hum=dht.readHumidity();
float tem=dht.readTemperature();
Serial.println("DHT11測量結果為");
Serial.print("Humidity = ");
Serial.print(hum);
Serial.print("%\t");
Serial.print("Temperature = ");
Serial.print(tem);
Serial.println("*C");
在前一節的Dweet.io雲端網站介紹中已經說明過,當我們要上傳一個IoT物件到這個網站時,所使用的指令格式為:
https://dweet.io/dweet/for/my-thing-name?Iot1=v1&Iot2=v2&....
其中” https://dweet.io/dweet/for/ “代表要上傳資料,而” my-thing-name”則是這個IoT物件的名稱,至於”?”符號後面資料則是實際要傳送的內容,如果資料不只一筆,只要用”&”這個字元把他們連接在一起就可以了!
在本範例中所使用的IoT物件名稱為“ESP_DHT11”,而要傳送的資料內容共有三項分別是:
1. DHT11的編號:”DHT11Num=”
2. 測量到的濕度值:"humidity="
3. 測量到的溫度值:”temperature="
因此我們先把這個DHT11的編號及前面測量到的溫/濕度值(即”hum”與”tem”)帶入並合併成一個資料字串變數”myThing”後,再組合成真正可以由ESP8266送出的URL字串”dweeting”。
String myThing="ESP_DHT11?DHT11Num="+DHT11Num+"&humidity="+
String(hum)+"&temperature="+String(tem);// Serial.println(myThing);
dweeting="GET /dweet/for/"+myThing+
" HTTP/1.1\r\nHost: dweet.io\r\nConnection: close\r\n\r\n";
接著的63~73行程式先宣告一個客戶端的物件變數”client”,然後開始連線到”dweet.io”這個雲端網站。
WiFiClient client;
如果連線成功,便使用下列指令將我們的需求,也就是上傳跟DHT11測量結果有關的資料到”dweet.io”這個雲端網站上。
client.print(dweeting);
至於74~91行程式則是在接收”dweet.io”這個雲端網站回傳的訊息,並把這些內容顯示在Arduino IDE的監控視窗中,以供我們檢驗與偵錯之用。
而93~96行程式則是特別把接收到的回傳訊息中,跟我們原來傳送過去的IoT物件內容有關的部分擷取出來,並顯示在監控視窗中,好讓我們比對一下是否正確無誤﹖
payLoad=payLoad.substring(payLoad.indexOf(":{")+1,payLoad.indexOf("}")+1);
Serial.print("你的Iot內容為 ==> ");
Serial.println(payLoad);
Serial.println();
在主迴圈程式最後一行(99行)的延遲指令,決定我們的系統多久會上傳一次DHT11所測量到的結果到”dweet.io”這個雲端網站上,使用者可依自己的需要去更改;不過由於一般自然環境溫/濕度的變化都是很慢的,為了節省頻寬與網路傳輸資料的穩定性,建議時間間隔不要快於5秒
// 每 5 秒重複發送一次
delay(5000);
上圖是程式執行後在Arduino IDE的監控視窗中所看到的畫面,其中標記1是63~73行程式連線到”dweet.io”這個雲端網站的情形,而標記2與6、7分別是本機的DHT11測量到的結果,與上傳到”dweet.io”這個雲端網站後它的回應內容,及93~96行程式把接收到的回傳訊息中,跟我們原來傳送過去的IoT物件內容有關的部分擷取出來的結果。
至於標記3是成功連線到”dweet.io”雲端網站的提示訊息,而標記4的”succeeded”則是表示上傳成功,因此後面的訊息都是我們實際傳送到”dweet.io”這個雲端網站後的內容。
雖然說從我們的Arduino IDE的監控視窗中可以看到上傳的結果,但是在IoT物聯網的應用中,我們還是必須另外設計一些應用程式(APP),將這些已經上傳到雲端的資料依照我們的需求做一些特定的處理,才算大功告成!不過在這之前我們還是可以先利用現成的一些瀏覽器來下載這些資料看是否正確﹖我們只要在瀏覽器的網址列輸入下面的URL,就可以把這些已經上傳到”dweet.io”雲端網站的資料抓下來驗證及核對了!
http://dweet.io/get/latest/dweet/for/ESP_DHT11
下面的畫面是用Google Chrome去擷取”ESP_DHT11”這個IoT物件所得到的結果,在標記1的地方也就是瀏覽器的網址列所輸入的URL,即為上面所表列的下載指令。如果讀者想要跟著本範例試作,務必要記的另外為這個IoT物件取一個比較特殊且不容易跟別人相同的名稱,否則可能會看到意想不到的或是奇怪的結果!
二•2 設計一使用Google App. Inventor 開發之
Dweet.io雲端網站測試APP
沒有留言:
張貼留言