/*
功能:讀取環境溫溼度,如達警戒值,傳訊至LINE通知管理員
*/
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include "DHTesp.h" // 使用 DHT sensor library for ESPx 函式庫
//請修改以下參數--------------------------------------------
/*
// WiFi 帳號密碼
char SSID[] = "YourSSID"; // WiFi 帳號
char PASSWORD[] = "YourPassword"; // WiFi 密碼
String Linetoken = "Your Line Token"; // Line Notify 權杖
int pinDHT11 = 32; // DHT22腳位 // 32、33、34、35為佳
*/
// WiFi 帳號密碼
char SSID[] = "YourSSID"; // WiFi 帳號
char PASSWORD[] = "YourPassword"; // WiFi 密碼
String Linetoken = "eZ6eUXpndFLBE4Yv1IBOuiWbWu4yLRT9W0hTHhGMKeC";
const int DHT_PIN = 32;
//---------------------------------------------------------
DHTesp dhtSensor; // DHT22物件
WiFiClientSecure client; // 網路連線物件
char host[] = "notify-api.line.me"; // LINE Notify API網址
void setup() {
Serial.begin(115200);
//連線到指定的WiFi SSID
Serial.print("Connecting Wifi: ");
Serial.println(SSID);
//WiFi.begin(SSID, PASSWORD); // 以STA(網路終端)模式連接到WiFi基地台
WiFi.begin("Wokwi-GUEST", "", 6); // wokwi提供的虛擬 WiFi 接入點
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);
client.setInsecure();
// DHT22 初始化
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
}
void loop() {
// 讀取溫度和濕度資料
TempAndHumidity data = dhtSensor.getTempAndHumidity();
// 判斷是否有正確讀取
if(dhtSensor.getStatus() != 0){
Serial.println("DHT sensor error status: " + String(dhtSensor.getStatusString())); // 回傳是 timeout 或是 checksum 錯誤
}else if (isnan(data.humidity) || isnan(data.temperature)){
Serial.println("Data is NaN!");
}else{
Serial.println("Temperature : " + String(data.temperature, 2) + " °C"); // 參考語法 String(val, decimalPlaces)
Serial.println("Humidity : " + String(data.humidity, 2) + " %");
Serial.println("------------------");
// 設定觸發LINE訊息條件為溫度超過30或濕度超過80
byte temperature = data.temperature;
byte humidity = data.humidity;
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);
// 連線到Line API網站
// 443 port:HTTPS的預設通訊埠
if (client.connect(host, 443)) {
// 訊息長度
int LEN = message.length();
//// 1. 傳遞網站(網站及網址)
String url = "/api/notify";
// 方法 POST
client.println("POST " + url + " HTTP/1.1");
// 網路主機 Host 網址
client.print("Host: "); client.println(host);
//// 2. 資料表頭
// *認證方式 Bearer權杖
client.print("Authorization: Bearer "); client.println(Linetoken);
// *內容格式 傳統表單格式
client.println("Content-Type: application/x-www-form-urlencoded");
//// 3. 資料內容
// *訊息長度
client.print("Content-Length: "); client.println( String((LEN + 8)) );
client.println();
// *訊息內容
client.print("message="); client.println(message);
client.println();
//等候回應
delay(2000);
String response = client.readString();
//顯示傳遞結果
Serial.println(response);
client.stop(); //斷線,否則只能傳5次
}
else {
//傳送失敗
Serial.println("connected fail");
}
}
}
//每5秒讀取一次溫濕度
delay(5000);
}