#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
// Pin Definitions
#define DHTPIN 19
#define DHTTYPE DHT22
#define TRIG_PIN 5
#define ECHO_PIN 4
#define PIR_PIN 15
#define LED_PIN 27 // เพิ่ม LED Pin 27
#define RELAY1 12
#define RELAY2 13
#define RELAY3 14
// Initialize Objects
LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS1307 rtc;
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
// Pin Modes
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT); // ตั้งค่า LED เป็น Output
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
pinMode(RELAY3, OUTPUT);
// Initialize LCD
lcd.init();
lcd.backlight();
// Initialize RTC
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
}
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
dht.begin();
}
void loop() {
// --- 1. อ่านค่าจาก Sensor ต่างๆ ---
DateTime now = rtc.now();
// วัดระยะทาง HC-SR04
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
float distance = duration * 0.034 / 2;
// อ่านค่า Temp/Hum
float h = dht.readHumidity();
float t = dht.readTemperature();
// อ่านค่า PIR (Motion)
int motion = digitalRead(PIR_PIN);
// --- 2. ตรรกะการควบคุม (Logic) ---
// LED Control (PIR)
if (motion == HIGH) {
digitalWrite(LED_PIN, HIGH); // มีการเคลื่อนไหว LED ติด
} else {
digitalWrite(LED_PIN, LOW); // ไม่มีการเคลื่อนไหว LED ดับ
}
// Relay 1 (Temp)
if (t > 30.0) digitalWrite(RELAY1, HIGH);
else if (t < 30.0) digitalWrite(RELAY1, LOW);
// Relay 2 (Humidity)
if (h < 50.0) digitalWrite(RELAY2, HIGH);
else if (h > 50.0) digitalWrite(RELAY2, LOW);
// Relay 3 (Distance)
if (distance <= 30.0) digitalWrite(RELAY3, HIGH);
else if (distance >= 30.0) digitalWrite(RELAY3, LOW);
// --- 3. การแสดงผลบน LCD 2004 ---
// บรรทัดที่ 1: เวลาปัจจุบัน
lcd.setCursor(0, 0);
char timeStr[21];
sprintf(timeStr, "Time: %02d:%02d:%02d %s",
now.hour(), now.minute(), now.second(),
(motion == HIGH ? "(!) " : " ")); // แสดงเครื่องหมาย ! ถ้าเจอการเคลื่อนไหว
lcd.print(timeStr);
// บรรทัดที่ 2: ระยะทาง
lcd.setCursor(0, 1);
lcd.print("Distance: ");
lcd.print(distance, 1);
lcd.print(" cm ");
// บรรทัดที่ 3: อุณหภูมิและความชื้น
lcd.setCursor(0, 2);
lcd.print("T:");
lcd.print(t, 1);
lcd.print("C H:");
lcd.print(h, 0);
lcd.print("% ");
// บรรทัดที่ 4: สถานะ Relay
lcd.setCursor(0, 3);
lcd.print("R1:");
lcd.print(digitalRead(RELAY1) ? "ON " : "OFF");
lcd.print("R2:");
lcd.print(digitalRead(RELAY2) ? "ON " : "OFF");
lcd.print("R3:");
lcd.print(digitalRead(RELAY3) ? "ON " : "OFF");
delay(500); // หน่วงเวลาเล็กน้อยเพื่อให้แสดงผลนิ่งขึ้น
}FAN
PUMP
+5V
GND
PIN 12
PIN 13
SCL PIN 22
ECHO PIN 4
TRIG PIN 5
DHT PIN 19
SDA PIN 21
ไฟเลี้ยง
MOTOR
PIN 14
PIR PIN 15