作者:尤濬哲
前一章(上傳資料到ThingSpeak 製作雲端監看圖表)我們學習到如何將資料傳輸到雲端做紀錄,也可以隨時觀看數據,不過假設環境發生異常時,例如溫度過高或有害氣體濃度過高,卻還是要自己去網站上看才知道,如果可以在異常時主動通知我們,那不就更好了。
因此本章將介紹如何讓ESP32成為一個小幫手,能幫我們監看環境的溫濕度,並在發生異常時發LINE訊息通知我們,讓我們能立即處理異常,避免災害擴大。
開啟LINE Notify服務
平常我們都會用LINE傳訊息,不僅免費還有很多可愛貼圖,三五好友還可以組成群組,讓分散在各地的親朋好友聊天打鬧,真的很方便。不過ESP32是要如何透過LINE來傳訊息呢?ESP32又沒有手指是要如何打字呢?
LINE有提供一個官方的工具,可以讓我們透過該工具傳遞訊息,不過傳遞之前必須先取得傳訊對象的密碼,密碼也稱為權杖,當網站收到這些密碼及訊息後,就會將訊息轉送到指定的LINE群組。也就是說,ESP32並不是直接把訊息傳到某個人手機的LINE裡面,而是透過LINE官方工具協助中間轉傳訊息。
通常這類的網站就通稱為API(Application Programming Interface),使用這些API工具我們就可以省去學習LINE APP內複雜的通訊協定、機制、格式、架構…等等,只需要把資料傳給API,API就會處理所有的通訊過程,讓我們省下很多程式開發的時間。
整理上面的內容,也就是說首先我們利用ESP32及DHT11監看現場的溫濕度(也可以再加上有害氣體偵測MQ2、水位感測…等),當發現異常時(例如溫度>40或濕度>85)就發送到LINE的API網站,LINE API收到我們的訊息之後,就會轉傳到指定的LINE群組中,讓相關的管理人員收到訊息,然後立即處理。
要完成以上的任務,本節分成四個步驟:
1. 申請LINE Notify權杖
2. 手冊測試LINE Notify
3. ESP32+DHT11接線
4. 程式設計
1. 申請LINE Notify權杖
首先我們先到LINE Notify的網站申請開通服務,首先在瀏覽器中輸入網址:https://notify-bot.line.me/,並點選右上角的登入。
輸入自己的LINE帳號密碼後,按下方的登入。
完成登入,點選右上角的登入帳號/個人頁面,即可進入「已連動服務」管理頁面。
在頁面下方,點選發行權杖按鈕,權杖原意為通行碼,可視為與特定LINE群組通訊的密碼,若無此密碼,我們的LINE可能每天都會收到一堆廣告訊息。
在設定權杖頁面分別輸入:
a.名稱:未來發訊訊息通知時,會出現的名稱
b.對象:要發送訊息的群組,此處練習時先選擇「透過1對1聊天接收LINE Notify通知」,也就是傳訊給自己,
另外這裡你會發現在清單中找不到你某個特定的朋友,而只能選「群組」來發送訊息,這是因為我們目前使用的LINE通知是免費的Notify功能,若您要通知特定的「人」則必須申請LINE Bot,這部份則較為複雜,本文先略過。
完成輸入後,按下方的發行即可獲得一組密碼,此即為權杖。
拿到權杖後,點選下方的複製按鈕將密碼複製起來,並貼在記事本上,避免遺失,若遺失也不用緊張,重新申請一次即可,不過就算申請的對象是同一個,每次的權杖密碼都是不相同的,但功能是一樣的,後面申請的也不會使之前申請的權杖失效。
確認申請完成,將會產生一個連動服務。
(2) 手動測試LINE Notify
完成申請權杖後,我們就先用手動測試剛剛申請的LINE Notify權杖是否正常,也順便了解LINE API的運作方式,如需要更詳細的LINE Notify API可參閱網址:https://notify-bot.line.me/doc/。
首先我們先到連線到知名的API測試網址API Tester:https://apitester.com/(或者安裝POSTMAN API測試軟體),並依照規定輸入LINE Notify的相關設定如下:
a.修改傳遞方式POST
b.輸入LINE Notify API網站:https://notify-api.line.me/api/notify
c.輸入傳遞的訊息內容:message=這是測試
d.點選「+」號,增加一個表頭Request Header,我們會將密碼放在表頭與LINE API做驗證:
- 輸入表頭名稱:Authorization
- 輸入認證內容:Bearer 權杖密碼,要注意的是Bearer與權杖密碼中間有一個空白。
完成設定後後,按下下方的藍色Test按鈕,即可在手機收到LINE傳來的訊息。
下圖中前面【】內的名稱就是一開始申請時的名稱(倉庫監看機器人),而後方的訊息「這是測試」則是在API tester網站輸入的內容。
經由上面的測試可以發現,用ESP32傳LINE的方式就是將資料傳遞到LINE的API網站https://notify-api.line.me/api/notify,並將訊息內容及權杖密碼以參數方式夾帶給網站,網站收到後就會將訊息傳遞給權杖所對應的使用者。
下一節我們使用ESP32自動傳LINE時,也是一樣要指定這些訊息,就可以資訊傳遞給相關的人員。
另外如果您選擇傳訊的對象是一個群組,那麼要多一個動作:邀請LINE Notify進入群組內,否則會出現一個錯誤訊息是:此帳號尚未被邀請至已連動的群組。
邀請LINE Notify機器人進入要傳遞的群組中。

(3) ESP32 DHT11線路佈置
本部份參考前篇內容:上傳資料到ThingSpeak 製作雲端監看圖表,完成線路佈置,並測試讀取成功後,再進行下一個步驟
(4) 程式撰寫
就如第二節所展示,這次我們的程式將使用wificlientsecure進行實做,wificlientsecure跟上一章的httpclient不同的地方在於wificlientsecure可以支援https加密協定,而httpclient只能用HTTP GET協定做參數傳遞,wificlientsecure及wificlient可以用來做POST協定。
程式主要分成幾4個流程:
a.初始化設定:設定無線網路SSID, Password, LINE API網址, 權杖密碼等資訊
b.連線Wifi網路
c.在Loop中重複監看DHT11溫濕度資料
d.發現DHT11溫度或濕度過高,則利用wificlientsecure將資料POST到LINE網址
除了傳遞文字之外,也可以傳遞貼圖或照片喔,此外也可使用LINE Library的方式則更為簡單,使用者可自行Google 「Line-Notify-ESP32」就會有更多的資訊喔。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #include #include #include //請修改以下參數-------------------------------------------- char SSID[] = "You"; char PASSWORD[] = "0933932774"; String Linetoken = "WtDKBVVVFXag0ElRim8cOh9le7AnINWjctMe3R1xfvI"; int pinDHT11 = 14;//假設DHT11接在腳位GPIO14,麵包板左側序號8 //--------------------------------------------------------- SimpleDHT11 dht11(pinDHT11); WiFiClientSecure client; char host[] = "notify-api.line.me"; void setup() { Serial.begin(115200); //連線到指定的WiFi SSID Serial.print("Connecting Wifi: "); Serial.println(SSID); WiFi.begin(SSID, PASSWORD); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } //連線成功,顯示取得的IP Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); IPAddress ip = WiFi.localIP(); Serial.println(ip); } void loop() { //嘗試讀取溫濕度內容 byte temperature = 0; byte humidity = 0; int err = SimpleDHTErrSuccess; if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) { Serial.print("Read DHT11 failed, err="); Serial.println(err); delay(1000); return; } //讀取成功,將溫濕度顯示在序列視窗 Serial.print("Sample OK: "); Serial.print((int)temperature); Serial.print(" *C, "); Serial.print((int)humidity); Serial.println(" H"); //設定觸發LINE訊息條件為溫度超過30或濕度超過80 if ((int)temperature >= 30 || (int)humidity >= 80) { //傳遞Line訊息 String message = "檢測環境發生異常,請協助儘速派人查看處理,目前環境狀態:"; message += "\n溫度=" + String(((int)temperature)) + " *C"; message += "\n濕度=" + String(((int)humidity)) + " H"; Serial.println(message); if (client.connect(host, 443)) { int LEN = message.length(); //組成POST訊息 String url = "/api/notify"; client.println("POST " + url + " HTTP/1.1"); client.print("Host: "); client.println(host); //client.println("Connection: close"); //權杖 client.print("Authorization: Bearer "); client.println(Linetoken); client.println("Content-Type: application/x-www-form-urlencoded"); client.print("Content-Length: "); client.println( String((LEN + 8)) ); client.println(); //訊息內容 client.print("message="); client.println(message); client.println(); delay(500); String response = client.readString(); //顯示送出結果(200表示成功) Serial.println(response); } else { //傳送失敗 Serial.println("connected fail"); } } //每5秒讀取一次溫濕度 delay(5000); } |
(作者為本刊共筆作者,原文連結,其專欄文章同步發表於作者部落格;責任編輯:謝涵如)
- 舊瓶裝新酒還是新瓶裝舊酒?Jetson Orin Super效能實測 - 2025/03/12
- 低成本空氣品質感測器 – 夏普 GP2Y10開箱實驗 - 2023/03/16
- 【ESP32專欄】ESP32 MQTT與深度睡眠 - 2022/06/20
訂閱MakerPRO知識充電報
與40000位開發者一同掌握科技創新的技術資訊!