Arduino筆記(39):ESP8266發送DHT-11的溫濕度值到Line通知

上一篇 Arduino筆記(38):透過IFTTT發送DHT-11的溫濕度值到Line群組 發送訊息到 Line是透過 IFTTT 轉送,可是 Line Notify是可以透過他所提供的 API直接呼叫傳送訊息,本篇文章來實作如何透過 Line 的API 傳送溫濕度到 Line通知。

實作的過程中,連線 IFTTT 使用 http協定,是透過 ESP8266WiFi Library 中的 WiFiClient 函式,可以成功傳送訊息。可是要透過 Line Notify傳送訊息,使用 ESP8266WiFi Library 中的 WiFiClientSecure 函式建立 https 連線時,一直無法成功建立連線。我找了很多文件,還是無法成功建立 https 連線。

後來使用一個 Github 用戶 TridentTD 寫的 TridentTD_LineNotify 函式庫,傳送訊息通知變得非常簡單,只要一個指令就可傳送訊息。我原來用 ESP8266WiFi Library 要寫一長串指定變數的語法,非常麻煩。使用 TridentTD_LineNotify 函式庫,只要給 Line 申請的權杖(Token),就可以開始傳送訊息,更好的一點是可以支援傳送中文。

TridentTD_LineNotify 函式庫還可以用來發送圖片,但需先知道這張照片的 URL,指令如下:
LINE.notifyPicture("https://preview.ibb.co/j6G51n/capture25610417181915334.png");
有關線路連接,請參考:Arduino筆記(33):透過 ESP8266 無線網路讀取DHT-11的溫濕度

以下說明一下申請 Line Notify的步驟,以及我寫的傳送溫濕度訊息到 Line 通知的程式。

(1) 先到 Line官方網站,申請一個 Line帳號。有了 Line帳號後,進入 Line Notify 頁面,輸入帳號密碼登入後,可以看到以下畫面:

(2) 選擇 [個人頁面],按下[發行權杖]

(3) 輸入權杖名稱及選擇要通知的群組,按下發行


(4) 出現已發行的權杖,需先複製下來存放在筆記本或其他地方,離開頁面後,無法再看到此權杖。

[程式]

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <DHT.h>
#include <TridentTD_LineNotify.h>

#define DHTTYPE DHT11
#define DHTPIN  2

// 修改成上述寄到登入郵箱的 Token號碼
#define LINE_TOKEN "123456789012345678901234567890123456789012"

// 設定無線基地台SSID跟密碼
const char* ssid     = "MyHome";
const char* password = "12345678";

DHT dht(DHTPIN, DHTTYPE, 11);    // 11 works fine for ESP8266
 
float humidity, temp_f;   // 從 DHT-11 讀取的值

unsigned long previousMillis = 0;        // will store last temp was read
const long interval = 2000;              // interval at which to read sensor

// 用不到以下兩個變數
// const char* host = "notify-api.line.me";
// const int httpsPort = 443;
 
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;
    }
  }

  String tempe="溫度:"+String((int)(temp_f-32)*5/9)+"℃";   
  String humid="濕度:"+String((int)humidity)+"%";

  // 顯示 Line版本
  Serial.println(LINE.getVersion());
 
  LINE.setToken(LINE_TOKEN);

  // 先換行再顯示
  LINE.notify("\n" + tempe + " ;" + humid);
      
  // 每2分鐘發送一次
  delay(120000);
}

[執行結果]

[參考資料]

myarduino: www.myarduino.net
TridentTD Github: https://github.com/TridentTD/TridentTD_LineNotify

8 留言

  1. 您好,請問host = "notify-api.line.me"這段,是否沒有在程式碼中出現連接執行 ?

    回覆刪除
    回覆
    1. 是的,沒有用到,可以刪掉,稍後我將這行進行註解。
      我參考好幾個程式的寫法,其中一個是使用host參數進行連線。我後來找到的 TridentTD_LineNotify 這個函式庫用不到host這個變數,謝謝告知。

      刪除
  2. 解決的我的問題!!真感謝您!!

    回覆刪除
  3. WiFiClientSecure 函式建立 https 連線時,一直無法成功建立連線 --> 這個問題可以解決

    WiFiClientSecure client;

    client.setInsecure(); //加入最關鍵的一行,就OK

    回覆刪除
  4. 請問我上傳給ESP8266最後出現:esptool.FatalError: Failed to connect to ESP8266: Timed out waiting for packet header的訊息。謝謝!

    回覆刪除
    回覆
    1. https://itcgs.tcgs.tc.edu.tw/yute?cid=2255
      可以參考一下這個

      刪除
  5. 您好,我改了一下您的程式,結果一直出現exception 9,要等一段時間才正常,上網查好像是叫LoadStoreAlignment錯誤,請問該怎麼解決

    回覆刪除

張貼留言

較新的 較舊