#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
// กำหนดขาและชนิดของ DHT
#define DHTPIN 12
#define DHTTYPE DHT22
// กำหนดขารีเลย์
#define FAN_RELAY 7
#define PUMP_RELAY 6
#define LAMP_RELAY 5
// กำหนดค่า DHT22 และ RTC
DHT dht(DHTPIN, DHTTYPE);
RTC_DS1307 rtc;
// สร้างอ็อบเจกต์สำหรับ LCD
LiquidCrystal_I2C lcd(0x27, 20, 4); // ที่อยู่ I2C ของ LCD
// ฟังก์ชันในการอ่านค่าอุณหภูมิและความชื้น
void readTemperatureAndHumidity(int &temperature, int &humidity) {
float temp = dht.readTemperature(); // อ่านค่าอุณหภูมิเป็น float
float hum = dht.readHumidity(); // อ่านค่าความชื้นเป็น float
// เปลี่ยนค่าเป็น int และจัดการค่าไม่ถูกต้อง
if (!isnan(temp)) {
temperature = (int)temp; // แปลงเป็น int
} else {
temperature = 0; // หากอ่านค่าไม่ได้ให้เป็น 0
}
if (!isnan(hum)) {
humidity = (int)hum; // แปลงเป็น int
} else {
humidity = 0; // หากอ่านค่าไม่ได้ให้เป็น 0
}
}
// ฟังก์ชันในการอัปเดตสถานะของรีเลย์และ LCD
void updateStatus(int temperature, int humidity) {
// ควบคุมพัดลมด้วยรีเลย์ที่ขา 7
if (temperature > 30) {
digitalWrite(FAN_RELAY, HIGH); // เปิดพัดลม
lcd.setCursor(0, 2);
lcd.print("Fan: ON ");
} else {
digitalWrite(FAN_RELAY, LOW); // ปิดพัดลม
lcd.setCursor(0, 2);
lcd.print("Fan: OFF");
}
// ควบคุมปั๊มน้ำด้วยรีเลย์ที่ขา 6
if (humidity > 80) {
digitalWrite(PUMP_RELAY, HIGH); // เปิดปั๊มน้ำ
lcd.setCursor(10, 2);
lcd.print("Pump: ON ");
} else {
digitalWrite(PUMP_RELAY, LOW); // ปิดปั๊มน้ำ
lcd.setCursor(10, 2);
lcd.print("Pump: OFF");
}
// ควบคุมโคมไฟด้วยรีเลย์ที่ขา 5
if (rtc.now().hour() == 11 && rtc.now().minute() == 47 && rtc.now().second() == 0) {
digitalWrite(LAMP_RELAY, HIGH); // เปิดโคมไฟ
}
if (rtc.now().hour() == 11 && rtc.now().minute() == 59 && rtc.now().second() == 0) {
digitalWrite(LAMP_RELAY, LOW); // ปิดโคมไฟ
}
// แสดงสถานะโคมไฟในบรรทัดที่ 4
lcd.setCursor(0, 3);
if (digitalRead(LAMP_RELAY) == HIGH) {
lcd.print("Lamp: ON ");
} else {
lcd.print("Lamp: OFF");
}
}
void setup() {
// เริ่มการสื่อสาร I2C สำหรับ LCD
lcd.init();
lcd.backlight();
// เริ่มต้น 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 sensor
dht.begin();
// กำหนดโหมดให้กับขารีเลย์
pinMode(FAN_RELAY, OUTPUT);
pinMode(PUMP_RELAY, OUTPUT);
pinMode(LAMP_RELAY, OUTPUT);
// ปิดรีเลย์ทั้งหมดในตอนเริ่มต้น
digitalWrite(FAN_RELAY, LOW);
digitalWrite(PUMP_RELAY, LOW);
digitalWrite(LAMP_RELAY, LOW);
}
void loop() {
int temperature = 0; // ตัวแปรสำหรับอุณหภูมิ
int humidity = 0; // ตัวแปรสำหรับความชื้น
// อ่านค่าอุณหภูมิและความชื้น
readTemperatureAndHumidity(temperature, humidity);
// แสดงเวลาในบรรทัดที่ 1
DateTime now = rtc.now();
lcd.setCursor(0, 0);
lcd.print("Time: ");
if (now.hour() < 10) lcd.print('0'); // เพิ่ม 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());
// แสดงค่า Temperature และ Humidity ในบรรทัดที่ 2
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print("C ");
lcd.print("Humid: ");
lcd.print(humidity);
lcd.print("%");
// อัปเดตสถานะรีเลย์และ LCD
updateStatus(temperature, humidity);
delay(1000); // หน่วงเวลา 1 วินาที
}