在 Arduino筆記(33):透過 ESP8266 無線網路讀取DHT-11的溫濕度 實作透過網頁呈現目前的溫濕度,如果上傳到 ThingSpeak 繪製溫度折線圖,可能是一個不錯的方式。我試著要將溫度的呈現,透過 Line 來通知我,這樣會更更即時一點,雖然 Line 現在已經支援 Notify 的功能,就可以直接透過 API 來發送訊息,本篇先介紹 IFTTT 這個網站,透過 IFTTT 跟 Line的整合,來達到通知的目的。
IFTTT,是一個新生的網絡服務平台,通過其他不同平台的條件來決定是否執行下一條命令。即對網絡服務通過其他網絡服務作出反應。IFTTT得名為其口號「if this then that」(維基百科)。
有關線路連接,請參考:Arduino筆記(33):透過 ESP8266 無線網路讀取DHT-11的溫濕度。
以下就利用先前已經接好的線路,重新上傳程式到 ESP-01S,再接到溫濕度模組,進行訊息發送。
(2) 註冊成為 IFTTT 會員,可使用 Google 或 Facebook 帳號登入。
(3) 在右方登入的帳號按一下,出現下拉選單,選擇 [New Applet]。
(4) 在 +this 區域(如下圖紅框處)按下滑鼠左鍵。
(5) 在搜尋框輸入 Webhook,執行搜尋,得到一個名為[Webhooks]的服務,按下方方塊圖[Webhooks]。
(6) 選擇要觸發的方式,只有一種透過 web request 的選項。
(7)輸入觸發 Trigger 的事件名稱(Event Name),這個名稱很重要,未來每次觸發都會用到這個名稱。
(8)回到以下畫面,繼續按 + that (如下圖紅框處)。
(9) 選擇執行回應的服務,請輸入 Line 後,點選下方左圖 Line。
(10)選擇回應的執行方式,只有一種 Send message可以選。
(11) 輸入傳送訊息的內容,要給哪個群組?可以使用變數,帶入不同值送出給 Line 的人員或群組,格式及變數調整完成後,按下 [Create action]。
(12) 按下 [Finish] 就結束設定
(13) 完成 Applet的建立,如要使用,需要取得一串英數字的 Key,也就是使用這個 Applet 的帳密,你可以在首頁處按下 [My Applet] → 點一下你的 Applet → 點擊左上方 Webhooks 字樣,出現以下視窗,在按右方 [Settings] (如下圖紅框處) 。
(14) 這個 Applet的 Key就是URL:https://maker.ifttt.com/use/ 後的文字。
如要測試看看是否能正常發送訊息的 Line,可以在瀏覽器輸入以下這行(Your_Key 要換成您申請的 Key,EventName要換成您申請的事件名稱)。
注意:你自行建立的 Event Name在 URL輸入時,要分大小寫。一開始沒注意大小寫,收不到訊息,重新檢查,更換成正確的大小寫後,就收到訊息了。
程式撰寫的過程中,透過 Serial.println()這個函式讓我知道字串的結果對不對,少去很多Debug的時間。原本想從程式直接傳送中文到URL GET,可是會出現亂碼,改成英文就沒問題了。
為了讓 Line的通知,不要一直出現 Value1:...等 3 個,我修改上列步驟 (11)的傳送內容,將三個「Value?:」都刪除,標題自參數傳入。執行的結果如以下畫面。
IFTTT,是一個新生的網絡服務平台,通過其他不同平台的條件來決定是否執行下一條命令。即對網絡服務通過其他網絡服務作出反應。IFTTT得名為其口號「if this then that」(維基百科)。
有關線路連接,請參考:Arduino筆記(33):透過 ESP8266 無線網路讀取DHT-11的溫濕度。
以下就利用先前已經接好的線路,重新上傳程式到 ESP-01S,再接到溫濕度模組,進行訊息發送。
[IFTTT設定步驟]
(1) 進入 IFTTT網站,網址:ifttt.com。(2) 註冊成為 IFTTT 會員,可使用 Google 或 Facebook 帳號登入。
(3) 在右方登入的帳號按一下,出現下拉選單,選擇 [New Applet]。
(4) 在 +this 區域(如下圖紅框處)按下滑鼠左鍵。
(5) 在搜尋框輸入 Webhook,執行搜尋,得到一個名為[Webhooks]的服務,按下方方塊圖[Webhooks]。
(6) 選擇要觸發的方式,只有一種透過 web request 的選項。
(7)輸入觸發 Trigger 的事件名稱(Event Name),這個名稱很重要,未來每次觸發都會用到這個名稱。
(8)回到以下畫面,繼續按 + that (如下圖紅框處)。
(9) 選擇執行回應的服務,請輸入 Line 後,點選下方左圖 Line。
(10)選擇回應的執行方式,只有一種 Send message可以選。
(11) 輸入傳送訊息的內容,要給哪個群組?可以使用變數,帶入不同值送出給 Line 的人員或群組,格式及變數調整完成後,按下 [Create action]。
(12) 按下 [Finish] 就結束設定
(13) 完成 Applet的建立,如要使用,需要取得一串英數字的 Key,也就是使用這個 Applet 的帳密,你可以在首頁處按下 [My Applet] → 點一下你的 Applet → 點擊左上方 Webhooks 字樣,出現以下視窗,在按右方 [Settings] (如下圖紅框處) 。
(14) 這個 Applet的 Key就是URL:https://maker.ifttt.com/use/ 後的文字。
如要測試看看是否能正常發送訊息的 Line,可以在瀏覽器輸入以下這行(Your_Key 要換成您申請的 Key,EventName要換成您申請的事件名稱)。
https://maker.ifttt.com/trigger/EventName/with/key/Your_Key?value1=V1&value2=V2
注意:你自行建立的 Event Name在 URL輸入時,要分大小寫。一開始沒注意大小寫,收不到訊息,重新檢查,更換成正確的大小寫後,就收到訊息了。
程式撰寫的過程中,透過 Serial.println()這個函式讓我知道字串的結果對不對,少去很多Debug的時間。原本想從程式直接傳送中文到URL GET,可是會出現亂碼,改成英文就沒問題了。
為了讓 Line的通知,不要一直出現 Value1:...等 3 個,我修改上列步驟 (11)的傳送內容,將三個「Value?:」都刪除,標題自參數傳入。執行的結果如以下畫面。
[程式]
#include <ESP8266WiFi.h> #include <WiFiClient.h> #include <DHT.h> #define DHTTYPE DHT11 #define DHTPIN 2 // 設定網路基地台SSID跟密碼 char ssid[] = "MySSID"; char pass[] = "12345678"; DHT dht(DHTPIN, DHTTYPE, 11); // 11 works fine for ESP8266 float humidity, temp_f; // 從 DHT-11 讀取的值 String tempe1=""; // 顯示溫度的字串 String humid1=""; // 顯示濕度的字串 unsigned long previousMillis = 0; // will store last temp was read const long interval = 2000; // interval at which to read sensor const char* host = "maker.ifttt.com"; const int httpPort = 80; void setup(void) { Serial.begin(9600); // 設定速率 感測器 dht.begin(); // 初始化 WiFi.mode(WIFI_STA); // 連接無線基地台 WiFi.begin(ssid, password); Serial.print("\n\r \n\rWorking to connect"); // 等待連線,並從 Console顯示 IP while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("DHT Weather Reading Server"); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } void loop(void) { // 量測間等待至少 2 秒 unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= interval) { // 將最後讀取感測值的時間紀錄下來 previousMillis = currentMillis; // 讀取溫度大約 250 微秒! humidity = dht.readHumidity(); // 讀取濕度(百分比) temp_f = dht.readTemperature(true); // 讀取溫度(華氏) // 檢查兩個值是否為空值 if (isnan(humidity) || isnan(temp_f)) { Serial.println("Failed to read from DHT sensor!"); return; } } // 除錯用 tempe1="Temperature:"+String((int)(temp_f-32)*5/9)+"oC"; humid1="Humidity:"+String((int)humidity)+"%"; Serial.println(tempe1); Serial.println(humid1); WiFiClient client; Serial.print("connecting to "); Serial.println(host); if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } // 以下 XXX-XXXX-XXX 要換成自己的 Key String getStr_line = "GET /trigger/Line_msg/with/key/XXX-XXXX-XXX?value1="+tempe1+"&value2="+humid1+" HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "User-Agent: BuildFailureDetectorESP32\r\n" + "Connection: close\r\n\r\n"; Serial.println(getStr_line); client.print(getStr_line); client.stop(); delay(120000); }
[執行結果]
左邊是直接透過瀏覽器的 URL直接傳送參數給 IFTTT,右邊是透過 DHT-11及 ESP-01S模組發出的訊息,也是程式執行的結果。[參考資料]
- Github IOT-MCU: ESP-01S-DHT11-v1.0
- ESP8266教學5-5:Ifttt初探-傳送LINE訊息
請問一下 最後幾行的String getStr_line是什麼呢?
回覆刪除getStr_line 是要傳送給 ifttt 的 API 格式字串,透過 webservice 將字串送給 ifttt 發送到 Line,詳細資料可參考:https://platform.ifttt.com/docs/api_reference#realtime-api
刪除請問DHT dht(DHTPIN, DHTTYPE, 11)第3個參數11代表甚麼?
回覆刪除張貼留言