有了 ESP8266-01的溫濕度模組,可以查詢溫濕度的方法有好幾種,其中一種是透過網頁檢視目前溫濕度,這個作法有點被動,需要知道溫度時,再以瀏覽器連線查詢。上一篇實作將溫濕度的偵測值,每兩分鐘就送給 Line 通知用戶,這種方式比較主動。除了 Line 以外,還可以將當時的溫濕度值送到 Email信箱,以下就來看看如何實作將感測值寄到我的 Gmail 信箱。相關ESP8266-01溫濕度模組線路的連接方式,請參考:Arduino筆記(33):透過 ESP8266 無線網路讀取DHT-11的溫濕度。
要寄送郵件,有兩個必要條件:
(1) 要有發送的郵件主機 (SMTP) 帳號密碼
(2) 傳送的帳號密碼需要以 Base64 加密
由於程式內要送出帳號跟密碼,需要以 Base64 的格式傳送,我們透過 Base64Encode 這個網站將 帳號跟密碼轉換成 Base64 的碼,寫在程式內。以下是 Base64Encode的首頁。可以分別輸入登入 SMTP 的帳號跟密碼,取得兩組編成 Base64的加密字串。例如帳號名稱是[myaccount] 編譯後的結果為 [bXlhY2NvdW50]。
我個人使用中華電信的信箱已經很長一段時間,以下的實作就用中華電信的郵件主機,寄送 DHT-11的溫濕度感測值到我的 Gmail 信箱,完整程式如下:
要寄送郵件,有兩個必要條件:
(1) 要有發送的郵件主機 (SMTP) 帳號密碼
要從ESP8266模塊發送電子郵件,您需要遵循SMTP協議。如果沒有其他可以寄信的郵箱,可以申請免費的 SMTP 寄信服務,例如:Sendpulse 、SMTP2GO或其他的 SMTP 服務 。
由於程式內要送出帳號跟密碼,需要以 Base64 的格式傳送,我們透過 Base64Encode 這個網站將 帳號跟密碼轉換成 Base64 的碼,寫在程式內。以下是 Base64Encode的首頁。可以分別輸入登入 SMTP 的帳號跟密碼,取得兩組編成 Base64的加密字串。例如帳號名稱是[myaccount] 編譯後的結果為 [bXlhY2NvdW50]。
我個人使用中華電信的信箱已經很長一段時間,以下的實作就用中華電信的郵件主機,寄送 DHT-11的溫濕度感測值到我的 Gmail 信箱,完整程式如下:
[程式]
#include <ESP8266WiFi.h> #include <WiFiClient.h> #include <DHT.h> #define DHTTYPE DHT11 #define DHTPIN 2 // 設定網路基地台SSID跟密碼 char ssid[] = "MyHome"; char password[] = "12345678"; char server[] = "xxx.hinet.net"; // The SMTP Server String tempe = ""; // 顯示溫度的字串 String humid = ""; // 顯示濕度的字串 DHT dht(DHTPIN, DHTTYPE, 11); float humidity, temp_f; // 從 DHT-11 讀取的值 // will store last temp was read unsigned long previousMillis = 0; // interval at which to read sensor const long interval = 2000; WiFiClient espClient; void setup() { Serial.begin(9600); delay(10); Serial.println(""); Serial.println(""); Serial.print("Connecting To: "); Serial.println(ssid); WiFi.begin(ssid, password); // 等待連線,並從 Console顯示 IP while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi Connected."); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } void loop() { // 量測間等待至少 2 秒 unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= interval) { // 將最後讀取感測值的時間紀錄下來 previousMillis = currentMillis; // 讀取溫度大約 250 微秒! humidity = dht.readHumidity(); // 讀取濕度(百分比) temp_f = dht.readTemperature(true); // 讀取溫度(華氏) // humidity = 53.5; // temp_f = 102.4; // 檢查兩個值是否為空值 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)+"%"; Serial.println(tempe); Serial.println(humid); sendEmail(tempe,humid); // 每三分鐘會發出一封郵件 delay(180000); } void sendEmail(String tempe, String humid) { // 使用 25 Port 連線 if (espClient.connect(server, 25) == 1) { Serial.println(F("connected")); } else { Serial.println(F("connection failed")); return; } if (!emailResp()) return; // 使用EHLO命令問候 SMTP服務器。 // 如果連接成功,會得到回應碼 250 Serial.println(F("Sending EHLO")); espClient.println("EHLO www.example.com"); if (!emailResp()) return; // 使用AUTH LOGIN 指令登入授權用戶。 // 如果連接成功,會得到回應碼 334 Serial.println(F("Sending auth login")); espClient.println("AUTH LOGIN"); if (!emailResp()) return; // 發送郵件登入 SMTP 主機的帳號, //需要用 BASE64編碼,需使用者自行修改 Serial.println(F("Sending User")); espClient.println("ABCD123456"); // if (!emailResp()) return; // 發送郵件登入 SMTP 主機的密碼, // 需要用 BASE64編碼,需使用者自行修改 Serial.println(F("Sending Password")); espClient.println("ABCD123456"); if (!emailResp()) return; // 寄件者郵箱名稱 Serial.println(F("Sending From")); espClient.println(F("MAIL From: xxx@ms4.hinet.net")); if (!emailResp()) return; // 收件者郵箱名稱 Serial.println(F("Sending To")); espClient.println(F("RCPT To: xxx@gmail.com")); if (!emailResp()) return; // 發送"DATA",然後發送電子郵件的內文 Serial.println(F("Sending DATA")); espClient.println(F("DATA")); if (!emailResp()) return; Serial.println(F("Sending email")); // 改成您的收件者郵箱名稱 espClient.println(F("To: xxx@gmail.com")); // 改成您的送件者郵箱名稱 espClient.println(F("From: xxx@ms4.hinet.net")); espClient.println(F("Subject: ESP8266 test e-mail\r\n")); espClient.println(F("This is a e-mail sent from ESP8266.\n")); espClient.println(tempe); espClient.println(humid); // espClient.println(F(".")); if (!emailResp()) return; //終止郵件並發送quit命令 Serial.println(F("Sending QUIT")); espClient.println(F("QUIT")); if (!emailResp()) return; espClient.stop(); Serial.println(F("disconnected")); } byte emailResp() { byte responseCode; byte readByte; int loopCount = 0; while (!espClient.available()) { delay(1); loopCount++; // 等待 20 秒,如果無法接收就停止 if (loopCount > 20000) { espClient.stop(); Serial.println(F("\r\nTimeout")); return 0; } } responseCode = espClient.peek(); while (espClient.available()) { readByte = espClient.read(); Serial.write(readByte); } if (responseCode >= '4') { // efail(); return 0; } return 1; }
hi 你好
回覆刪除有如此的應用我很有興趣 ,依你的程式碼 我可以發送email 到我的指定信箱可是不是每一封都成功,觀察中發現只有在 250 msr11 的時候才可以收到,想請教是那出了問題?
您好, 這應該是跟mail Server有關,也就是mail server要有SMTP的權限,通常是要帳號密碼才能透過這個帳號寄送。我曾遇到一種狀況是:如果是非中華電信的線路商連線(當時是台灣大哥大線路),無法直接打開Outlook寄信,必須回到中華電信的網頁上才可以寄信。您再看一下是否是因為mail server SMTP權限的問題而無法正常寄信。
刪除非常感謝您的分享。 您提到的用於在線base64解碼和編碼的工具很棒。 但是,這是另一個工具,您可以將其用作替代工具。 該工具是
回覆刪除url-decode.com/tool/base64-encode
這也使您可以訪問其他數量的Web實用程序。
謝謝分享...
刪除網誌管理員已經移除這則留言。
回覆刪除張貼留言