/*code esp32 connect :
1. lcd 2004 i2c
2.rtc ds1307
3.relay pin 12,13,14
4. dht22 pin 19
5. hc-sr04 trig pin 5 echo pin 4
6. pir pin 15
DO:
1. แสดง current time บรรทัดที่ 1
2. แสดง distance บรรทัดที่ 2 เป็น เซนติเมตร
3. แสดง temp และ hum บรรทัด 3
4. บรรทัดที่ 4 แสดง status relay1 ถ้า temp>30 on temp<30 off relay2 hum<50 on hum>50 off
5. relay3 pin 14 ถ้า distance =< 30 cm relay3 on distance =>30 cm relay3 off
นี่คือโค้ดสำหรับ ESP32 โดยใช้ Arduino IDE ครับ ผมได้รวมไลบรารีที่จำเป็นและตั้งค่าเงื่อนไขตามที่คุณต้องการเรียบร้อยแล้ว
การเตรียมการ (Libraries)
ก่อนอัปโหลดโค้ด คุณต้องติดตั้งไลบรารีเหล่านี้ผ่าน Library Manager:
LiquidCrystal I2C (โดย Frank de Brabander)
RTClib (โดย Adafruit)
DHT sensor library (โดย Adafruit)
โค้ดโปรแกรม (ESP32 Code)
คำแนะนำเพิ่มเติมเกี่ยวกับการต่อวงจร:
I2C Connection: ต่อขา SDA ของ LCD และ RTC เข้ากับ GPIO 21 และ SCL เข้ากับ GPIO 22 ของ ESP32
Logic Level: DHT22 และ Ultrasonic มักทำงานได้ดีที่ 5V แต่ ESP32 รับแรงดันขา Input ได้เพียง 3.3V หากเป็นไปได้ควรใช้ Voltage Divider ที่ขา Echo ของ Ultrasonic ก่อนเข้า GPIO 4 เพื่อความปลอดภัยของบอร์ด
Relay: ตรวจสอบว่า Relay Module ของคุณเป็นแบบ Active High หรือ Active Low (โค้ดด้านบนเขียนสำหรับ Active High คือส่งไฟไปแล้ว Relay ทำงาน)
คุณต้องการให้ผมช่วยปรับส่วนไหนเพิ่มเติมไหมครับ เช่น การเพิ่มเงื่อนไขของเซนเซอร์ PIR ที่ยังไม่ได้ระบุในส่วน "DO"?
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
// ตั้งค่าที่อยู่ I2C ของ LCD (ปกติคือ 0x27 หรือ 0x3F)
LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS1307 rtc;
// กำหนดขา Pin
#define DHTPIN 19
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
const int RELAY1 = 12;
const int RELAY2 = 13;
const int RELAY3 = 14;
const int PIR_PIN = 15;
const int TRIG_PIN = 5;
const int ECHO_PIN = 4;
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
dht.begin();
// ตั้งค่า Pin Mode
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
pinMode(RELAY3, OUTPUT);
pinMode(PIR_PIN, INPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
void loop() {
// 1. อ่านค่าเวลาจาก RTC
DateTime now = rtc.now();
// 2. อ่านค่า Ultrasonic (Distance)
long duration;
float distance;
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = (duration * 0.034) / 2;
// 3. อ่านค่า DHT22
float hum = dht.readHumidity();
float temp = dht.readTemperature();
// --- ตรรกะการควบคุม Relay ---
// Relay 1: Temp > 30
if (temp > 30.0) digitalWrite(RELAY1, HIGH);
else digitalWrite(RELAY1, LOW);
// Relay 2: Hum < 50
if (hum < 50.0) digitalWrite(RELAY2, HIGH);
else digitalWrite(RELAY2, LOW);
// Relay 3: Distance <= 30
if (distance <= 30.0) digitalWrite(RELAY3, HIGH);
else digitalWrite(RELAY3, LOW);
// --- การแสดงผลบน LCD ---
// บรรทัดที่ 1: เวลา
lcd.setCursor(0, 0);
char buf[20];
sprintf(buf, "Time: %02d:%02d:%02d", now.hour(), now.minute(), now.second());
lcd.print(buf);
// บรรทัดที่ 2: ระยะทาง
lcd.setCursor(0, 1);
lcd.print("Dist: ");
lcd.print(distance, 1);
lcd.print(" cm ");
// บรรทัดที่ 3: Temp & Hum
lcd.setCursor(0, 2);
lcd.print("T:");
lcd.print(temp, 1);
lcd.print("C H:");
lcd.print(hum, 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(1000); // หน่วงเวลา 1 วินาทีเพื่อให้เซนเซอร์ทำงานเสถียร
}
เพิ่มเติม led pin 27 ถ้ามีการเคลื่อนไหวให้ led on ถ้าไม่มีการเคลื่อนไหวให้ led off
จัดให้ครับ! ผมได้เพิ่มฟังก์ชันสำหรับ PIR Sensor (Pin 15) และ LED (Pin 27) เข้าไปในโค้ดเดิม โดยเมื่อตรวจพบการเคลื่อนไหว LED จะติดสว่างทันทีครับ
การเชื่อมต่อเพิ่มเติม
LED: ขาบวกต่อกับ GPIO 27 (ผ่านตัวต้านทาน 220-330 Ohm) และขาลง Ground
PIR Sensor: ขาสัญญาณต่อกับ GPIO 15
โค้ดโปรแกรม (เวอร์ชันอัปเดต)
ข้อแนะนำสำหรับ PIR Sensor:
PIR Warm-up: เมื่อจ่ายไฟครั้งแรก PIR Sensor มักจะต้องใช้เวลาประมาณ 30-60 วินาทีในการ "วอร์มอัพ" เพื่อปรับค่าสภาวะแวดล้อม ในช่วงนี้ LED อาจจะติดค้างหรือทำงานผิดพลาดได้ครับ
การปรับแต่ง: ที่ตัวโมดูล PIR จะมีตัวต้านทานปรับค่าได้ (Potentiometer) 2 อัน:
Sensitivity: ปรับระยะการตรวจจับ
Time Delay: ปรับค้างเวลาส่งสัญญาณ (แนะนำให้หมุนไปทางซ้ายสุดเพื่อให้ทดสอบโค้ดได้ง่าย)
ต้องการให้เพิ่มส่วนของการส่งค่าแจ้งเตือนไปยังแอปพลิเคชันอย่าง Blynk หรือ LINE Notify ด้วยไหมครับ?
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
// ตั้งค่า LCD และ RTC
LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS1307 rtc;
// กำหนดขา Pin
#define DHTPIN 19
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
const int RELAY1 = 12;
const int RELAY2 = 13;
const int RELAY3 = 14;
const int PIR_PIN = 15;
const int LED_PIN = 27; // Pin ที่เพิ่มใหม่
const int TRIG_PIN = 5;
const int ECHO_PIN = 4;
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
}
dht.begin();
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
pinMode(RELAY3, OUTPUT);
pinMode(LED_PIN, OUTPUT); // ตั้งค่า LED เป็น OUTPUT
pinMode(PIR_PIN, INPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
void loop() {
// 1. อ่านค่าเวลา
DateTime now = rtc.now();
// 2. อ่านค่า Ultrasonic
long duration;
float distance;
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = (duration * 0.034) / 2;
// 3. อ่านค่า DHT22
float hum = dht.readHumidity();
float temp = dht.readTemperature();
// 4. อ่านค่า PIR Sensor (การเคลื่อนไหว)
int motion = digitalRead(PIR_PIN);
if (motion == HIGH) {
digitalWrite(LED_PIN, HIGH); // มีการเคลื่อนไหว LED ติด
} else {
digitalWrite(LED_PIN, LOW); // ไม่มีการเคลื่อนไหว LED ดับ
}
// --- ตรรกะการควบคุม Relay ---
// Relay 1: Temp > 30 ON
digitalWrite(RELAY1, (temp > 30.0) ? HIGH : LOW);
// Relay 2: Hum < 50 ON
digitalWrite(RELAY2, (hum < 50.0) ? HIGH : LOW);
// Relay 3: Distance <= 30 ON
digitalWrite(RELAY3, (distance <= 30.0 && distance > 0) ? HIGH : LOW);
// --- การแสดงผลบน LCD ---
// บรรทัดที่ 1: Time
lcd.setCursor(0, 0);
char buf[21];
sprintf(buf, "Time: %02d:%02d:%02d ", now.hour(), now.minute(), now.second());
lcd.print(buf);
// บรรทัดที่ 2: Distance
lcd.setCursor(0, 1);
lcd.print("Dist: ");
lcd.print(distance, 1);
lcd.print(" cm ");
// บรรทัดที่ 3: Temp & Hum
lcd.setCursor(0, 2);
lcd.print("T:");
lcd.print(temp, 1);
lcd.print("C H:");
lcd.print(hum, 1);
lcd.print("% ");
// บรรทัดที่ 4: Status Relay & PIR
lcd.setCursor(0, 3);
lcd.print("R1:"); lcd.print(digitalRead(RELAY1) ? "O" : "X");
lcd.print(" R2:"); lcd.print(digitalRead(RELAY2) ? "O" : "X");
lcd.print(" R3:"); lcd.print(digitalRead(RELAY3) ? "O" : "X");
// lcd.print(" PIR:"); lcd.print(motion ? "MOV" : "---");
lcd.print(" PI:"); lcd.print(motion ? "MO" : "--");
delay(500); // ปรับลด delay เล็กน้อยเพื่อให้ตอบสนอง PIR เร็วขึ้น
}RTC 5v
SDA ->21
SCL ->22
dht22 5v
SDA ->19
distance 5v
trig ->5
echo ->4
lcd 5v
SDA ->21
SCl ->22
relay2 5v
in ->13
relay1 5v
in ->12
relay3 5v
in ->14
pir 5v
D ->15
led
a -> 27