#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
// กำหนดขนาดของจอ LCD
LiquidCrystal_I2C lcd(0x27, 20, 4); // เปลี่ยนที่อยู่ I2C เป็น 0x27 หรือ 0x3F ตามการตั้งค่าอุปกรณ์
RTC_DS1307 rtc; // สร้างอ็อบเจ็กต์ของ RTC
// กำหนดขาและชนิดของเซ็นเซอร์ DHT22
#define DHTPIN 12
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// กำหนดขารีเลย์
#define FAN_RELAY_PIN 7
#define PUMP_RELAY_PIN 6
#define LAMP_RELAY_PIN 5
void setup() {
// เริ่มต้นการทำงานของจอ LCD, RTC และ DHT22
lcd.init();
lcd.backlight();
if (!rtc.begin()) {
lcd.print("RTC failed!");
while (1); // ถ้าการเชื่อมต่อ RTC ไม่สำเร็จ หยุดการทำงาน
}
if (!rtc.isrunning()) {
lcd.setCursor(0, 1);
lcd.print("RTC is NOT running!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // ตั้งค่าเวลาปัจจุบันถ้า RTC ไม่ทำงาน
}
dht.begin(); // เริ่มต้นการทำงานของเซ็นเซอร์ DHT22
// ตั้งขารีเลย์เป็น output
pinMode(FAN_RELAY_PIN, OUTPUT);
pinMode(PUMP_RELAY_PIN, OUTPUT);
pinMode(LAMP_RELAY_PIN, OUTPUT);
// เริ่มต้นปิดรีเลย์ทั้งหมด
digitalWrite(FAN_RELAY_PIN, HIGH);
digitalWrite(PUMP_RELAY_PIN, HIGH);
digitalWrite(LAMP_RELAY_PIN, HIGH);
}
void loop() {
DateTime now = rtc.now(); // อ่านเวลาจาก RTC
// แสดงเวลาบนจอ LCD ในรูปแบบ HH:MM:SS
lcd.setCursor(0, 0); // ตำแหน่งแถว 0 คอลัมน์ 0
lcd.print("Time: ");
if (now.hour() < 10) lcd.print('0'); // เพิ่ม 0 ด้านหน้าเวลาถ้าต่ำกว่า 10
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 และแปลงเป็น int
int humidity = (int)dht.readHumidity();
int temperature = (int)dht.readTemperature();
// แสดงผลอุณหภูมิและความชื้นบนจอ LCD บรรทัดที่ 2
lcd.setCursor(0, 1); // ตำแหน่งแถว 1 คอลัมน์ 0
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print("C ");
lcd.print("Hum: ");
lcd.print(humidity);
lcd.print("%");
// ควบคุม Fan ตามอุณหภูมิ และแสดงสถานะ
lcd.setCursor(0, 2); // ตำแหน่งแถว 2 คอลัมน์ 0
if (temperature > 30) {
digitalWrite(FAN_RELAY_PIN, LOW); // เปิด Fan (รีเลย์แบบ Active LOW)
lcd.print("Fan: ON ");
} else {
digitalWrite(FAN_RELAY_PIN, HIGH); // ปิด Fan
lcd.print("Fan: OFF");
}
// ควบคุม Pump ตามความชื้น และแสดงสถานะ
if (humidity < 80) {
digitalWrite(PUMP_RELAY_PIN, LOW); // เปิด Pump
lcd.print(" Pump: ON ");
} else {
digitalWrite(PUMP_RELAY_PIN, HIGH); // ปิด Pump
lcd.print(" Pump: OFF");
}
// ควบคุม Lamp ตามเวลาที่กำหนด (18:40 - 18:42) และแสดงสถานะที่บรรทัดที่ 4
lcd.setCursor(0, 3); // ตำแหน่งแถว 3 คอลัมน์ 0
if ((now.hour() == 18 && now.minute() >= 40 && now.minute() < 42)) {
digitalWrite(LAMP_RELAY_PIN, LOW); // เปิด Lamp (Active LOW)
lcd.print("Lamp: ON ");
} else {
digitalWrite(LAMP_RELAY_PIN, HIGH); // ปิด Lamp
lcd.print("Lamp: OFF");
}
delay(1000); // หน่วงเวลา 1 วินาที
}