#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <EEPROM.h>
#include <DHT.h> // ไลบรารีสำหรับเซนเซอร์ DHT
#define MQ135_PIN 36 // พินเซนเซอร์ MQ135 บน ESP32
#define BUZZER_PIN 19 // พินสำหรับ Buzzer
#define INTERRUPT_PIN 18 // พินสำหรับปุ่มรีเซ็ต
#define DHT_PIN 5 // พินสำหรับเซนเซอร์ DHT22
#define DHTTYPE DHT22 // ใช้ DHT22 (หรือ DHT11 ถ้าคุณใช้เซนเซอร์นั้น)
LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD I2C Address 0x27
RTC_DS3231 rtc;
DHT dht(DHT_PIN, DHTTYPE); // เริ่มต้นเซนเซอร์ DHT22
volatile bool resetAlert = false;
void setup() {
// เริ่มต้นใช้งาน LCD และ RTC
lcd.backlight();
if (!rtc.begin()) {
lcd.setCursor(0, 0);
lcd.print("RTC fail");
while (1);
}
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // ตั้งค่าเวลาปัจจุบัน
}
// เริ่มต้นการใช้งานเซนเซอร์ DHT22
dht.begin();
pinMode(BUZZER_PIN, OUTPUT);
pinMode(INTERRUPT_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), resetAlertISR, FALLING); // ตั้งค่าปุ่มกด
lcd.setCursor(0, 0);
lcd.print("Air Quality Monitor");
delay(2000);
lcd.clear();
}
void loop() {
// อ่านค่าจากเซนเซอร์ MQ135
int airQualityValue = analogRead(MQ135_PIN);
// แปลงค่าคุณภาพอากาศเป็น ppm (ประมาณการ)
float ppm = airQualityValue / 10.0; // ค่า ppm แบบประมาณ
// อ่านค่าอุณหภูมิและความชื้นจาก DHT22
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// ตรวจสอบว่าเซนเซอร์ทำงานปกติหรือไม่
if (isnan(temperature) || isnan(humidity)) {
lcd.setCursor(0, 0);
lcd.print("DHT error");
delay(2000);
return;
}
// แสดงข้อมูลบน LCD
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print("C ");
lcd.setCursor(0, 1);
lcd.print("Air Q: ");
lcd.print(ppm);
lcd.print(" ppm");
// บันทึกข้อมูลคุณภาพอากาศและเวลาใน EEPROM ทุก ๆ 15 นาที
DateTime now = rtc.now();
static unsigned long lastLogTime = 0;
if (millis() - lastLogTime >= 900000) { // 900000 ms = 15 นาที
logAirQualityToEEPROM(ppm, now);
lastLogTime = millis();
}
// หากค่าคุณภาพอากาศเกิน 100 ppm ให้ส่งสัญญาณเตือน
if (ppm > 100) {
digitalWrite(BUZZER_PIN, HIGH);
lcd.setCursor(0, 1);
lcd.print("Air Quality BAD");
} else {
digitalWrite(BUZZER_PIN, LOW);
}
// หากปุ่มถูกกด (Interrupt) จะรีเซ็ตการเตือน
if (resetAlert) {
resetAlert = false;
digitalWrite(BUZZER_PIN, LOW);
lcd.setCursor(0, 1);
lcd.print("Alert Reset ");
}
delay(1000); // หน่วงเวลา 1 วินาที
}
// ISR สำหรับการรีเซ็ตการเตือนเมื่อปุ่มถูกกด
void resetAlertISR() {
resetAlert = true;
}
// ฟังก์ชันบันทึกคุณภาพอากาศลงใน EEPROM
void logAirQualityToEEPROM(float ppm, DateTime time) {
int address = 0;
EEPROM.put(address, ppm);
address += sizeof(float);
EEPROM.put(address, time);
address += sizeof(DateTime);
Serial.println("Data logged to EEPROM");
}