#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
// ตั้งค่าจอ LCD I2C ที่ address 0x27 และขนาด 20x4
LiquidCrystal_I2C lcd(0x27, 20, 4);
// สร้างวัตถุ RTC และ DHT
RTC_DS1307 rtc;
#define DHTPIN 12 // ขา DATA ของ DHT22 ต่อที่ขา 12
#define DHTTYPE DHT22 // ใช้เซ็นเซอร์ DHT22
DHT dht(DHTPIN, DHTTYPE);
// กำหนดพินสำหรับรีเลย์
#define RELAY_FAN 7
#define RELAY_PUMP 6
#define RELAY_LAMP 5
void setup() {
// เริ่มการทำงานของจอ LCD
lcd.init();
lcd.backlight();
// เริ่มการทำงานของ RTC
if (!rtc.begin()) {
lcd.setCursor(0, 0);
lcd.print("Couldn't find RTC");
while (1);
}
if (!rtc.isrunning()) {
lcd.setCursor(0, 1);
lcd.print("RTC is NOT running!");
}
// เริ่มการทำงานของ DHT22
dht.begin();
// ตั้งค่าพินของรีเลย์เป็น OUTPUT
pinMode(RELAY_FAN, OUTPUT);
pinMode(RELAY_PUMP, OUTPUT);
pinMode(RELAY_LAMP, OUTPUT);
// ปิดอุปกรณ์ทั้งหมดในตอนเริ่มต้น
digitalWrite(RELAY_FAN, LOW);
digitalWrite(RELAY_PUMP, LOW);
digitalWrite(RELAY_LAMP, LOW);
}
void loop() {
// ดึงข้อมูลเวลาปัจจุบันจาก RTC
DateTime now = rtc.now();
// แสดงเวลาบน LCD ในรูปแบบ HH:MM:SS บรรทัดที่ 1
lcd.setCursor(0, 0);
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 humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// ตรวจสอบหากการอ่านค่าไม่สำเร็จ
if (isnan(humidity) || isnan(temperature)) {
lcd.setCursor(0, 1);
lcd.print("Sensor error");
return;
}
// แปลงค่าจาก float เป็น int
int hum = (int) humidity;
int temp = (int) temperature;
// แสดงค่าอุณหภูมิและความชื้นบนบรรทัดที่ 2
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(temp); // แสดงค่าอุณหภูมิเป็นจำนวนเต็ม
lcd.print("C ");
lcd.print("Hum: ");
lcd.print(hum); // แสดงค่าความชื้นเป็นจำนวนเต็ม
lcd.print("%");
// ควบคุมพัดลมตามค่าอุณหภูมิ
bool fanStatus = false;
if (temp > 30) {
digitalWrite(RELAY_FAN, HIGH); // เปิดพัดลม
fanStatus = true;
} else {
digitalWrite(RELAY_FAN, LOW); // ปิดพัดลม
fanStatus = false;
}
// ควบคุมปั๊มน้ำตามค่าความชื้น
bool pumpStatus = false;
if (hum < 80) {
digitalWrite(RELAY_PUMP, HIGH); // เปิดปั๊มน้ำ
pumpStatus = true;
} else {
digitalWrite(RELAY_PUMP, LOW); // ปิดปั๊มน้ำ
pumpStatus = false;
}
// แสดงสถานะของพัดลมและปั๊มน้ำบนบรรทัดที่ 3
lcd.setCursor(0, 2);
lcd.print("Fan: ");
lcd.print(fanStatus ? "ON " : "OFF");
lcd.print(" Pump: ");
lcd.print(pumpStatus ? "ON " : "OFF");
// ควบคุมหลอดไฟตามเวลา
bool lampStatus = false;
if (now.hour() == 18 && now.minute() == 40) {
digitalWrite(RELAY_LAMP, HIGH); // เปิดหลอดไฟเวลา 18:40
lampStatus = true;
} else if (now.hour() == 18 && now.minute() == 41) {
digitalWrite(RELAY_LAMP, LOW); // ปิดหลอดไฟเวลา 18:41
lampStatus = false;
}
// แสดงสถานะของหลอดไฟบนบรรทัดที่ 4
lcd.setCursor(0, 3);
lcd.print("Lamp: ");
lcd.print(lampStatus ? "ON " : "OFF");
// หน่วงเวลา 1 วินาที
delay(1000);
}