#include <Servo.h>
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
Servo myservo;
Servo servoIn; // Servo untuk katup air masuk
Servo servoOut; // Servo untuk katup air keluar
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C 0x27 atau 0x3F (sesuaikan dengan modul LCD Anda)
const int servoPin = 9;
const int servoInPin = 10;
const int servoOutPin = 11;
const int trigPin = 7;
const int echoPin = 6;
const int moisturePin = A0; // Pin sensor kelembapan
const int turbidityPin = A1; // Pin sensor kekeruhan
const int feedingHours[] = {13, 1}; // Pemberian makan pada jam 13 (1 siang) dan 1 (1 malam)
const int numFeedingTimes = 2; // Jumlah waktu pemberian makan
const int drainingLevel = 20; // Level air untuk mulai menguras (dalam cm)
// Timer untuk pergantian tampilan LCD
unsigned long previousMillis = 0;
const long interval = 1000; // Interval pergantian tampilan LCD (dalam milidetik)
void setup() {
myservo.attach(servoPin);
servoIn.attach(servoInPin);
servoOut.attach(servoOutPin);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(moisturePin, INPUT);
pinMode(turbidityPin, INPUT);
Serial.begin(9600);
if (!rtc.begin()) {
Serial.println("RTC tidak ditemukan!");
while (1);
}
if (!rtc.isrunning()) {
Serial.println("RTC tidak berjalan, men-setting tanggal & waktu!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Setup Complete");
myservo.write(0); // Pintu pemberi makan tertutup
servoIn.write(0); // Katup air masuk tertutup
servoOut.write(0); // Katup air keluar tertutup
}
void loop() {
DateTime now = rtc.now();
unsigned long currentMillis = millis();
// Pemberian makan otomatis
static bool feedingDone[numFeedingTimes] = {false, false};
for (int i = 0; i < numFeedingTimes; i++) {
if (now.hour() == feedingHours[i] && now.minute() == 0 && !feedingDone[i]) {
myservo.write(90); // Buka pintu pemberi makan
delay(5000); // Tunggu 5 detik
myservo.write(0); // Tutup pintu pemberi makan
feedingDone[i] = true; // Tandai bahwa pemberian makan sudah dilakukan pada waktu ini
} else if (now.minute() != 0) {
feedingDone[i] = false; // Reset status pemberian makan setiap menit
}
}
// Pengurasan kolam otomatis
int duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration / 2) / 29.1;
// Pembacaan sensor kelembapan
int moistureValue = analogRead(moisturePin);
float moisturePercent = map(moistureValue, 0, 1023, 0, 100); // Ubah nilai menjadi persentase
// Pembacaan sensor kekeruhan
int turbidityValue = analogRead(turbidityPin); // Baca nilai sensor kekeruhan
// Pergantian tampilan LCD setiap detik
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
static bool displayMode = false; // Mode tampilan
lcd.clear(); // Hapus tampilan LCD sebelum menampilkan informasi baru
if (displayMode) {
// Tampilkan waktu dan jarak air
lcd.setCursor(0, 0);
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.setCursor(0, 1);
lcd.print("Water: ");
lcd.print(distance);
lcd.print(" cm");
} else {
// Tampilkan kelembapan dan kekeruhan
lcd.setCursor(0, 0);
lcd.print("Humidity: ");
lcd.print(moisturePercent);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("Turbidity: ");
lcd.print(turbidityValue);
}
displayMode = !displayMode; // Ganti mode tampilan
}
delay(100); // Cek setiap 100 milidetik
}