#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
// กำหนดขา Pin
#define DHTPIN 19
#define DHTTYPE DHT22
#define TRIG_PIN 2
#define ECHO_PIN 4
#define PIR_PIN 15
#define LED_PIN 27
#define RELAY1_PIN 12
#define RELAY2_PIN 13
#define RELAY3_PIN 14
// สร้าง Object สำหรับอุปกรณ์ต่างๆ
LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS1307 rtc;
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
// เริ่มต้น LCD
lcd.init();
lcd.backlight();
// เริ่มต้น RTC
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
}
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // เอาคอมเมนต์ออกหากต้องการตั้งเวลาใหม่
// เริ่มต้น DHT และตั้งค่าโหมด Pin
dht.begin();
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(RELAY1_PIN, OUTPUT);
pinMode(RELAY2_PIN, OUTPUT);
pinMode(RELAY3_PIN, OUTPUT);
}
void loop() {
// --- 1. อ่านค่าจากเซนเซอร์ ---
DateTime now = rtc.now();
float hum = dht.readHumidity();
float temp = dht.readTemperature();
int pirStatus = digitalRead(PIR_PIN);
// คำนวณระยะทาง Ultrasonic (Manual)
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
int distance = duration * 0.034 / 2;
// --- 2. เงื่อนไขควบคุม LED (PIR) ---
if (pirStatus == HIGH) {
digitalWrite(LED_PIN, HIGH);
} else {
digitalWrite(LED_PIN, LOW);
}
// --- 3. เงื่อนไขควบคุม Relay ---
// Relay 1: อุณหภูมิ
if (temp > 30) digitalWrite(RELAY1_PIN, HIGH);
else if (temp < 30) digitalWrite(RELAY1_PIN, LOW);
// Relay 2: ความชื้น
if (hum < 50) digitalWrite(RELAY2_PIN, HIGH);
else if (hum > 50) digitalWrite(RELAY2_PIN, LOW);
// Relay 3: ระยะทาง
if (distance > 0 && distance <= 30) digitalWrite(RELAY3_PIN, HIGH);
else if (distance >= 30 || distance == 0) digitalWrite(RELAY3_PIN, LOW);
// --- 4. แสดงผลบนหน้าจอ LCD 2004 ---
// บรรทัดที่ 1: เวลาปัจจุบัน
lcd.setCursor(0, 0);
char timeStr[20];
sprintf(timeStr, "Time: %02d:%02d:%02d", now.hour(), now.minute(), now.second());
lcd.print(timeStr);
// บรรทัดที่ 2: ระยะทาง
lcd.setCursor(0, 1);
lcd.print("Distance: ");
lcd.print(distance);
lcd.print(" cm ");
// บรรทัดที่ 3: อุณหภูมิและความชื้น
lcd.setCursor(0, 2);
lcd.print("T:"); lcd.print(temp, 1);
lcd.print("C H:"); lcd.print(hum, 1);
lcd.print("% ");
// บรรทัดที่ 4: สถานะ Relay
lcd.setCursor(0, 3);
lcd.print("R1:"); lcd.print(digitalRead(RELAY1_PIN) ? "ON " : "OFF");
lcd.print(" R2:"); lcd.print(digitalRead(RELAY2_PIN) ? "ON " : "OFF");
lcd.print(" R3:"); lcd.print(digitalRead(RELAY3_PIN) ? "ON " : "OFF");
delay(500); // อัปเดตข้อมูลทุก 0.5 วินาที
}FAN 1
PUMP 2
GND
+5V
SCL pin 22
SDA pin 21
DHT pin19
pin12
pin13
ECHO pin4
TRIG pin2
MOTOR 3
pin14
OUT pin15