#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
// กำหนด LCD 20x4 ที่ใช้ I2C address 0x27
LiquidCrystal_I2C lcd(0x27, 20, 4);
// สร้างวัตถุ RTC
RTC_DS1307 rtc;
// กำหนดขาและชนิดของ DHT22
#define DHTPIN 12
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// กำหนดขารีเลย์สำหรับควบคุมอุปกรณ์ต่าง ๆ
#define RELAY_LAMP 5
#define RELAY_PUMP 6
#define RELAY_FAN 7
void setup() {
// เริ่มการสื่อสารกับ I2C และ LCD
lcd.init();
lcd.backlight();
// ตั้งค่าขารีเลย์เป็น output
pinMode(RELAY_LAMP, OUTPUT);
pinMode(RELAY_PUMP, OUTPUT);
pinMode(RELAY_FAN, OUTPUT);
// ตั้งค่ารีเลย์ให้ปิดการทำงานในตอนเริ่มต้น
digitalWrite(RELAY_LAMP, LOW);
digitalWrite(RELAY_PUMP, LOW);
digitalWrite(RELAY_FAN, LOW);
// เริ่มต้น RTC
if (!rtc.begin()) {
lcd.print("Couldn't find RTC");
while (1);
}
// ตรวจสอบว่ามีการตั้งค่าเวลาหรือไม่
if (!rtc.isrunning()) {
lcd.print("RTC is NOT running!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // ตั้งค่าตามเวลาคอมพิวเตอร์
}
// เริ่มต้นเซ็นเซอร์ DHT
dht.begin();
}
void loop() {
// รับค่าเวลาจาก RTC
DateTime now = rtc.now();
// รับค่าอุณหภูมิและความชื้นจาก DHT22
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// เปลี่ยนค่า temperature และ humidity จาก float เป็น int
int tempInt = (int)round(temperature);
int humInt = (int)round(humidity);
// เคลียร์จอ LCD ก่อนแสดงผล
//lcd.clear();
// แสดงเวลาบนบรรทัดที่ 1
lcd.setCursor(0, 0);
lcd.print("Time: ");
lcd.print(now.hour());
lcd.print(":");
lcd.print(now.minute());
lcd.print(":");
lcd.print(now.second());
// แสดงอุณหภูมิและความชื้นในรูปแบบ int บนบรรทัดที่ 2
lcd.setCursor(0, 1);
lcd.print("T: ");
lcd.print(tempInt);
lcd.print("C H: ");
lcd.print(humInt);
lcd.print("%");
// ควบคุมการทำงานของ Fan ตามอุณหภูมิ
if (tempInt > 30) {
digitalWrite(RELAY_FAN, HIGH); // เปิด Fan
} else {
digitalWrite(RELAY_FAN, LOW); // ปิด Fan
}
// ควบคุมการทำงานของ Pump ตามความชื้น
if (humInt < 80) {
digitalWrite(RELAY_PUMP, HIGH); // เปิด Pump
} else {
digitalWrite(RELAY_PUMP, LOW); // ปิด Pump
}
// แสดงสถานะของ Fan และ Pump บรรทัดที่ 3
lcd.setCursor(0, 2);
lcd.print("Fan: ");
if (digitalRead(RELAY_FAN) == HIGH) {
lcd.print("ON ");
} else {
lcd.print("OFF ");
}
lcd.print("Pump: ");
if (digitalRead(RELAY_PUMP) == HIGH) {
lcd.print("ON");
} else {
lcd.print("OFF");
}
// ควบคุม Lamp เปิดเวลา 18:40 และปิดเวลา 18:41
if (now.hour() == 18 && now.minute() == 40) {
digitalWrite(RELAY_LAMP, HIGH); // เปิด Lamp
} else if (now.hour() == 18 && now.minute() == 41) {
digitalWrite(RELAY_LAMP, LOW); // ปิด Lamp
}
// แสดงสถานะของ Lamp บรรทัดที่ 4
lcd.setCursor(0, 3);
lcd.print("Lamp: ");
if (digitalRead(RELAY_LAMP) == HIGH) {
lcd.print("ON");
} else {
lcd.print("OFF");
}
// หน่วงเวลา 2 วินาที (ให้ DHT22 อ่านค่าใหม่)
delay(2000);
}