#include <WiFi.h>
#include <EEPROM.h>
#include <HTTPClient.h>
#include "DHT.h"
#include <NTPClient.h>
#include <WiFiUdp.h>
//=======================================================================
//ตั้งค่าตัวแปล
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* token = "V785KvHsZ1s5dUjMeS64pJ4Hez9mhVOp7OyuvmJsJTD";
// ตั้งค่า NTP Client สำหรับการดึงเวลาจาก NTP Server
// กำหนด WiFiUDP Object
WiFiUDP ntpUDP;
// ตั้งค่า NTP Client พร้อมเขตเวลาไทย (UTC+7)
NTPClient timeClient(ntpUDP, "pool.ntp.org", 25200); // 7*3600 คือ +7 ชั่วโมง
#define DHTPIN 4 // Pin connected to DHT22
#define DHTTYPE DHT22 // DHT sensor type
// ค่าเริ่มต้น Wi-Fi
#define EEPROM_SIZE 64
#define SSID_ADDR 0
#define PASS_ADDR 32
DHT dht(DHTPIN, DHTTYPE);
// เวลาแจ้งเตือน
unsigned long previousMillisTemperature = 0;
unsigned long previousMillisHumidity = 0;
const long intervalTemperature = 1800000; // 30 นาที (milliseconds)
const long intervalHumidity = 1800000; // 30 นาที (milliseconds)
const long intervalNormal = 60000; // 1 นาที (milliseconds)
void setup() {
Serial.begin(115200);
// เริ่มต้น EEPROM และอ่านค่า WiFi จาก EEPROM
EEPROM.begin(EEPROM_SIZE);
// เชื่อมต่อ WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.printf("\nWiFi connected\nIP : ");
Serial.println(WiFi.localIP());
Serial.println("Connected to WiFi");
Serial.println(" READY ");
// เริ่มต้น DHT22
dht.begin();
// เริ่มต้น NTP Client
timeClient.begin();
}
void loop() {
// อัฟเดท NTP Client
timeClient.update();
String currentTime = timeClient.getFormattedTime();
Serial.print("Current time: ");
Serial.println(timeClient.getFormattedTime()); // แสดงผลเวลาปัจจุบัน
delay(5000);
serialport();
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin("https://notify-api.line.me/api/notify");
http.addHeader("Authorization", "Bearer " + String(token));
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
unsigned long currentMillis = millis();
// ตรวจสอบว่าค่าอ่านได้ถูกต้อง
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
return;
}else {
if (temperature < 26) {
if (currentMillis - previousMillisTemperature >= intervalNormal) {
http.POST("message=Temprature is Normal:" +String(temperature)+ " °C ❄️""Humidity is Normal" +String(humidity)+ " % 🌫");
previousMillisTemperature = currentMillis;
}
}
else if (temperature > 26) {
if (currentMillis - previousMillisTemperature >= intervalTemperature) {
http.POST("message=Temperature High "+String(temperature)+ " °C 🌡");
previousMillisTemperature = currentMillis;
}
}
if (humidity < 40) {
if (currentMillis - previousMillisHumidity >= intervalHumidity) {
http.POST("message=Humidity is Low" +String(humidity)+ " % 🌫");
previousMillisHumidity = currentMillis;
}
} else if (humidity > 100) {
if (currentMillis - previousMillisHumidity >= intervalHumidity) {
http.POST("message=Humidity is High" +String(humidity)+ " % 🌫");
previousMillisHumidity = currentMillis;
}
}
delay(2000); // รอ 2 วินาทีเพื่อไม่ให้อ่านค่าบ่อยเกินไป
int httpCode = http.POST("READY"); // Use an empty POST request to send only headers
if (httpCode > 0) {
String response = http.getString();
//Serial.print("HTTP Response code: ");
//Serial.println(httpCode);
//Serial.print("Server response: ");
// Serial.println(response);
} else {
Serial.println(".....");
}
}
http.end();
}
//delay(5000); // Send a message and read sensor data every 5 seconds
}
void serialport(){
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// ส่งค่าอุณหภูมิและความชื้นผ่าน Serial Port
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" *C");
// รอ 5 วินาที ก่อนอ่านค่าใหม่
delay(5000);
}
// บันทึกค่า 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;
}