#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>

// Konstanta pin
#define DHT_PIN       13
#define DHT_TYPE      DHT22
#define LDR_PIN       12
#define SOIL_PIN      14
#define RELAY_PIN     16
#define LED_PIN       21
#define BUZZER_PIN    22

// Objek
LiquidCrystal_I2C lcd(0x27, 20, 4);
DHT dht(DHT_PIN, DHT_TYPE);

// Ambang batas
const int cahayaAmbang = 2000;
const int kelembabanTanahAmbang = 1500;

void setup() {
  Serial.begin(115200);
  dht.begin();

  // Inisialisasi I2C ESP32 (SDA = 19, SCL = 18)
  Wire.begin(19, 18);
  lcd.begin(20, 4);
  lcd.backlight();

  // Pin output
  pinMode(RELAY_PIN, OUTPUT);
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);

  // Matikan semua aktuator
  digitalWrite(RELAY_PIN, LOW);
  digitalWrite(LED_PIN, LOW);
  digitalWrite(BUZZER_PIN, LOW);
}

void loop() {
  // Baca semua sensor
  float suhu = dht.readTemperature();
  float kelembaban = dht.readHumidity();
  int nilaiLDR = analogRead(LDR_PIN);
  int nilaiSoil = analogRead(SOIL_PIN);

  // Penanda kondisi
  String kondisiCahaya = (nilaiLDR > cahayaAmbang) ? "Siang" : "Malam";
  String kondisiTanah = (nilaiSoil < kelembabanTanahAmbang) ? "Kering" : "Basah";
  String statusPompa = "Off";

  // Logika pompa
  if (kondisiCahaya == "Siang" && kondisiTanah == "Kering") {
    digitalWrite(RELAY_PIN, HIGH);
    digitalWrite(LED_PIN, HIGH);
    digitalWrite(BUZZER_PIN, HIGH);
    statusPompa = "On";
  } else {
    digitalWrite(RELAY_PIN, LOW);
    digitalWrite(LED_PIN, LOW);
    digitalWrite(BUZZER_PIN, LOW);
    statusPompa = "Off";
  }

  // Tampilkan ke Serial Monitor
  Serial.println("====== DATA SENSOR ======");
  Serial.print("Suhu: "); Serial.println(suhu);
  Serial.print("Kelembaban: "); Serial.println(kelembaban);
  Serial.print("Cahaya: "); Serial.print(nilaiLDR); Serial.print(" ("); Serial.print(kondisiCahaya); Serial.println(")");
  Serial.print("Soil: "); Serial.print(nilaiSoil); Serial.print(" ("); Serial.print(kondisiTanah); Serial.println(")");
  Serial.print("Pompa: "); Serial.println(statusPompa);
  Serial.println("==========================");

  // Tampilkan ke LCD
  lcd.clear();

  lcd.setCursor(0, 0);
  lcd.print("Suhu: "); lcd.print(suhu, 1); lcd.print("C");

  lcd.setCursor(0, 1);
  lcd.print("Humidity: "); lcd.print(kelembaban, 1); lcd.print("%");

  lcd.setCursor(0, 2);
  lcd.print("Cahaya: "); lcd.print(nilaiLDR); lcd.print(" "); lcd.print(kondisiCahaya);

  lcd.setCursor(0, 3);
  lcd.print("Soil: "); lcd.print(nilaiSoil);
  lcd.print(" "); lcd.print(kondisiTanah);
  lcd.print(" "); lcd.print(statusPompa);

  delay(3000); // Delay 3 detik
}
NOCOMNCVCCGNDINLED1PWRRelay Module