/*code esp32 connect:
1.lcd 2004 i2c
2.dht22 pin19
3. relay1 pin 12 , relay2 pin13
4.rtc ds1307
5.hc-sr04 trig pin5 echo pin4
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
To get this project running, you will need to install the following libraries in your Arduino IDE:
LiquidCrystal I2C (by Frank de Brabander)
DHT sensor library (by Adafruit)
RTClib (by Adafruit)
Connection Diagram
I2C Devices (LCD & RTC): Connect SDA to GPIO 21 and SCL to GPIO 22.
DHT22: Pin 19.
HC-SR04: Trig Pin 5, Echo Pin 4.
Relays: Pin 12 (Relay 1) and Pin 13 (Relay 2).
ESP32 Source Code
Logic Summary
Relay 1: Activates if temperature is above 30°C.
Relay 2: Activates if humidity drops below 50%.
LCD: Refreshes sensor data and RTC time every 1 second.
Note: If your relay module is "Active Low" (turns on when the pin is LOW), simply swap the HIGH and LOW commands in the relay logic section.
Would you like me to show you how to add a "Safe Distance" alarm using a buzzer if the HC-SR04 detects something too close?
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
// Pins Definition
#define DHTPIN 19
#define DHTTYPE DHT22
#define TRIG_PIN 5
#define ECHO_PIN 4
#define RELAY1_PIN 12
#define RELAY2_PIN 13
// Object Initialization
LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS1307 rtc;
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
// Initialize Pins
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RELAY1_PIN, OUTPUT);
pinMode(RELAY2_PIN, OUTPUT);
// Initialize LCD
lcd.init();
lcd.backlight();
// Initialize RTC
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
}
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Uncomment to set time to PC time
// Initialize DHT
dht.begin();
}
void loop() {
// 1. Get Time
DateTime now = rtc.now();
// 2. Get Distance
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;
// 3. Get Temp/Hum
float temp = dht.readTemperature();
float hum = dht.readHumidity();
// 4. Relay Logic
String r1Status = "OFF";
String r2Status = "OFF";
if (temp > 30) {
digitalWrite(RELAY1_PIN, HIGH); // Adjust to LOW if using Active Low relay
r1Status = "ON ";
} else {
digitalWrite(RELAY1_PIN, LOW);
r1Status = "OFF";
}
if (hum < 50) {
digitalWrite(RELAY2_PIN, HIGH);
r2Status = "ON ";
} else {
digitalWrite(RELAY2_PIN, LOW);
r2Status = "OFF";
}
// --- Display on LCD 2004 ---
// Line 1: Time
lcd.setCursor(0, 0);
char timeBuf[20];
sprintf(timeBuf, "Time: %02d:%02d:%02d", now.hour(), now.minute(), now.second());
lcd.print(timeBuf);
// Line 2: Distance
lcd.setCursor(0, 1);
lcd.print("Dist: ");
lcd.print(distance);
lcd.print(" cm ");
// Line 3: Temp & Hum
lcd.setCursor(0, 2);
lcd.print("T:");
lcd.print(temp, 1);
lcd.print("C H:");
lcd.print(hum, 1);
lcd.print("% ");
// Line 4: Relay Status
lcd.setCursor(0, 3);
lcd.print("R1:");
lcd.print(r1Status);
lcd.print(" R2:");
lcd.print(r2Status);
delay(1000); // Update every second
}
เพิ่มเติม connect relay3 pin14 ถ้า distance =<30 cm relay3 on distance >30 cm relay3 off
แน่นอนครับ ผมเพิ่มเงื่อนไขสำหรับ Relay 3 (Pin 14) ที่ควบคุมโดยระยะทางจาก HC-SR04 ให้เรียบร้อยแล้วครับ
การเชื่อมต่อเพิ่มเติม (Wiring)
Relay 3: ต่อเข้ากับ GPIO 14 ของ ESP32
รายละเอียดที่เพิ่มเข้าไป:
คำสั่งควบคุม Relay 3: ใช้เงื่อนไข distance <= 30 เพื่อสั่งให้ Pin 14 เป็น HIGH (ON) และถ้าไกลกว่านั้นจะเป็น LOW (OFF)
การแสดงผลบรรทัดที่ 4: ปรับการแสดงผลให้โชว์สถานะ Relay ครบทั้ง 3 ตัว (R1, R2, R3) เพื่อให้คุณตรวจสอบการทำงานได้ง่ายขึ้น
ข้อควรระวัง: หาก Relay ของคุณเป็นแบบ Active Low (ทำงานเมื่อสั่ง LOW) ให้สลับคำสั่ง HIGH เป็น LOW และ LOW เป็น HIGH ในโค้ดครับ
คุณต้องการให้เก็บข้อมูลค่าความร้อนหรือระยะทางลงใน SD Card เพิ่มเติมด้วยไหมครับ?
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
// Pins Definition
#define DHTPIN 19
#define DHTTYPE DHT22
#define TRIG_PIN 5
#define ECHO_PIN 4
#define RELAY1_PIN 12
#define RELAY2_PIN 13
#define RELAY3_PIN 14 // เพิ่ม Relay 3
// Object Initialization
LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS1307 rtc;
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
// Initialize Pins
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RELAY1_PIN, OUTPUT);
pinMode(RELAY2_PIN, OUTPUT);
pinMode(RELAY3_PIN, OUTPUT); // ตั้งค่า Relay 3 เป็น Output
// Initialize LCD
lcd.init();
lcd.backlight();
// Initialize RTC
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
}
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // ตั้งเวลาตามคอมพิวเตอร์ (ทำครั้งเดียวตอนลงโปรแกรม)
// Initialize DHT
dht.begin();
}
void loop() {
// 1. อ่านค่าเวลาจาก RTC
DateTime now = rtc.now();
// 2. อ่านค่าระยะทางจาก 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;
// 3. อ่านค่า Temp/Hum จาก DHT22
float temp = dht.readTemperature();
float hum = dht.readHumidity();
// --- Logic การควบคุม Relay ---
String r1Stat, r2Stat, r3Stat;
// Relay 1: Temp > 30 ON
if (temp > 30) {
digitalWrite(RELAY1_PIN, HIGH);
r1Stat = "ON";
} else {
digitalWrite(RELAY1_PIN, LOW);
r1Stat = "OFF";
}
// Relay 2: Humidity < 50 ON
if (hum < 50) {
digitalWrite(RELAY2_PIN, HIGH);
r2Stat = "ON";
} else {
digitalWrite(RELAY2_PIN, LOW);
r2Stat = "OFF";
}
// Relay 3: Distance <= 30cm ON
if (distance <= 30 && distance > 0) { // distance > 0 เพื่อป้องกันค่าผิดพลาด
digitalWrite(RELAY3_PIN, HIGH);
r3Stat = "ON";
} else {
digitalWrite(RELAY3_PIN, LOW);
r3Stat = "OFF";
}
// --- แสดงผลบน LCD 2004 ---
// บรรทัด 1: Current Time
lcd.setCursor(0, 0);
char timeBuf[20];
sprintf(timeBuf, "Time: %02d:%02d:%02d", now.hour(), now.minute(), now.second());
lcd.print(timeBuf);
// บรรทัด 2: Distance
lcd.setCursor(0, 1);
lcd.print("Dist: ");
lcd.print(distance, 1);
lcd.print(" cm "); // เว้นช่องว่างล้างค่าเก่า
// บรรทัด 3: Temp & Humidity
lcd.setCursor(0, 2);
lcd.print("T:"); lcd.print(temp, 1);
lcd.print("C H:"); lcd.print(hum, 0);
lcd.print("% ");
// บรรทัด 4: Status Relay ทั้ง 3 ตัว
lcd.setCursor(0, 3);
lcd.print("R1:"); lcd.print(r1Stat);
lcd.print(" R2:"); lcd.print(r2Stat);
lcd.print(" R3:"); lcd.print(r3Stat);
lcd.print(" ");
delay(1000); // หน่วงเวลา 1 วินาที
}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