#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include "DHT.h"
// กำหนด LCD I2C ที่ใช้ (address, column, row)
LiquidCrystal_I2C lcd(0x27, 20, 4);
// กำหนด RTC DS1307
RTC_DS1307 rtc;
// กำหนดขาของเซ็นเซอร์ DHT22 และชนิดของเซ็นเซอร์
#define DHTPIN 13
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
int ledPins[] = {15, 2, 4, 16, 17, 5, 18, 19}; // ขาที่ต่อ LED
int totalLeds = 8; // จำนวน LED
int pattern = 1; // เริ่มต้นที่ Pattern 1
// กำหนดขา relay สำหรับ fan, pump, lamp
#define FAN_RELAY_PIN 12
#define PUMP_RELAY_PIN 14
#define LAMP_RELAY_PIN 27
// กำหนดขาสำหรับปุ่ม
#define BUTTON_PIN 26
int buttonState = 0; // สถานะของปุ่ม
int lastButtonState = 0; // สถานะปุ่มครั้งก่อนหน้า
int displayMode = 0; // โหมดการแสดงผล
unsigned long lastDebounceTime = 0; // เวลาที่บันทึกสำหรับ debounce
unsigned long debounceDelay = 200; // หน่วงเวลา debounce 200 ms
void setup() {
lcd.init(); // เริ่มต้นการใช้งาน LCD
lcd.backlight(); // เปิด backlight
lcd.clear();
lcd.setCursor(0, 0); // ตั้ง cursor ที่บรรทัดแรก
lcd.print("Pattern:"); // พิมพ์ข้อความ "Pattern:"
dht.begin(); // เริ่มต้นการใช้งาน DHT22
if (!rtc.begin()) {
lcd.setCursor(0, 3);
lcd.print("Couldn't find RTC");
while (1);
}
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // ตั้งเวลาตามเวลาคอมพิวเตอร์
}
// ตั้งค่า LED pins เป็น OUTPUT
for (int i = 0; i < totalLeds; i++) {
pinMode(ledPins[i], OUTPUT);
}
// ตั้งค่า relay pins เป็น OUTPUT
pinMode(FAN_RELAY_PIN, OUTPUT);
pinMode(PUMP_RELAY_PIN, OUTPUT); // <-- แก้ไขตรงนี้
pinMode(LAMP_RELAY_PIN, OUTPUT);
// ตั้งค่า BUTTON pin เป็น INPUT_PULLUP (ใช้ internal pull-up resistor)
pinMode(BUTTON_PIN, INPUT_PULLUP);
// เริ่มต้นสถานะ relay ให้เป็น LOW (ปิด)
digitalWrite(FAN_RELAY_PIN, LOW);
digitalWrite(PUMP_RELAY_PIN, LOW);
digitalWrite(LAMP_RELAY_PIN, LOW);
}
void loop() {
// อ่านสถานะของปุ่ม (ใช้ INPUT_PULLUP, ดังนั้นปุ่มไม่กดจะเป็น HIGH, เมื่อกดจะเป็น LOW)
int reading = digitalRead(BUTTON_PIN);
// ตรวจสอบว่ามีการเปลี่ยนสถานะปุ่ม (debounce)
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
// ตรวจสอบว่าปุ่มถูกกด (จาก HIGH -> LOW)
if (reading == LOW && lastButtonState == HIGH) {
displayMode++;
if (displayMode > 2) {
displayMode = 0;
}
}
}
lastButtonState = reading; // อัปเดตสถานะปุ่มครั้งก่อนหน้า
DateTime now = rtc.now(); // อ่านเวลาจาก RTC
if (displayMode == 0) {
// แสดงข้อมูล Temperature, Humidity, Time
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
lcd.setCursor(0, 1);
lcd.print("Error reading DHT");
} else {
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print(" C");
lcd.setCursor(0, 2);
lcd.print("Hum: ");
lcd.print(humidity);
lcd.print(" %");
lcd.setCursor(0, 3);
lcd.print("Time: ");
if (now.hour() < 10) lcd.print('0');
lcd.print(now.hour());
lcd.print(':');
if (now.minute() < 10) lcd.print('0');
lcd.print(now.minute());
lcd.print(':');
if (now.second() < 10) lcd.print('0');
lcd.print(now.second());
}
} else if (displayMode == 1) {
// แสดงสถานะ Fan และ Temp ที่ควบคุม Fan
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Fan: ");
if (digitalRead(FAN_RELAY_PIN) == HIGH) {
lcd.print("ON");
} else {
lcd.print("OFF");
}
lcd.setCursor(0, 1);
lcd.print("Temp > 30C: Fan ON");
lcd.setCursor(0, 3);
lcd.print("Time: ");
if (now.hour() < 10) lcd.print('0');
lcd.print(now.hour());
lcd.print(':');
if (now.minute() < 10) lcd.print('0');
lcd.print(now.minute());
lcd.print(':');
if (now.second() < 10) lcd.print('0');
lcd.print(now.second());
}
// ควบคุม Fan
float temperature = dht.readTemperature();
if (temperature > 30) {
digitalWrite(FAN_RELAY_PIN, HIGH); // เปิด fan
} else {
digitalWrite(FAN_RELAY_PIN, LOW); // ปิด fan
}
delay(1000); // หน่วงเวลา 1 วินาที
}