#include "DHTesp.h"
#define LED_PIN 2
#define SW_PIN 4
#define LDR_PIN 34
#define DHT_PIN 14
// เกณฑ์ความเสี่ยง
#define TEMP_LIMIT 32.0
#define HUM_LIMIT 70.0
#define LIGHT_LIMIT 500 // ค่าน้อย = มืด (ปรับได้)
DHTesp dht;
SystemState state = MONITOR;
// ตัวแปรปุ่ม
bool lastBtn = HIGH;
unsigned long lastPressTime = 0;
int pressCount = 0;
// ตัวแปรกระพริบ LED
unsigned long lastBlink = 0;
bool ledState = LOW;
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
pinMode(SW_PIN, INPUT_PULLUP);
dht.setup(DHT_PIN, DHTesp::DHT22);
Serial.println("System Start -> MONITOR");
}
void loop() {
// อ่านเซนเซอร์
TempAndHumidity data = dht.getTempAndHumidity();
int lightValue = analogRead(LDR_PIN);
bool hot = data.temperature > TEMP_LIMIT;
bool humid = data.humidity > HUM_LIMIT;
bool dark = lightValue < LIGHT_LIMIT;
// ===== อ่านปุ่ม =====
bool btn = digitalRead(SW_PIN);
if (lastBtn == HIGH && btn == LOW) {
pressCount++;
lastPressTime = millis();
}
lastBtn = btn;
// ===== ตรวจสถานะ =====
switch (state) {
// ---------------- MONITOR ----------------
case MONITOR:
digitalWrite(LED_PIN, LOW);
Serial.printf("MONITOR -> T:%.1f H:%.1f Light:%d\n",
data.temperature, data.humidity, lightValue);
if (hot || humid || dark) {
state = ALERT;
Serial.println(">>> ALERT!");
}
break;
// ---------------- ALERT ----------------
case ALERT:
// LED กระพริบทุก 0.5 วิ
if (millis() - lastBlink >= 500) {
lastBlink = millis();
ledState = !ledState;
digitalWrite(LED_PIN, ledState);
}
Serial.print("ALERT! -> ");
if (hot) Serial.print("Hot ");
if (humid) Serial.print("Humid ");
if (dark) Serial.print("Dark ");
Serial.println();
// กด 1 ครั้ง → CONFIRMED
if (pressCount >= 1) {
pressCount = 0;
state = CONFIRMED;
Serial.println("CONFIRMED -> Manual Warning");
}
break;
// ---------------- CONFIRMED ----------------
case CONFIRMED:
digitalWrite(LED_PIN, HIGH);
// กด 2 ครั้งติดกัน → RESET
if (pressCount >= 2) {
pressCount = 0;
state = MONITOR;
Serial.println("RESET -> Monitoring Again");
}
break;
}
delay(1000); // หน่วงอ่านค่า
}