#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <ESP32Servo.h>

#define pServo1 19         // เซอร์โวพินตัวแรก
#define potPin1 34         // พอตานชิโอเมตรตัวแรกพิน
#define pServo2 13         // เซอร์โวพินตัวที่สอง
#define potPin2 32         // พอตานชิโอเมตรตัวที่สองพิน
#define lightPin 25        // พินสำหรับหลอดไฟ
#define buzzerPin  17
LiquidCrystal_I2C lcd(0x27, 20, 4); // ที่อยู่ I2C ของ LCD
RTC_DS3231 rtc;                     // สร้างออบเจกต์ RTC
Servo myservo1, myservo2;

void setup() {
  Serial.begin(115200);
  myservo1.attach(pServo1); // เชื่อมต่อเซอร์โวตัวแรก
  myservo2.attach(pServo2); // เชื่อมต่อเซอร์โวตัวที่สอง
  pinMode(potPin1, INPUT);  // ตั้งพิน potentiometer ตัวแรกเป็น INPUT
  pinMode(potPin2, INPUT);  // ตั้งพิน potentiometer ตัวที่สองเป็น INPUT
  pinMode(lightPin, OUTPUT); // ตั้งพินหลอดไฟเป็น OUTPUT
  pinMode(buzzerPin, OUTPUT); // ตั้งพิน Buzzer เป็น OUTPUT

  // ตั้งค่าพิน SDA และ SCL ใหม่
  Wire.begin(18, 5);  // กำหนด SDA เป็น GPIO 18 และ SCL เป็น GPIO 5

  // เริ่มต้น LCD
  lcd.begin(20, 4);
  lcd.backlight();

  // ตรวจสอบการเชื่อมต่อกับ RTC
  if (!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
}

void loop() {
  int potValue1 = analogRead(potPin1); // อ่านค่าจาก potentiometer ตัวแรก
  int potValue2 = analogRead(potPin2); // อ่านค่าจาก potentiometer ตัวที่สอง

  // แสดงค่าออกจอ LCD
  lcd.setCursor(0, 0);
  lcd.print("Oxygen score : ");
  lcd.print(potValue1);
  lcd.print("   ");

  lcd.setCursor(0, 1);
  lcd.print("Water level : ");
  lcd.print(potValue2);
  lcd.print("   ");

  // ดึงข้อมูลเวลาจาก RTC
  DateTime now = rtc.now();
  lcd.setCursor(0, 2);
  lcd.print("Time: ");
  if (now.hour() < 10) lcd.print("0");
  lcd.print(now.hour());
  lcd.print(":");
  if (now.minute() < 10) lcd.print("0");
  lcd.print(now.minute());
  lcd.print(":");
  if (now.second() < 10) lcd.print("0");
  lcd.print(now.second());

  // เปิดไฟ LED เวลา 12:49 หรือ 12:50
  if ((now.hour() == 12 && now.minute() == 49) || 
      (now.hour() == 12 && now.minute() == 50)) {
    digitalWrite(lightPin, HIGH); // เปิดไฟ
  } else {
    digitalWrite(lightPin, LOW);  // ปิดไฟ
  }

  // ควบคุมเซอร์โวตัวแรก
  if (potValue1 >= 1000) {
    myservo1.write(180);
    Serial.println("Servo 1 Angle: 180");
    delay(1000);
    myservo1.write(0);
    Serial.println("Servo 1 Angle: 0");
    delay(1000);
  } else {
    myservo1.write(0);
    Serial.println("Servo 1 Angle: 0 (stopped)");
  }

  // ควบคุมเซอร์โวตัวที่สอง
  if (potValue2 >= 500) {
    myservo2.write(180);
    Serial.println("Servo 2 Angle: 180");
    delay(1000);
    myservo2.write(0);
    Serial.println("Servo 2 Angle: 0");
    delay(1000);
  } else {
    myservo2.write(0);
    Serial.println("Servo 2 Angle: 0 (stopped)");
  }

  // เงื่อนไขเปิดใช้งาน Buzzer
  if (potValue1 > 1000 || potValue2 > 500) { // กำหนดค่าเกิน 2000 ให้เปิด Buzzer
    digitalWrite(buzzerPin, HIGH); // เปิด Buzzer
    Serial.println("Buzzer ON");
  } else {
    digitalWrite(buzzerPin, LOW); // ปิด Buzzer
    Serial.println("Buzzer OFF");
  }

  // แสดงค่าพอตานชิโอเมตรสำหรับการดีบัก
  Serial.print("Potentiometer 1 Value: ");
  Serial.println(potValue1);
  Serial.print("Potentiometer 2 Value: ");
  Serial.println(potValue2);

  delay(1000);
}
GND5VSDASCLSQWRTCDS1307+