#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
// กำหนดที่อยู่ของ LCD2004 I2C
LiquidCrystal_I2C lcd(0x27, 20, 4); // เปลี่ยนที่อยู่ I2C ถ้าไม่ตรง
// สร้างออบเจ็กต์ RTC DS1307
RTC_DS1307 rtc;
// กำหนดขาที่เชื่อมต่อ DHT22 และประเภทของเซนเซอร์
#define DHTPIN 10
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// กำหนดขารีเลย์สำหรับควบคุมพัดลม, ปั้มน้ำ และ LED
const int relayFan = 5; // พัดลม
const int relayPump = 6; // ปั้มน้ำ
const int relayLED = 7; // หลอดไฟ
void setup() {
// เริ่มต้นการสื่อสาร I2C
Wire.begin();
// เริ่มต้นการใช้งานจอ LCD
lcd.init();
lcd.backlight();
// เริ่มต้นการใช้งาน DHT22
dht.begin();
// เริ่มต้นการใช้งาน RTC
if (!rtc.begin()) {
lcd.setCursor(0, 0);
lcd.print("Couldn't find RTC");
while (1);
}
if (!rtc.isrunning()) {
lcd.setCursor(0, 0);
lcd.print("RTC is NOT running!");
// ตั้งเวลาให้ RTC (ตั้งเฉพาะครั้งแรกที่เชื่อมต่อ RTC เท่านั้น)
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// ตั้งค่าขารีเลย์เป็น OUTPUT
pinMode(relayFan, OUTPUT);
pinMode(relayPump, OUTPUT);
pinMode(relayLED, OUTPUT);
// ปิดรีเลย์ทั้งหมดเมื่อเริ่มต้น
digitalWrite(relayFan, LOW);
digitalWrite(relayPump, LOW);
digitalWrite(relayLED, LOW);
lcd.clear();
}
void displayTime(DateTime now) {
// แสดงข้อความ Time: ในบรรทัดแรก
lcd.setCursor(0, 0);
lcd.print("Time: ");
// แสดงเวลาในรูปแบบ HH:MM:SS
lcd.setCursor(6, 0);
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());
}
void displayTemperatureAndHumidity(int tempRounded, int humRounded) {
// แสดงข้อความ Temp: และ Hum: ในบรรทัดที่สอง (อยู่บรรทัดเดียวกัน)
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(tempRounded);
lcd.print("C ");
lcd.print("Hum: ");
lcd.print(humRounded);
lcd.print("%");
}
void displayStatus(int fanStatus, int pumpStatus, int lampStatus) {
// แสดงสถานะของพัดลมและปั้มน้ำในบรรทัดที่ 3
lcd.setCursor(0, 2);
lcd.print("Fan: ");
lcd.print(fanStatus ? "ON " : "OFF");
lcd.print(" Pump: ");
lcd.print(pumpStatus ? "ON " : "OFF");
// แสดงสถานะของหลอดไฟในบรรทัดที่ 4
lcd.setCursor(0, 3);
lcd.print("Lamp: ");
lcd.print(lampStatus ? "ON " : "OFF");
}
void loop() {
// รับค่าปัจจุบันจาก RTC
DateTime now = rtc.now();
// แสดงเวลา
displayTime(now);
// อ่านค่าอุณหภูมิและความชื้นจาก DHT22
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// แปลงค่าอุณหภูมิและความชื้นให้เป็นจำนวนเต็ม
int tempRounded = round(temperature);
int humRounded = round(humidity);
// แสดงอุณหภูมิและความชื้น
displayTemperatureAndHumidity(tempRounded, humRounded);
// ควบคุมพัดลม
int fanStatus = (tempRounded > 30) ? HIGH : LOW;
digitalWrite(relayFan, fanStatus);
// ควบคุมปั้มน้ำ
int pumpStatus = (humRounded > 80) ? LOW : HIGH;
digitalWrite(relayPump, pumpStatus);
// ควบคุมหลอดไฟ
int lampStatus = (now.hour() == 14 && now.minute() >= 52 && now.minute() < 55) ? HIGH : LOW;
digitalWrite(relayLED, lampStatus);
// แสดงสถานะของพัดลม, ปั้มน้ำ และหลอดไฟ
displayStatus(fanStatus, pumpStatus, lampStatus);
delay(1000); // หน่วงเวลา 1 วินาทีก่อนการอัพเดตครั้งถัดไป
}