2020年12月1日 星期二

二、 Dweet.io雲端網站IOT資料上傳實習— 使用DHT11測量遠端環境溫/濕度

 




在介紹過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腳上。



以下是本實習的完整範例程式列表

  1. // Libraries

  2. #include <ESP8266WiFi.h>

  3. #include "DHT.h"

  4.  

  5. #define DHTPIN  2

  6. #define DHTTYPE DHT11

  7. DHT dht(DHTPIN,DHTTYPE);

  8.  

  9. // WiFi parameters

  10. const char* ssid = "yourSSID"; // 換成你的WiFi SSID名稱

  11. const char* password = "yourPassword"; // 換成你的WiFi 密碼

  12.  

  13. // Host

  14. const char* host = "dweet.io";

  15. String DHT11Num="001";     // DHT11編號

  16. String  dweeting="";

  17.  

  18. void setup() {

  19.  

  20.   // Start Serial

  21.   Serial.begin(115200);

  22.   delay(10);

  23.  

  24.   // We start by connecting to a WiFi network

  25.   Serial.println();

  26.   Serial.println();

  27.   Serial.print("Connecting to ");

  28.   Serial.println(ssid);

  29.   WiFi.begin(ssid, password);

  30.   while (WiFi.status() != WL_CONNECTED) {

  31.     delay(500);

  32.     Serial.print(".");

  33.   }

  34.  

  35.   Serial.println("");

  36.   Serial.println("WiFi connected");

  37.   Serial.println("IP address: ");

  38.   Serial.println(WiFi.localIP());

  39.   dht.begin();

  40.  

  41. } // setup()結束

  42.  

  43. // 主迴圈 loop()開始 :

  44. void loop() 

  45. {

  46.  

  47.   // Reading temperature and humidity

  48.   float hum=dht.readHumidity();

  49.   float tem=dht.readTemperature();

  50.   Serial.println("DHT11測量結果為");

  51.   Serial.print("Humidity = ");

  52.   Serial.print(hum);

  53.   Serial.print("%\t");

  54.   Serial.print("Temperature = ");

  55.   Serial.print(tem);

  56.   Serial.println("*C");

  57.  

  58.   String  myThing="ESP_DHT11?DHT11Num="+DHT11Num+"&humidity="+

  59. String(hum)+"&temperature="+String(tem);//  Serial.println(myThing);

  60.   dweeting="GET /dweet/for/"+myThing+

  61. " HTTP/1.1\r\nHost: dweet.io\r\nConnection: close\r\n\r\n";

  62.   // Use WiFiClient class to create TCP connections

  63.   WiFiClient client;

  64.   const int httpPort = 80;

  65.   Serial.print("開始連接到 : ");

  66.   Serial.print(host);

  67.   Serial.println(".......");

  68.   Serial.println();

  69.   if (!client.connect(host, httpPort)) {

  70.     Serial.println("connection failed");

  71.     return;

  72.   }

  73.   client.print(dweeting);

  74.   delay(10);

  75.   String payLoad="";

  76.   Serial.println();

  77.   Serial.println("[dweet.io Response:]");

  78.     while (client.connected())

  79.     {

  80.       if (client.available())

  81.       {

  82.         String line = client.readStringUntil('\n');

  83.         payLoad+=line;

  84.         Serial.println(line);

  85.       }

  86.     }

  87.   Serial.println();

  88.     Serial.println("[dweet.io Response End!]");

  89.     client.stop();

  90.     Serial.println("\n[Disconnected]");

  91.     Serial.println();


  92.     payLoad=payLoad.substring(payLoad.indexOf(":{")+1,payLoad.indexOf("}")+1);

  93.     Serial.print("你的Iot內容為 ==> ");    

  94.     Serial.println(payLoad);

  95.     Serial.println();

  96.  

  97.   // 每 5 秒重複發送一次

  98.   delay(5000);

  99. }

程式一開始除了引入兩個會用到的函式庫之外,還宣告了”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與67分別是本機的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


沒有留言:

張貼留言