#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27, 20, 4); // Menggunakan satu LCD 20x4
const int pumpPin = 8;
const int uvPin = 9; // Pin PWM untuk lampu UV
const int buzzerPin = 10; // Pin untuk buzzer
bool nutrientGiven = false;
// Ganti ini dengan tanggal penanaman
DateTime tanggalMulai(2024, 8, 31, 0, 0, 0);
void setup() {
// Inisialisasi LCD, RTC, dan pin
lcd.begin(20, 4);
lcd.backlight();
pinMode(pumpPin, OUTPUT);
pinMode(uvPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
Wire.begin();
if (!rtc.begin()) {
lcd.print("RTC Gagal");
while (1);
}
if (!rtc.isrunning()) {
lcd.setCursor(0, 0);
lcd.print("RTC Tersetel");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Menyetel waktu RTC sesuai waktu kompilasi
}
}
void loop() {
DateTime now = rtc.now();
// Baris pertama: Tampilkan hari dan waktu
lcd.setCursor(0, 0);
lcd.print("");
// Mendapatkan nama hari dalam format string
String hari;
switch (now.dayOfTheWeek()) {
case 0:
hari = "Minggu";
break;
case 1:
hari = "Senin";
break;
case 2:
hari = "Selasa";
break;
case 3:
hari = "Rabu";
break;
case 4:
hari = "Kamis";
break;
case 5:
hari = "Jumat";
break;
case 6:
hari = "Sabtu";
break;
}
// Menghitung jumlah hari sejak penanaman dimulai
TimeSpan durasi = now - tanggalMulai;
int mingguKe = (durasi.days() / 7) + 1;
lcd.print(hari);
lcd.print("(M-");
lcd.print(mingguKe);
lcd.print(")");
lcd.setCursor(12, 0); // Geser kursor untuk menampilkan jam di sebelah kanan
lcd.print("");
lcd.print(now.hour() < 10 ? "0" : "");
lcd.print(now.hour());
lcd.print(":");
lcd.print(now.minute() < 10 ? "0" : "");
lcd.print(now.minute());
lcd.print(":");
lcd.print(now.second() < 10 ? "0" : "");
lcd.print(now.second());
// Baris kedua: Tampilkan status pemberian nutrisi
lcd.setCursor(0, 1);
int delayTime = 0;
// Menentukan delay berdasarkan minggu ke-berapa
if (mingguKe == 1) {
delayTime = 20000; // 20 detik untuk minggu pertama
} else if (mingguKe == 2) {
delayTime = 30000; // 30 detik untuk minggu kedua
} else if (mingguKe == 3) {
delayTime = 40000; // 40 detik untuk minggu ketiga
} else if (mingguKe == 4) {
delayTime = 50000; // 50 detik untuk minggu keempat
} else if (mingguKe == 5) {
delayTime = 60000; // 60 detik untuk minggu kelima
}
// Nutrisi diberikan setiap minggu pada hari pertama (6 = Sabtu)
if (now.dayOfTheWeek() == 6 && !nutrientGiven) {
digitalWrite(pumpPin, HIGH); // Pompa aktif (LED menyala)
lcd.print("Nutrisi Diberi ");
delay(delayTime); // Pompa aktif selama waktu yang ditentukan
digitalWrite(pumpPin, LOW); // Pompa mati (LED mati)
nutrientGiven = true; // Tandai bahwa nutrisi telah diberikan
} else {
lcd.print("Nutrisi Mati ");
}
// Reset penanda jika hari telah berubah (minggu berikutnya)
if (now.dayOfTheWeek() != 6 && nutrientGiven) {
nutrientGiven = false;
}
// Baris ketiga: Mengatur waktu hidup/mati lampu UV dan tampilkan status UV
String uvStatus = "";
if (now.hour() >= 5 && now.hour() < 20) { // Lampu UV menyala dari jam 5 pagi hingga 8 malam (15 jam)
digitalWrite(uvPin, HIGH); // Hidupkan lampu UV
uvStatus = "UV nyala";
} else {
digitalWrite(uvPin, LOW); // Matikan lampu UV
uvStatus = "UV mati";
}
lcd.setCursor(0, 2);
lcd.print("Status UV : ");
lcd.setCursor(12, 2);
lcd.print(uvStatus);
// Baris keempat: Tampilkan peringatan "Tanaman Siap Dipanen" dan aktifkan buzzer jika minggu ke-6
lcd.setCursor(0, 3);
if (mingguKe >= 6) {
lcd.print("Tanaman siap panen!");
tone(buzzerPin, 1000); // Aktifkan buzzer dengan frekuensi 1000Hz
} else {
lcd.print("Belum siap panen!");
noTone(buzzerPin); // Matikan buzzer
}
delay(1000); // Update setiap detik
}