#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <RTClib.h>
#include <ESP32Servo.h>
#include <LiquidCrystal_I2C.h>
// ตั้งค่าพิน
#define ONE_WIRE_BUS 32
#define TRIG_PIN 25
#define ECHO_PIN 26
#define SERVO_PIN_1 16
#define SERVO_PIN_2 17
#define SERVO_PIN_3 18
const int buzzerPin1 = 5; // ขา Buzzer ตัวที่ 1
const int buzzerPin2 = 4; // ขา Buzzer ตัวที่ 2
// สร้างออบเจ็กต์
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
RTC_DS3231 rtc;
Servo myServo1;
Servo myServo2;
Servo myServo3;
LiquidCrystal_I2C lcd(0x27, 16, 2);
// ตั้งเวลาการทำงาน
const int morningHour = 6; // 6.00 น.
const int eveningHour = 18; //18.00 น.
// ตัวแปรสำหรับการควบคุมเวลา
unsigned long previousMillis = 0;
const long interval = 10000;
bool servoActive = false;
void setup() {
Serial.begin(115200);
sensors.begin();
lcd.init();
lcd.backlight();
myServo1.attach(SERVO_PIN_1);
myServo2.attach(SERVO_PIN_2);
myServo3.attach(SERVO_PIN_3);
myServo3.write(0);
// ตรวจสอบ RTC
if (!rtc.begin()) {
lcd.print("RTC not found");
while (1);
}
if (rtc.lostPower()) {
lcd.print("RTC lost power!");
}
// ตั้งค่าขา Ultrasonic
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// กำหนดโหมดของขา Buzzer
pinMode(buzzerPin1, OUTPUT);
pinMode(buzzerPin2, OUTPUT);
}
void loop() {
sensors.requestTemperatures();
float temperature = sensors.getTempCByIndex(0);
DateTime now = rtc.now();
long duration, distance;
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration * 0.034 / 2;
Serial.print("Oxygen : ");
Serial.print(temperature);
Serial.print(" mg/L, Distance: ");
Serial.print(distance);
Serial.print(" cm, Time: ");
Serial.print(now.hour());
Serial.print(":");
Serial.print(now.minute());
Serial.print(":");
Serial.println(now.second());
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Oxygen : ");
lcd.print(temperature);
lcd.print(" mg/L");
lcd.setCursor(0, 1);
lcd.print("Distance: ");
lcd.print(distance);
lcd.print(" cm");
lcd.setCursor(0, 2);
lcd.print("Time: ");
lcd.print(now.hour());
lcd.print(":");
lcd.print(now.minute());
lcd.print(":");
lcd.print(now.second());
// ควบคุม Servo ตัวที่ 1 ตามระยะทาง
if (distance > 200) {
myServo1.write(180);
} else {
myServo1.write(0);
}
// ถ้าระดับน้ำต่ำกว่า 300 เป็นค่าวิกฤติ
if (distance > 300) {
tone(buzzerPin2, 1000);
} else {
noTone(buzzerPin2);
}
// ควบคุม Servo ตัวที่ 2 ตามอุณหภูมิ
if (temperature < 50) {
myServo2.write(180);
} else {
myServo2.write(0);
}
// ถ้า ออกซิเจนต่ำกว่า 30 เป็นค่าวิกฤต
if (temperature < 20) {
tone(buzzerPin1, 1000);
} else {
noTone(buzzerPin1);
}
// ตรวจสอบเวลาและควบคุมเซอร์โว
if ((now.hour() == morningHour && now.minute() == 0) ||
(now.hour() == eveningHour && now.minute() == 0)) {
if (!servoActive) {
myServo3.write(180); // หมุนเซอร์โวไปที่ 180 องศา
servoActive = true; // เซอร์โวเริ่มทำงาน
previousMillis = millis(); // ตั้งเวลาตอนที่เซอร์โวเริ่มทำงาน
}
}
// เมื่อเซอร์โวทำงานแล้ว 10 วินาที ให้กลับไปที่ 0 องศา
if (servoActive) {
if (millis() - previousMillis >= interval) {
myServo3.write(0); // กลับไปที่ตำแหน่ง 0 องศา
servoActive = false; // หยุดการทำงาน
}
}
delay(500); // หน่วงเวลา 500 มิลลิวินาทีเพื่อหลีกเลี่ยงการใช้ทรัพยากรมากเกินไป
}