#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
#define buttonPin 26 // ขาที่ต่อปุ่มกด
int buttonState = 0; // สถานะของปุ่มกด
int lastButtonState = 0; // สถานะปุ่มครั้งก่อน
int displayMode = 1; // โหมดการแสดงผลบน LCD
// กำหนดขาของรีเลย์
#define FAN_PIN 12
#define PUMP_PIN 14
#define LAMP_PIN 27
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__))); // ตั้งเวลาตามเวลาคอมพิวเตอร์
}
for (int i = 0; i < totalLeds; i++) {
pinMode(ledPins[i], OUTPUT); // ตั้งค่าเป็นขา OUTPUT
}
// ตั้งค่ารีเลย์
pinMode(FAN_PIN, OUTPUT);
pinMode(PUMP_PIN, OUTPUT);
pinMode(LAMP_PIN, OUTPUT);
// ตั้งค่าปุ่มกด
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
DateTime now = rtc.now(); // อ่านเวลาจาก RTC
// อ่านสถานะปุ่มกด
buttonState = digitalRead(buttonPin);
// ตรวจสอบการกดปุ่ม
if (buttonState != lastButtonState) {
if (buttonState == LOW) {
displayMode++; // เปลี่ยนโหมดการแสดงผล
if (displayMode > 2) displayMode = 1; // มีเพียง 2 โหมด
}
delay(50); // หน่วงเพื่อป้องกันการกดปุ่มซ้ำ
}
lastButtonState = buttonState;
// แสดงข้อมูลบน LCD ตามโหมดที่เลือก
if (displayMode == 1) {
displayTempHumTime(now); // แสดงค่าอุณหภูมิ ความชื้น และเวลา
} else if (displayMode == 2) {
displayRelayStatus(); // แสดงสถานะของรีเลย์ (fan, pump, lamp)
}
// ตรวจสอบอุณหภูมิและความชื้นเพื่อควบคุมรีเลย์
controlRelays();
delay(1000); // หน่วงเวลา 1 วินาที
}
void displayTempHumTime(DateTime now) {
// แสดงเวลาบนบรรทัดที่ 4 ของ LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp/Hum/Time");
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());
// อ่านค่าอุณหภูมิและความชื้นจาก DHT22
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
lcd.setCursor(0, 1);
lcd.print("Error reading DHT");
} else {
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(" %");
}
}
void displayRelayStatus() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Status Fan/Pump/Lamp");
lcd.setCursor(0, 1);
lcd.print("Fan: ");
lcd.print(digitalRead(FAN_PIN) == HIGH ? "ON " : "OFF");
lcd.setCursor(0, 2);
lcd.print("Pump: ");
lcd.print(digitalRead(PUMP_PIN) == HIGH ? "ON " : "OFF");
lcd.setCursor(0, 3);
lcd.print("Lamp: ");
lcd.print(digitalRead(LAMP_PIN) == HIGH ? "ON " : "OFF");
}
void controlRelays() {
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// ควบคุมพัดลม
if (temperature > 30) {
digitalWrite(FAN_PIN, HIGH);
} else {
digitalWrite(FAN_PIN, LOW);
}
// ควบคุมปั๊มน้ำ
if (humidity < 80) {
digitalWrite(PUMP_PIN, HIGH);
} else {
digitalWrite(PUMP_PIN, LOW);
}
// ควบคุมหลอดไฟตามเวลา
DateTime now = rtc.now();
if (now.hour() == 17 && now.minute() == 17) {
digitalWrite(LAMP_PIN, HIGH);
} else if (now.hour() == 17 && now.minute() == 19) {
digitalWrite(LAMP_PIN, LOW);
}
}