Arduino筆記(38):透過IFTTT發送DHT-11的溫濕度值到Line群組

在 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,再接到溫濕度模組,進行訊息發送。

[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模組發出的訊息,也是程式執行的結果。

[參考資料]

3 留言

  1. 請問一下 最後幾行的String getStr_line是什麼呢?

    回覆刪除
    回覆
    1. getStr_line 是要傳送給 ifttt 的 API 格式字串,透過 webservice 將字串送給 ifttt 發送到 Line,詳細資料可參考:https://platform.ifttt.com/docs/api_reference#realtime-api

      刪除
  2. 請問DHT dht(DHTPIN, DHTTYPE, 11)第3個參數11代表甚麼?

    回覆刪除

張貼留言

較新的 較舊