#include <WiFi.h>
#include <HTTPClient.h>
#include "DHT.h"
//#include <EEPROM.h>
// ข้อมูลเซ็นเซอร์ DHT22
#define DHTPIN 4 // ขาเชื่อมต่อเซ็นเซอร์ DHT22 (GPIO 4)
#define DHTTYPE DHT22 // ชนิดเซ็นเซอร์ DHT22
// ค่าเริ่มต้น Wi-Fi
//#define EEPROM_SIZE 64
//#define SSID_ADDR 0
//#define PASS_ADDR 32
DHT dht(DHTPIN, DHTTYPE);
// ข้อมูล Wi-Fi
const char* ssid = "Wokwi-GUEST"; // ชื่อ Wi-Fi ของคุณ
const char* password = ""; // รหัสผ่าน Wi-Fi ของคุณ
// Token ของ LINE Notify
String lineToken = "mdMZj9Mjn001fQgwjSv0BZhHsdGGsSqGlrqDmJ7eh2z";
// กำหนดค่าเกณฑ์อุณหภูมิและความชื้น
float tempThreshold = 26.0; // อุณหภูมิเกณฑ์ผิดปกติ
float humThreshold = 40.0; // ความชื้นเกณฑ์ผิดปกติ
bool tempAlertSent = false; // สถานะแจ้งเตือนอุณหภูมิ
bool humAlertSent = false; // สถานะแจ้งเตือนความชื้น
unsigned long lastReportTemp = 1; // ตัวแปรเก็บเวลาการส่งค่าทุก 1 ชั่วโมง
unsigned long lastReportHum = 1; // ตัวแปรเก็บเวลาการส่งค่าทุก 1 ชั่วโมง
const long reportInterval = 6000; // ระยะเวลาการส่งข้อมูลทุก 1 ชั่วโมง (3600000 ms)
void setup() {
Serial.begin(115200);
dht.begin();
configTime(7 * 3600, 0, "pool.ntp.org", "time.nist.gov"); // ตั้งค่าเวลาเป็นเขตเวลาไทย
// เริ่มต้น EEPROM และอ่านค่า WiFi จาก EEPROM
// EEPROM.begin(EEPROM_SIZE);
// เชื่อมต่อ Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
}
void loop() {
// อ่านค่าอุณหภูมิและความชื้น
float temp = dht.readTemperature();
float hum = dht.readHumidity();
// ตรวจสอบเวลาปัจจุบัน
const long currentTime = millis();
// ตรวจสอบว่าการอ่านค่าถูกต้อง
if (isnan(temp) || isnan(hum)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// ตรวจสอบการส่งรายงานทุก 1 ชั่วโมง
// if (currentTime; - lastReportTemp >= reportInterval) {
// sendLineNotify("Hourly Report:\nTemp: " + String(temp) + " °C ❄️");
// lastReportTemp = currentTime; // อัปเดตเวลาส่งรายงานล่าสุด
// }
if (currentTime; - lastReportHum >= reportInterval) {
sendLineNotify("Hourly Report:\nHumidity: " + String(hum) + " % 🌫");
lastReportHum = currentTime; // อัปเดตเวลาส่งรายงานล่าสุด
}
// แสดงผลที่ Serial Monitor
Serial.println("Temperature: " + String(temp) + "°C, Humidity: " + String(hum) + "%");
// ตรวจสอบว่าค่าอุณหภูมิผิดปกติหรือไม่ (อุณหภูมิ > 26°C)
if (temp > tempThreshold) {
if (!tempAlertSent) {
sendLineNotify("Alert: Temperature out of range!\nTemp: " + String(temp) + " °C 🌡");
tempAlertSent = true;
}
}
// ตรวจสอบว่าอุณหภูมิกลับมาปกติหรือไม่ (อุณหภูมิ < 26°C)
else if (temp < tempThreshold) {
if (tempAlertSent) {
sendLineNotify("Info: Temperature back to normal.\nTemp: " + String(temp) + " °C ❄️");
tempAlertSent = false;
}
}
// ตรวจสอบว่าความชื้นผิดปกติหรือไม่ (ความชื้น < 40%)
if (hum < humThreshold) {
if (!humAlertSent) {
sendLineNotify("Alert: Humidity out of range!\nHumidity: " + String(hum) + " % 🌫");
humAlertSent = true;
}
}
// ตรวจสอบว่าความชื้นกลับมาปกติหรือไม่ (ความชื้น > 40%)
else if (hum > humThreshold) {
if (humAlertSent) {
sendLineNotify("Info: Humidity back to normal.\nHumidity: " + String(hum) + " % 🌫");
humAlertSent = false;
}
}
delay(2000); // ตรวจสอบทุกๆ 2 วินาที
}
void sendLineNotify(String message) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin("https://notify-api.line.me/api/notify");
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
http.addHeader("Authorization", "Bearer " + lineToken);
String payload = "message=" + message;
int httpResponseCode = http.POST(payload);
if (httpResponseCode > 0) {
String response = http.getString();
Serial.println(httpResponseCode);
Serial.println(response);
} else {
Serial.println("Error on sending POST: " + String(httpResponseCode));
}
http.end();
} else {
Serial.println("WiFi Disconnected");
}
}
// บันทึกค่า WiFi ลงใน EEPROM
//void saveWiFiCredentials(const char* ssid, const char* password) {
// บันทึก SSID
//for (int i = 0; i < 32; i++) {
// EEPROM.write(SSID_ADDR + i, ssid[i]);
// }
// บันทึก Password
// for (int i = 0; i < 32; i++) {
// EEPROM.write(PASS_ADDR + i, password[i]);
// }
// EEPROM.commit();
//}
// อ่านค่า WiFi จาก EEPROM
//void readWiFiCredentials() {
//char ssidBuf[32];
//char passBuf[32];
//for (int i = 0; i < 32; i++) {
// ssidBuf[i] = EEPROM.read(SSID_ADDR + i);
// passBuf[i] = EEPROM.read(PASS_ADDR + i);
// }
// ssid = ssidBuf;
// password = passBuf;
//}