#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
// เริ่มต้นการใช้งาน RTC และ LCD
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2);
// อาเรย์สำหรับวันในสัปดาห์
const char* daysOfWeek[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
// กำหนดพิน
const int triggerPin = 2;
// ตัวแปรสถานะของทริกเกอร์
bool isTriggered_0635 = false;
bool isTriggered_0637 = false;
DateTime triggerStartTime_0635;
DateTime triggerStartTime_0637;
void setup() {
Serial.begin(9600);
// เริ่มต้นการใช้งาน LCD
lcd.init();
lcd.backlight();
// ตั้งค่าพินทริกเกอร์
pinMode(triggerPin, OUTPUT);
digitalWrite(triggerPin, LOW);
// เริ่มต้นการใช้งาน RTC
if (!rtc.begin()) {
lcd.print("RTC NOT found!");
Serial.println("RTC module is NOT found");
while (1);
}
// ตั้งค่าวันที่และเวลาเริ่มต้น
rtc.adjust(DateTime(2025, 1, 28, 6, 34, 55));
// แสดงข้อความต้อนรับ
lcd.setCursor(0, 0);
lcd.print("RTC Initialized!");
delay(2000);
lcd.clear();
}
void loop() {
DateTime now = rtc.now();
updateLCD(now);
handleTriggers(now);
// แสดงข้อมูลใน Serial Monitor
Serial.print("ESP32 RTC Date Time: ");
Serial.print(now.year());
Serial.print('/');
Serial.print(now.month());
Serial.print('/');
Serial.print(now.day());
Serial.print(" (");
Serial.print(daysOfWeek[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(now.hour());
Serial.print(':');
Serial.print(now.minute());
Serial.print(':');
Serial.println(now.second());
delay(1000);
}
void updateLCD(DateTime now) {
lcd.setCursor(0, 0);
lcd.print(now.year());
lcd.print('/');
if (now.month() < 10) lcd.print('0'); // เติม '0' ถ้าหมายเลขเดือนเป็นหลักเดียว
lcd.print(now.month());
lcd.print('/');
if (now.day() < 10) lcd.print('0'); // เติม '0' ถ้าหมายเลขวันเป็นหลักเดียว
lcd.print(now.day());
lcd.setCursor(0, 1);
lcd.print(daysOfWeek[now.dayOfTheWeek()]);
lcd.print(" ");
if (now.hour() < 10) lcd.print('0'); // เติม '0' ถ้าหมายเลขชั่วโมงเป็นหลักเดียว
lcd.print(now.hour());
lcd.print(':');
if (now.minute() < 10) lcd.print('0'); // เติม '0' ถ้าหมายเลขนาทีเป็นหลักเดียว
lcd.print(now.minute());
lcd.print(':');
if (now.second() < 10) lcd.print('0'); // เติม '0' ถ้าหมายเลขวินาทีเป็นหลักเดียว
lcd.print(now.second());
}
void handleTriggers(DateTime now) {
// ทริกเกอร์ที่เวลา 06:35:00 เป็นเวลา 1 นาที
if (now.hour() == 6 && now.minute() == 35 && now.second() == 0 && !isTriggered_0635) {
digitalWrite(triggerPin, HIGH);
triggerStartTime_0635 = now;
isTriggered_0635 = true;
Serial.println("Trigger ON: 06:35:00");
}
// ปิดทริกเกอร์หลังจาก 1 นาที (06:36:00)
if (isTriggered_0635 && now.unixtime() - triggerStartTime_0635.unixtime() >= 60) {
digitalWrite(triggerPin, LOW);
isTriggered_0635 = false;
Serial.println("Trigger OFF: 06:36:00");
}
// ทริกเกอร์ที่เวลา 06:37:00 เป็นเวลา 30 วินาที
if (now.hour() == 6 && now.minute() == 37 && now.second() == 0 && !isTriggered_0637) {
digitalWrite(triggerPin, HIGH);
triggerStartTime_0637 = now;
isTriggered_0637 = true;
Serial.println("Trigger ON: 06:37:00");
}
// ปิดทริกเกอร์หลังจาก 30 วินาที (06:37:30)
if (isTriggered_0637 && now.unixtime() - triggerStartTime_0637.unixtime() >= 30) {
digitalWrite(triggerPin, LOW);
isTriggered_0637 = false;
Serial.println("Trigger OFF: 06:37:30");
}
}