#include "WiFi.h"
#include <HTTPClient.h>
#include <time.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // Library untuk LCD I2C
// Konfigurasi WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Pin untuk LDR dan TDS
#define LDR_PIN 35
#define TDS_PIN 34
#define UV_LAMP_RELAY_PIN 18
#define NUTRIENT_PUMP_RELAY_PIN 5
// Batas TDS dan cahaya minimum
const float TDS_MIN_THRESHOLD = 500.0;
const int LDR_LIGHT_THRESHOLD = 1000;
// Variabel untuk waktu terjadwal lampu UV dan pemberian nutrisi
const int uvLampDuration = 10 * 3600;
const int oneWeek = 7 * 24 * 3600;
time_t uvLampStartTime;
time_t lastNutrientTime;
// Variabel untuk melacak minggu dan target ppm per minggu
int currentWeek = 1; // Awali dengan minggu pertama
const int nutrientPpmTargets[] = {400, 800, 1200, 1400}; // Target ppm untuk 4 minggu
// Inisialisasi LCD I2C
LiquidCrystal_I2C lcd(0x27, 20, 4); // Alamat I2C 0x27, LCD 20x4
void setup() {
Serial.begin(115200);
// Inisialisasi LCD
lcd.begin(20, 4);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Menghubungkan WiFi...");
// Menghubungkan ke WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
lcd.setCursor(0, 0);
lcd.print("Menghub. ke WiFi...");
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WiFi Connected");
// Inisialisasi pin output untuk relay pompa, lampu UV, dan pompa nutrisi
pinMode(UV_LAMP_RELAY_PIN, OUTPUT);
pinMode(NUTRIENT_PUMP_RELAY_PIN, OUTPUT);
// Matikan semua relay pada awalnya
digitalWrite(UV_LAMP_RELAY_PIN, HIGH);
digitalWrite(NUTRIENT_PUMP_RELAY_PIN, HIGH);
// Konfigurasi waktu NTP
configTime(7 * 3600, 0, "pool.ntp.org");
lcd.setCursor(0, 1);
lcd.print("Syncing time...");
time_t now = time(NULL);
while (now < 8 * 3600 * 2) {
delay(500);
now = time(NULL);
}
// Sinkronisasi waktu untuk sistem
struct tm timeinfo;
localtime_r(&now, &timeinfo);
lcd.clear();
lcd.setCursor(0, 0);
lcd.printf("Waktu: %02d:%02d:%02d", timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
// Inisialisasi waktu lampu UV dan pemberian nutrisi
uvLampStartTime = now;
lastNutrientTime = now;
}
void loop() {
time_t now = time(NULL);
// Membaca nilai TDS
int tdsRawValue = analogRead(TDS_PIN);
float voltage = (tdsRawValue * 3.3) / 4095.0;
float tdsValue = voltage * 500; // Sesuaikan jika kalibrasi lain dibutuhkan
// Tampilkan data sensor TDS di LCD
lcd.setCursor(0, 1);
lcd.print("TDS: ");
lcd.print(tdsValue);
lcd.print(" ppm ");
// Cek apakah sudah waktunya memberikan nutrisi (setiap minggu)
if (now - lastNutrientTime >= oneWeek) {
lcd.setCursor(0, 2);
lcd.print("Tambah Nutrisi...");
// Jika TDS 0 sebelum waktunya nutrisi, pompa ditambahkan
if (tdsValue == 0 || tdsValue < TDS_MIN_THRESHOLD) {
int targetPpm = nutrientPpmTargets[currentWeek - 1]; // Ambil target ppm minggu ini
lcd.setCursor(0, 3);
lcd.printf("Minggu %d: %d ppm", currentWeek, targetPpm);
// Nyalakan pompa nutrisi untuk memenuhi target ppm
digitalWrite(NUTRIENT_PUMP_RELAY_PIN, HIGH);
delay(10000); // Sesuaikan durasi berdasarkan kebutuhan
digitalWrite(NUTRIENT_PUMP_RELAY_PIN, LOW);
} else {
lcd.setCursor(0, 3);
lcd.print("Nutrisi Cukup.");
digitalWrite(NUTRIENT_PUMP_RELAY_PIN, LOW);
}
// Reset waktu pemberian nutrisi dan update minggu
lastNutrientTime = now;
currentWeek = (currentWeek % 4) + 1; // Ulangi siklus setiap 4 minggu
} else {
lcd.setCursor(0, 2);
lcd.print("Nutrisi OK. ");
digitalWrite(NUTRIENT_PUMP_RELAY_PIN, LOW);
}
// Membaca nilai dari sensor LDR
int ldrValue = analogRead(LDR_PIN);
lcd.setCursor(0, 3);
lcd.print("Cahaya: ");
lcd.print(ldrValue);
// Pengelolaan lampu UV berdasarkan waktu dan LDR
if ((now - uvLampStartTime) < uvLampDuration) {
if (ldrValue < LDR_LIGHT_THRESHOLD) {
lcd.setCursor(0, 3);
lcd.print("Lampu UV Aktif");
digitalWrite(UV_LAMP_RELAY_PIN, HIGH);
} else {
lcd.setCursor(0, 3);
lcd.print("Cahaya Cukup ");
digitalWrite(UV_LAMP_RELAY_PIN, LOW);
}
} else {
digitalWrite(UV_LAMP_RELAY_PIN, LOW);
lcd.setCursor(0, 3);
lcd.print("UV Lamp Mati.");
}
// Reset waktu lampu UV setelah satu hari
if ((now - uvLampStartTime) >= 24 * 3600) {
uvLampStartTime = now;
lcd.setCursor(0, 3);
lcd.print("Waktu UV Reset.");
}
// Jeda 10 detik sebelum pembacaan berikutnya
delay(10000);
}