#include <Wire.h>
#include <RTClib.h>
#include <ESP32Servo.h>
#include <LiquidCrystal_I2C.h>
// กำหนดพินสำหรับเซอร์โว
#define SERVO_PIN 16
// สร้างออบเจ็กต์
RTC_DS3231 rtc;
Servo myServo;
LiquidCrystal_I2C lcd(0x27, 16, 2); // ตรวจสอบที่อยู่ I2C ของจอ
// ตั้งเวลาการทำงาน
const int morningHour = 6; // 6.00 น.
const int eveningHour = 18; // 18.00 น.
// ตัวแปรสำหรับการควบคุมเวลา
unsigned long previousMillis = 0;
const long interval = 10000; // 10 วินาที
bool servoActive = false;
void setup() {
Serial.begin(115200);
// เริ่มต้น RTC
if (!rtc.begin()) {
Serial.println("RTC not found!");
while (1);
}
// ตรวจสอบว่า RTC สูญเสียพลังงานหรือไม่
if (rtc.lostPower()) {
// ตั้งค่าเวลาที่ต้องการ
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// เริ่มต้น LCD
lcd.init();
lcd.backlight();
// เชื่อมต่อเซอร์โว
myServo.attach(SERVO_PIN);
}
void loop() {
// อ่านเวลาจาก RTC
DateTime now = rtc.now();
// แสดงผลบน Serial Monitor
Serial.print("Time: ");
Serial.print(now.hour());
Serial.print(":");
Serial.print(now.minute());
Serial.print(":");
Serial.println(now.second());
// แสดงผลบน LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Time: ");
lcd.print(now.hour());
lcd.print(":");
lcd.print(now.minute());
lcd.print(":");
lcd.print(now.second());
// ตรวจสอบเวลาและควบคุมเซอร์โว
if ((now.hour() == morningHour && now.minute() == 0) ||
(now.hour() == eveningHour && now.minute() == 0)) {
if (!servoActive) {
myServo.write(180); // หมุนไปที่ 180 องศา
servoActive = true; // เซอร์โวทำงาน
previousMillis = millis(); // เริ่มนับเวลา
}
}
// ตรวจสอบว่าเซอร์โวทำงานเกิน 10 วินาทีหรือไม่
if (servoActive) {
if (millis() - previousMillis >= interval) {
myServo.write(0); // กลับไปที่ 0 องศา
servoActive = false; // เซอร์โวหยุดทำงาน
}
}
delay(1000); // รอ 1 วินาที
}