#include "WiFi.h"
#include <HTTPClient.h>
#include "DHT.h"
#include <time.h> // Untuk mengatur waktu terjadwal lampu UV
// Konfigurasi WiFi
const char* ssid = "Wokwi-GUEST"; // Ganti dengan SSID jaringan
const char* password = ""; // Ganti dengan password jaringan
// Pin untuk DHT22
#define DHTPIN 15
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Pin untuk TDS (menggunakan potensiometer)
#define TDS_PIN 35
// Pin untuk Relay Pompa Air
#define PUMP_RELAY_PIN 45
// Pin untuk Relay Lampu UV
#define UV_LAMP_RELAY_PIN 48
// Pin untuk Relay Pompa Nutrisi
#define NUTRIENT_PUMP_RELAY_PIN 47
// Batas TDS minimum (nilai ini disesuaikan dengan kebutuhan tanaman hidroponik)
const float TDS_MIN_THRESHOLD = 500.0; // Nilai threshold TDS untuk menambah nutrisi
// Variabel untuk waktu terjadwal lampu UV
const int uvLampDuration = 10 * 3600; // 10 jam dalam detik
time_t uvLampStartTime;
void setup() {
Serial.begin(115200);
// Inisialisasi DHT
dht.begin();
// Menghubungkan ke WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Menghubungkan ke WiFi...");
}
Serial.println("Terhubung ke WiFi");
// Inisialisasi pin output untuk relay pompa, lampu UV, dan pompa nutrisi
pinMode(PUMP_RELAY_PIN, OUTPUT);
pinMode(UV_LAMP_RELAY_PIN, OUTPUT);
pinMode(NUTRIENT_PUMP_RELAY_PIN, OUTPUT);
// Konfigurasi waktu NTP untuk waktu lampu UV
configTime(0, 0, "pool.ntp.org"); // Ambil waktu dari server NTP
Serial.println("Menunggu sinkronisasi waktu...");
time_t now = time(NULL);
while (now < 8 * 3600 * 2) { // Tunggu sampai waktu tersinkron
delay(500);
now = time(NULL);
}
struct tm timeinfo;
gmtime_r(&now, &timeinfo);
Serial.printf("Waktu saat ini: %02d:%02d:%02d\n", timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
// Mulai waktu lampu UV
uvLampStartTime = now;
}
void loop() {
// Membaca kelembapan dari sensor DHT22
float humidity = dht.readHumidity();
if (isnan(humidity)) {
Serial.println("Gagal membaca kelembapan dari DHT22!");
return;
}
// Membaca nilai TDS dari potensiometer sebagai simulasi
int tdsRawValue = analogRead(TDS_PIN);
float voltage = (tdsRawValue * 3.3) / 4095.0;
float tdsValue = voltage * 500; // Skala dari simulasi potensiometer
// Tampilkan data sensor
Serial.print("Kelembapan: ");
Serial.print(humidity);
Serial.print("% TDS: ");
Serial.print(tdsValue);
Serial.println(" ppm");
// Jika kelembapan terlalu rendah, aktifkan pompa air (relay)
if (humidity < 40.0) {
digitalWrite(PUMP_RELAY_PIN, LOW); // Relay aktif (menghubungkan pompa air)
Serial.println("Pompa Air Aktif: Kelembapan terlalu rendah!");
} else {
digitalWrite(PUMP_RELAY_PIN, HIGH); // Relay non-aktif (mematikan pompa air)
}
// Jika nilai TDS di bawah threshold, aktifkan pompa nutrisi (relay)
if (tdsValue < TDS_MIN_THRESHOLD) {
digitalWrite(NUTRIENT_PUMP_RELAY_PIN, LOW); // Relay aktif (menyalakan pompa nutrisi)
Serial.println("Pompa Nutrisi Aktif: TDS terlalu rendah!");
} else {
digitalWrite(NUTRIENT_PUMP_RELAY_PIN, HIGH); // Relay non-aktif (mematikan pompa nutrisi)
}
// Pengelolaan lampu UV
time_t now = time(NULL);
if (now - uvLampStartTime < uvLampDuration) {
digitalWrite(UV_LAMP_RELAY_PIN, LOW); // Relay aktif, menyalakan lampu UV
Serial.println("Lampu UV Aktif.");
} else {
digitalWrite(UV_LAMP_RELAY_PIN, HIGH); // Relay non-aktif, mematikan lampu UV
Serial.println("Lampu UV Non-Aktif.");
// Setel ulang waktu mulai lampu UV untuk hari berikutnya
uvLampStartTime = now + 24 * 3600;
}
// Jeda 10 detik sebelum pembacaan berikutnya
delay(10000);
}
Loading
esp32-s3-devkitc-1
esp32-s3-devkitc-1