#include <WiFi.h>
#include <HTTPClient.h>
#include <EEPROM.h>
#include "DHT.h"
#include "time.h"
#define DHTPIN 4 // Pin เชื่อมต่อ DHT22
#define DHTTYPE DHT22 // ใช้ DHT22
DHT dht(DHTPIN, DHTTYPE);
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 7 * 3600; // เวลาไทย +7 ชั่วโมง
const int daylightOffset_sec = 0;
// EEPROM addresses
#define EEPROM_SIZE 512
#define WIFI_SSID_ADDR 0
#define WIFI_PASS_ADDR 100
#define LINE_TOKEN_ADDR 200
String wifiSSID = "Wokwi-GUEST";
String wifiPassword = "";
String lineToken = "N8undfjQ1lhCDROVgH8flaMtJWjN8uOUYrsFnsMax60";
float temperature = 0;
float humidity = 0;
unsigned long previousTempNormalMillis = 0;
unsigned long previousTempHighMillis = 0;
unsigned long previousHumidityLowMillis = 0;
const unsigned long tempNormalInterval = 3600000; // 1 ชั่วโมง
const unsigned long tempHighInterval = 1800000; // 30 นาที
const unsigned long humidityLowInterval = 1800000; // 30 นาที
void setup() {
Serial.begin(115200);
dht.begin();
EEPROM.begin(EEPROM_SIZE);
// อ่านค่า WiFi SSID, password, และ LINE token จาก EEPROM
wifiSSID = readStringFromEEPROM(WIFI_SSID_ADDR);
wifiPassword = readStringFromEEPROM(WIFI_PASS_ADDR);
lineToken = readStringFromEEPROM(LINE_TOKEN_ADDR);
// เชื่อมต่อ WiFi
WiFi.begin(wifiSSID.c_str(), wifiPassword.c_str());
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// ตั้งค่าเวลา NTP
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
// แจ้งเตือนค่าอุณหภูมิและความชื้นครั้งแรก
sendLineNotify("เริ่มการเชื่อมต่อ อุณหภูมิ: " + String(temperature) + "C ความชื้น: " + String(humidity) + "%");
}
void loop() {
// อ่านค่าอุณหภูมิและความชื้น
temperature = dht.readTemperature();
humidity = dht.readHumidity();
// แสดงผลที่ Serial port ทุก 9 วินาที
Serial.println("Temp: " + String(temperature) + "C, Hum: " + String(humidity) + "%");
delay(9000);
unsigned long currentMillis = millis();
// ตรวจสอบและส่งแจ้งเตือนตามเงื่อนไข
if (temperature < 26 && currentMillis - previousTempNormalMillis >= tempNormalInterval) {
sendLineNotify("Temp is normal: " + String(temperature) + "C");
previousTempNormalMillis = currentMillis;
}
if (temperature > 26 && currentMillis - previousTempHighMillis >= tempHighInterval) {
sendLineNotify("Temp is High: " + String(temperature) + "C");
previousTempHighMillis = currentMillis;
}
if (humidity < 40 && currentMillis - previousHumidityLowMillis >= humidityLowInterval) {
sendLineNotify("Hum is low: " + String(humidity) + "%");
previousHumidityLowMillis = currentMillis;
}
}
// ฟังก์ชันแจ้งเตือนผ่าน LINE Notify
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) {
Serial.println("Line Notify sent: " + message);
} else {
Serial.println("Error sending Line Notify");
}
http.end();
} else {
Serial.println("WiFi not connected");
}
}
// ฟังก์ชันอ่าน string จาก EEPROM
String readStringFromEEPROM(int addrOffset) {
int len = EEPROM.read(addrOffset);
char data[len + 1];
for (int i = 0; i < len; i++) {
data[i] = EEPROM.read(addrOffset + 1 + i);
}
data[len] = '\0';
return String(data);
}
// ฟังก์ชันเขียน string ลง EEPROM
void writeStringToEEPROM(int addrOffset, const String &strToWrite) {
int len = strToWrite.length();
EEPROM.write(addrOffset, len);
for (int i = 0; i < len; i++) {
EEPROM.write(addrOffset + 1 + i, strToWrite[i]);
}
EEPROM.commit();
}