#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
#include "DHT.h"
// ตั้งค่า LCD 2004 I2C (Address 0x27)
LiquidCrystal_I2C lcd(0x27, 20, 4);
// ตั้งค่า RTC DS1307
RTC_DS1307 rtc;
// ตั้งค่า DHT22
#define DHTPIN 19
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// กำหนด Pins อุปกรณ์ต่างๆ
const int trigPin = 5;
const int echoPin = 4;
const int pirPin = 15;
const int ledPin = 27; // Pin สำหรับ LED ที่เพิ่มมา
const int relay1 = 12;
const int relay2 = 13;
const int relay3 = 14;
void setup() {
Serial.begin(115200);
// เริ่มการทำงาน Library
dht.begin();
lcd.init();
lcd.backlight();
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
}
// ตั้งเวลาเริ่มต้นหาก RTC ไม่ได้รัน (ใช้เวลาตอนคอมไพล์)
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// ตั้งค่า Mode ของแต่ละ Pin
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(pirPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
pinMode(relay3, OUTPUT);
// ปิดอุปกรณ์ทั้งหมดเมื่อเริ่มโปรแกรม
digitalWrite(ledPin, LOW);
digitalWrite(relay1, LOW);
digitalWrite(relay2, LOW);
digitalWrite(relay3, LOW);
}
void loop() {
// อ่านค่าจากเซนเซอร์ต่างๆ
DateTime now = rtc.now();
float h = dht.readHumidity();
float t = dht.readTemperature();
// คำนวณระยะทางจาก HC-SR04
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
float distance = duration * 0.034 / 2;
// --- Logic ควบคุมอุปกรณ์ (Output Logic) ---
// 1. ควบคุม LED Pin 27 ด้วย PIR
if (digitalRead(pirPin) == HIGH) {
digitalWrite(ledPin, HIGH); // ติดเมื่อพบการเคลื่อนไหว
} else {
digitalWrite(ledPin, LOW); // ดับเมื่อไม่พบ
}
// 2. ควบคุม Relay 1 (Temperature)
if (t > 30) digitalWrite(relay1, HIGH);
else if (t < 30) digitalWrite(relay1, LOW);
// 3. ควบคุม Relay 2 (Humidity)
if (h < 50) digitalWrite(relay2, HIGH);
else if (h > 50) digitalWrite(relay2, LOW);
// 4. ควบคุม Relay 3 (Distance)
if (distance > 0 && distance <= 30) digitalWrite(relay3, HIGH);
else digitalWrite(relay3, LOW);
// --- การแสดงผลบนจอ LCD 2004 ---
// บรรทัดที่ 1: เวลา
lcd.setCursor(0, 0);
char timeBuf[20];
sprintf(timeBuf, "Time: %02d:%02d:%02d", now.hour(), now.minute(), now.second());
lcd.print(timeBuf);
// บรรทัดที่ 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, 1);
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(200); // ปรับค่าหน่วงเวลาให้น้อยลงเพื่อให้ PIR ตอบสนองไวขึ้น
}FAN
PUMP
+5V ไฟเลี้ยง
GND
PIN 12
PIN 13
DHT PIN 19
TRIG PIN 5
ECHO PIN 4
SDA PIN 21
SCL PIN 22
Distance sensor
MOTOR
PIN 14
PIN 15