#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include "DHT.h"
// 1. ตั้งค่า Address จอ LCD (ปกติ 0x27) และขนาด 20x4
LiquidCrystal_I2C lcd(0x27, 20, 4);
// 2. ตั้งค่า RTC DS1307
RTC_DS1307 rtc;
// 3. ตั้งค่า DHT22
#define DHTPIN 19
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// 4. ตั้งค่า Ultrasonic
const int trigPin = 2;
const int echoPin = 4;
// 5. ตั้งค่า Relay Pins
const int relay1 = 12;
const int relay2 = 13;
const int relay3 = 14;
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
dht.begin();
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
}
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // ปลดคอมเมนต์เพื่อตั้งเวลาให้ตรงคอมพิวเตอร์
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
pinMode(relay3, OUTPUT);
}
void loop() {
// --- อ่านค่าจากเซนเซอร์ ---
DateTime now = rtc.now();
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
float distanceCm = (duration * 0.0343) / 2;
float distanceM = distanceCm / 100.0; // แปลงเป็นเมตรสำหรับบรรทัดที่ 2
float h = dht.readHumidity();
float t = dht.readTemperature();
// --- ตรรกะการควบคุม Relay ---
bool r1_on = (t > 30); // Relay 1: Temp > 30 ON
bool r2_on = (h < 50); // Relay 2: Hum < 50 ON
bool r3_on = (distanceCm < 30); // Relay 3: Dist < 30cm ON
digitalWrite(relay1, r1_on ? HIGH : LOW);
digitalWrite(relay2, r2_on ? HIGH : LOW);
digitalWrite(relay3, r3_on ? HIGH : LOW);
// --- การแสดงผล LCD 2004 ---
// บรรทัด 1: เวลาปัจจุบัน
lcd.setCursor(0, 0);
char timeBuf[21];
sprintf(timeBuf, "Time: %02d:%02d:%02d ", now.hour(), now.minute(), now.second());
lcd.print(timeBuf);
// บรรทัด 2: ระยะทาง (เมตร)
lcd.setCursor(0, 1);
lcd.print("Dist: ");
lcd.print(distanceM, 2);
lcd.print(" m ");
// บรรทัด 3: อุณหภูมิ & ความชื้น
lcd.setCursor(0, 2);
lcd.print("T:"); lcd.print(t, 1); lcd.print("C ");
lcd.print("H:"); lcd.print(h, 1); lcd.print("% ");
// บรรทัด 4: สถานะ Relay 1, 2, 3
lcd.setCursor(0, 3);
lcd.print("R1:"); lcd.print(r1_on ? "ON " : "OFF");
lcd.print(" R2:"); lcd.print(r2_on ? "ON " : "OFF");
lcd.print(" R3:"); lcd.print(r3_on ? "ON " : "OFF");
delay(1000);
}FAN
PUMP
GND
+5V
SCL pin 22
SDA pin 21
DHT pin19
pin12
pin13
ECHO pin4
TRIG pin2
MOTOR
pin14