#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);
}