我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


繼前篇「MySQL資料庫存取」可以把溫濕度存放在自己的資料庫,這樣雖然非常好,可是考慮到不是每一個人都有辦法架設一台網路資料庫伺服器,所以我們來介紹一個目前物聯網最受歡迎的ThingSpeak資料庫,他是由大名鼎鼎的MATLAB公司所提供的免費空間,每一個註冊帳號可以免費取得4個頻道,頻道可以視為資料庫,每1個頻道可提供8個自訂欄位,最重要的是它提供非常直覺的圖表製作的功能,可以快速將資料轉換成圖表,且資料傳遞採用最簡單的http get,因此非常受到網友的推薦,算是網路入門的第一步。

除了儲存資料外,也有提供React及ThingHTTP,功能類似IFTTT可以進一步再串連其他服務,例如發現溫度過高就發送LINE通知,這都在本篇的文章中會介紹。

一、實驗目的

透過ESP32及DHT11取得環境溫濕度,將資料上傳至ThingSpeak並完成圖表設定,最後設定React,當溫度過高時,發送LINE通知給管理員,避免災害發生。

二、實驗過程

為了完成上述實驗,過程可分成以下幾個步驟,但有些屬於之前的課程就不再贅述,主要可分成以下幾個流程:
1.建立ThingSpeak帳號,並設定一個頻道
2.ESP32 透過DHT11取得溫濕度:
3.ESP32 WiFi連線及http get資料上傳:
4.圖表設定與頻道資料分享
5.設定LINE通知服務:
6.設定ThingSpeak React 及 ThingHTTP

三、實驗步驟

1.建立ThingSpeak帳號,並設定一個頻道

首先利用我們到ThingSpeak首頁: https://thingspeak.com/ ,ThingSpeak註冊過程比較特別,在建立帳號時並沒有密碼欄位,而是經過eMAIL確認後,才會要使用者輸入註冊欄位。這過程經常搞的大家摸不清頭緒,因此請大家依照以下流程進行註冊

1.1 註冊
進入ThingSpeak首頁後,點選右上角Sign Up功能,若您沒看到Sign Up,應該可能收到功能表內了。
image

接下來輸入個人資訊,請注意Mail一定要正確,其餘可隨意輸入。輸入完畢後,按Continue繼續下一步。
image

在這一步需要在Mail下方的check處點選打勾,代表要使用這個Mail做為個人帳號,完成後按Continue繼續下一步。
image

接下來這個畫面很重要,這是等候畫面,他在等你完成Mail確認,所以不要點選下一步,而是到你的信箱查看是否有註冊確認信。
image

查看Mail信箱是否有收到註冊確認信,若沒有,可能要去垃圾箱或垃圾郵件中找找,找到後,直接點選藍色的「Verify your email」按鈕即可完成Email確認。
image
image

看到Your profile was verified後,我們再回到等候畫面,點選Continue,就會出現密碼視窗。
image

在密碼視窗中輸入自己喜歡的密碼,但是必須符合密碼複雜性規則,並勾選下方的同意後,再點選Continue,即可完成註冊。
image

註冊完成視窗,點選OK後,會出現一個問卷,確認你不是做商業用途。
image
image

進入頻道設定畫面
image

1.2 頻道設定

在ThingSpeak中的頻道可視為資料庫,一個頻道有8個基礎欄位可用,這次我們要收集溫濕度共兩個欄位,若您需要收集更多資料,只須在後方打勾,並輸入該欄位的名稱即可。
image

下方的欄位可都先省略,例如Location可以手動標示感測地點的地圖,使用者可自行決定是否要輸入。地點的經緯度可從Google Map上查詢。
image

完成設定後,會立即出現圖表,不過目前還沒有任何資料,因此圖表都是空的。
image

1.3 手動傳輸測試

完成設定後,在使用ESP32傳輸之前,可以先手動傳值測試,以了解ThingSpeak是如何接收網路資料,我們點選頻道上方的「API Keys」的功能。
image

ThingSpeak已經很貼心的把資料上傳的方式寫好放在左側「API Requests」的「Write a Channel Feed」欄位內。
image

我們將欄位內資料的網址部份複製起來(前方的GET是說明方法,不要複製到),格式是
https://api.thingspeak.com/update?api_key=Z6H386FM.....&field1=0
其中api_key=Z6H386FM.....的亂碼是我們寫入該資料庫的密碼,避免閒雜人等亂更新我們的資料,這裡請使用您自己的API Key值,而field1則是要傳入資料庫的欄位,中間有「&」符號是作為欄位串接用途,每一個變數之間必須有&符號做區隔,因次上面的內容我們要修改兩個地方:
1.最前方的https改成http,主要是等等使用ESP32傳輸時用不加密的http會比較簡單。
2.最後方的參數「field1=0」代表"欄位1"的值為0,而我們之前建立頻道時有"欄位1"=溫度、"欄位2"=濕度,因此手動再增加一個欄位,將「field1=0」改為「field1=25&field2=65」,代表要傳入的測試值是「溫度=25、濕度=65」,因此整句變成
http://api.thingspeak.com/update?api_key=Z6H386FM.....&field1=25&field2=65

完成上面的網址修改後,在瀏覽器中開啟一個新頁籤,將上述的網址輸入到新頁籤中並按Enter執行,就會出現數字1,代表這是資料庫的第1筆,往後每次收到新的值就會+1,但若出現0則代表資料接收失敗,原因可能是傳輸太頻繁,使用免費帳號每次間隔須超過15秒
image

此時回到頻道圖表Private View的地方就會發現,已經有第一點進來了,若沒有資料,請自行使用重新整理(F5)。
image

若我們修改一下網址,將溫度改為30,濕度改為60,則網址變成:
http://api.thingspeak.com/update?api_key=Z6H386FMXXXXXXX&field1=30&field2=60
再送出網址一次,即可加上第二點,而連成一條線。讀者可自行增加多個點進行測試,查看傳入的狀況是否正常。
image

根據上面的測試,我們可以了解,更新ThingSpeak資料庫的方式就是瀏覽一個固定的網址,並將欄位值放在最後的field1=溫度值&field2=濕度值的方式即可,因此下一步就是讓ESP32讀取DHT11的數值後,補到網址後方後,再瀏覽網址即可更新資料庫內容。

2.ESP32 透過DHT11取得溫濕度

本部份請參考之前的內容:第九篇 ESP32 溫濕度顯示器(DHT11+1602 LCD)

3.ESP32 WiFi連線及http get資料上傳

ESP32 WiFi網路連線基礎的部份,之前已經有說明如何透過ESP32的 HttpClient連線並取得PM2.5的資料,本部份請先參考:第十篇 ESP32 WiFi網路連線(NTP校時與PM2.5顯示器)

本節則是修改一下程式的內容,先收取DHT11的溫濕度值,最後加入到網址中。程式原始檔如下


#include <WiFi.h>
#include <HTTPClient.h>
#include <SimpleDHT.h>
//請修改以下參數--------------------------------------------
char ssid[] = "SSID";
char password[] = "SSIDpassword";
//請修改為你自己的API Key,並將https改為http
String url = "http://api.thingspeak.com/update?api_key=換成你的APIKey";
int pinDHT11 = 14;//假設DHT11接在腳位GPIO14,麵包板左側序號8
//---------------------------------------------------------
SimpleDHT11 dht11(pinDHT11);//宣告SimpleDHT11物件

void setup()
{
  Serial.begin(115200);
  Serial.print("開始連線到無線網路SSID:");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(1000);
  }
  Serial.println("連線完成");
}

void loop()
{
  Serial.print("使用核心編號:");
  Serial.println(xPortGetCoreID());
  //嘗試讀取溫濕度內容
  byte temperature = 0;
  byte humidity = 0;
  int err = SimpleDHTErrSuccess;
  if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("溫度計讀取失敗,錯誤碼="); Serial.println(err); delay(1000);
    return;
  }
  //讀取成功,將溫濕度顯示在序列視窗
  Serial.print("溫度計讀取成功: ");
  Serial.print((int)temperature); Serial.print(" *C, ");
  Serial.print((int)humidity); Serial.println(" H");
  //開始傳送到thingspeak
  Serial.println("啟動網頁連線");
  HTTPClient http;
  //將溫度及濕度以http get參數方式補入網址後方
  String url1 = url + "&field1=" + (int)temperature + "&field2=" + (int)humidity;
  //http client取得網頁內容
  http.begin(url1);
  int httpCode = http.GET();
  if (httpCode == HTTP_CODE_OK)      {
    //讀取網頁內容到payload
    String payload = http.getString();
    //將內容顯示出來
    Serial.print("網頁內容=");
    Serial.println(payload);
  } else {
    //讀取失敗
    Serial.println("網路傳送失敗");
  }
  http.end();
  delay(20000);//休息20秒
}

網路若沒問題,應該會把資料不停的送到ThingSpeak內,而圖就會顯示歷次傳入的資料
image

4.圖表設定與頻道資料分享

4.1圖表格式設定

若讀者覺得圖表格式不符合需求,這時可以透過設定來變更,點選圖表右上方的筆的符號可以開啟設定視窗
image

設定視窗功能說明
 

  • Title:表頭
  • X(Y)-Axis:X(Y)軸名稱
  • Color:線顏色
  • Background:背景
  • Type:圖形樣式,有五種圖形可選,使用者可以選一個自己順眼的,筆者選擇spline曲線圖
  • Dynamic:自動更新
  • Days:顯示天數
  • Results:畫面能顯示幾個點
  • 顯示方式:以下擇一
        -Timescale:每n分鐘只算一點
        -Avreage:每n分鐘平均只算一點
        -Median:每n分鐘取中位數
        -Sum:每n分鐘取總和
  • Rounding:四捨五入到第幾位
  • Data Min-Max:只取範圍內,超過的值會被忽略,可以當作篩選的意思
  • Y-Axis Min-Max:Y軸顯示區域

image

image

4.2分享圖表

製作好的圖表目前僅能在ThingSpeak上看,每次要查閱都要登入,也可以透過iFrame方式分享到其他網站來做監測

首先點選上方的「Sharing」功能,然後點選下方的「Share channel view with everyone」完成開啟分享設定
image

雖然已經分享了,但是其他人要如何觀看教室內環境數值呢?兩個方式,一個是網頁,一個則是iFrame嵌入,iFrame需要讀者有自己公開的網站才有辦法嵌入,因此就不說明,而網頁很簡單,點選圖示右上方的第一各方塊圖示。即可另開視窗,本網址就是濕度的公開網址,任何人都可以瀏覽這個圖表查看最新資訊。
image

公開的網址URL
image

除了折線圖之外,也可加入其他種圖形,點選上方的「Add Widget」,跳出三種類型,我這次選擇第一個圓形Gauge計量表,然後Next確定。
image

輸入相關設定,即可完成新的圖表
image
image

5.設定LINE通知服務:

ThingSpeak也可以做Line通知,驚不驚喜、意不意外,設定上也非常簡單,首先我們必須先設定好Line權杖,本部份請參考:「第十三篇 ESP32 LINE通知:倉庫溫度異常機器人」,不再贅述。

6.設定ThingSpeak React 及 ThingHTTP

獲得LINE權杖後,我們必須在設定React及ThingHTTP,React是反應,當傳入的值觸發某一個條件時可以做一些反應,而ThingHTTP就是Webhook的意思,可以從ThingSpeak網站將資訊傳遞到其他網站,而我們知道Line通知也是一個網址而已,因此設定React就可以觸發ThingHTTP,ThingHTTP傳遞到LINE讓手機收到,這個過程並不需要寫程式。架構圖如下
image

我們先設定ThingHTTP,點選上方Apps/ThingHTTP
image

點選New ThingHTTP,然後完成設定。
image

相關欄位設定方式如下

  • URL:https://notify-api.line.me/api/notify
  • Method:POST
  • Content Type:application/x-www-form-urlencoded
  • Header的name=Authorization
  • Header的value=Bearer 你的Token
         Bearer與Token中間要記得插入一個英文空白
  • Body部份輸入
  • message=偵測目前行202溫度為“%%trigger%%”度,已超過設定,請協助儘快處理
         %%trigger%%代表將來會被Recat觸發的欄位值,稍後會設定,這裡就先這樣寫即可。

1.png

完成上述設定,點選下方的Save ThingHTTP存檔後,可以先做測試,利用存檔後右邊的Help有一個GET網址,可以測試這個Line通知是否正常。方法就是直接複製GET後方的網址,輸入在瀏覽器裡,即可看到手機接收到一個LINE通知,不過因為React尚未設定,因此收到訊息時「%%trigger%%」會直接顯示文字,而沒帶入變數。到時候React設定好,會將實際的溫度帶入。
image

將GET後方的網址輸入在新的瀏覽器內,ENTER執行後,若傳遞成功,會回覆Status:200,同時手機也會收到訊息。

image
LINE收到的訊息內容

React設定則更為簡單,一樣點選上方Apps/React,然後New React。
image

設定方式參考下表

  • Condition Type:選擇數值類Numeric
  • 監控頻率:每次新增的值都要監控
  • 監控頻道:即選擇哪一個資料庫做監控,選擇上面建好的頻道
  • 監控欄位:監控哪一個欄位,本處選擇欄位1:溫度
  • 比較方式:數值類比較大小,此處選擇「大於30度時」觸發,選is Greater than
  • 數值:輸入30
  • Action:反應方式輸入ThingHTTP,即條件達到時,要傳送一個ThinhHTTP亦即上面的LINE通知。
  • perform ThingHTTP:選擇剛剛建立好LINE通知的那個ThingHTTP
  • Options:觸發通知的頻率,兩個選擇分別是1.條件達成後,只發一次通知,或2.每次條件達成都發通知,此處為了測試,我們選擇2.每次條件達成都發通知

完成React設定,點選Save,即可開始監控溫度。
image

若溫度真超過30時,手機就會收到LINE通知了喔。若一直觸發,導致一直收到LINE通知,再將最後的Options改為1.條件達成後,只發一次通知,就不會那麼吵了。

image
image

arrow
arrow

    夜市 小霸王 發表在 痞客邦 留言(6) 人氣()