#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
#define DHTPIN 12 // ขา DHT22 ที่เชื่อมต่อ
#define DHTTYPE DHT22
#define RELAY_FAN 5
#define RELAY_MOTOR 6
#define RELAY_LAMP 7
DHT dht(DHTPIN, DHTTYPE);
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27, 20, 4); // ที่อยู่ I2C ของจอ LCD 2004
DateTime now;
void setup() {
lcd.init(); // เริ่มต้นจอ LCD
lcd.backlight(); // เปิดแสงพื้นหลังจอ LCD
dht.begin(); // เริ่มต้นเซนเซอร์ DHT22
rtc.begin(); // เริ่มต้น RTC DS1307
pinMode(RELAY_FAN, OUTPUT);
pinMode(RELAY_MOTOR, OUTPUT);
pinMode(RELAY_LAMP, OUTPUT);
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // ตั้งเวลา RTC ตามเวลาคอมพิวเตอร์
}
}
void loop() {
now = rtc.now(); // อ่านเวลาปัจจุบันจาก RTC
float humidity = dht.readHumidity(); // อ่านความชื้น
float temperature = dht.readTemperature(); // อ่านอุณหภูมิ
controlRelay(temperature, humidity); // ควบคุม Relay
displayLCD(temperature, humidity); // แสดงผลบนจอ LCD
delay(1000);
}
void controlRelay(float temp, float humid) {
// ควบคุม Relay 1 สำหรับ Fan
if (temp > 30.0) {
digitalWrite(RELAY_FAN, HIGH); // เปิด Fan
} else {
digitalWrite(RELAY_FAN, LOW); // ปิด Fan
}
// ควบคุม Relay 2 สำหรับ Motor
if (humid > 80.0) {
digitalWrite(RELAY_MOTOR, HIGH); // เปิด Motor
} else {
digitalWrite(RELAY_MOTOR, LOW); // ปิด Motor
}
// ควบคุม Relay 3 สำหรับ Lamp
if (now.hour() == 11 && now.minute() >= 45 && now.minute() < 55) {
digitalWrite(RELAY_LAMP, HIGH); // เปิด Lamp
} else {
digitalWrite(RELAY_LAMP, LOW); // ปิด Lamp
}
}
void displayLCD(float temp, float humid) {
lcd.clear();
// แสดง Date และ Time
lcd.setCursor(0, 0);
lcd.print(now.day(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.year(), DEC);
lcd.print(" ");
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
// ทำให้ cursor กระพริบแทนวินาที
lcd.setCursor(15, 0);
if (now.second() % 2 == 0) {
lcd.print(' ');
} else {
lcd.print(':');
}
// แสดงอุณหภูมิและความชื้น
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print(humid, 1);
lcd.print("% Temp: ");
lcd.print(temp, 1);
lcd.print((char)223); // สัญลักษณ์ °C
// แสดงสถานะ Fan และ Motor
lcd.setCursor(0, 2);
lcd.print("FAN: ");
lcd.print(digitalRead(RELAY_FAN) == HIGH ? "ON " : "OFF");
lcd.print(" MOTOR: ");
lcd.print(digitalRead(RELAY_MOTOR) == HIGH ? "ON " : "OFF");
// แสดงสถานะ Lamp
lcd.setCursor(0, 3);
lcd.print("LAMP: ");
lcd.print(digitalRead(RELAY_LAMP) == HIGH ? "ON " : "OFF");
}