#include <WiFi.h>
#include <WiFiClient.h>
#include <ThingSpeak.h>
#include <DHT.h>

// --- KONFIGURASI WIFI & THINKSPEAK ---
const char* WIFI_SSID = "Wokwi-GUEST";       // Ganti dengan nama WiFi Anda
const char* WIFI_PASSWORD = ""; // Ganti dengan password WiFi Anda

unsigned long myChannelNumber = 3004166;      // Ganti dengan Channel ID ThingSpeak Anda
const char* myWriteAPIKey = "RR30R84A3N2LFLKW"; // Ganti dengan Write API Key ThingSpeak Anda

WiFiClient client;

// --- KONFIGURASI SENSOR & AKTUATOR ---
#define DHTPIN 4      // Pin GPIO ESP32 yang terhubung ke pin data DHT22 (misal GPIO 4)
#define DHTTYPE DHT22 // Tipe sensor DHT yang digunakan (DHT11 atau DHT22)
DHT dht(DHTPIN, DHTTYPE);

#define BUZZER_PIN 16 // Pin GPIO ESP32 untuk Buzzer (misal GPIO 16)
#define LED_PIN 17    // Pin GPIO ESP32 untuk LED (misal GPIO 17)

// --- BATAS AMAN SUHU & KELEMBABAN ---
const float MIN_SUHU = 20.0; // Suhu minimum yang diinginkan (Celcius)
const float MAX_SUHU = 30.0; // Suhu maksimum yang diinginkan (Celcius)
const float MIN_KELEMBABAN = 40.0; // Kelembaban minimum yang diinginkan (%)
const float MAX_KELEMBABAN = 70.0; // Kelembaban maksimum yang diinginkan (%)

// --- INTERVAL PENGIRIMAN DATA KE THINKSPEAK ---
unsigned long lastSendTime = 0;
const long SEND_INTERVAL = 20000; // Kirim data setiap 20 detik (ThingSpeak biasanya 15-20 detik minimal)

void setup() {
  Serial.begin(115200); // Inisialisasi Serial Monitor untuk debugging
  delay(100);

  pinMode(BUZZER_PIN, OUTPUT);
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(BUZZER_PIN, LOW); // Pastikan buzzer mati di awal
  digitalWrite(LED_PIN, LOW);    // Pastikan LED mati di awal

  dht.begin(); // Inisialisasi sensor DHT

  Serial.print("Menghubungkan ke WiFi: ");
  Serial.println(WIFI_SSID);

  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi Terhubung!");
  Serial.print("Alamat IP: ");
  Serial.println(WiFi.localIP());

  ThingSpeak.begin(client); // Inisialisasi ThingSpeak
}

void loop() {
  // Pembacaan sensor DHT22
  float h = dht.readHumidity();
  float t = dht.readTemperature(); // Membaca suhu dalam Celcius

  // Cek jika pembacaan gagal
  if (isnan(h) || isnan(t)) {
    Serial.println("Gagal membaca dari sensor DHT!");
    digitalWrite(LED_PIN, HIGH); // Nyalakan LED untuk indikasi error
    digitalWrite(BUZZER_PIN, HIGH); // Aktifkan buzzer untuk indikasi error
    delay(500); // Biarkan menyala sebentar
    digitalWrite(BUZZER_PIN, LOW);
    digitalWrite(LED_PIN, LOW);
    delay(500);
    return; // Keluar dari loop dan coba lagi
  } else {
    // Normal, matikan buzzer/LED jika sebelumnya menyala karena error
    digitalWrite(LED_PIN, LOW);
    digitalWrite(BUZZER_PIN, LOW);
  }

  Serial.print("Suhu: ");
  Serial.print(t);
  Serial.print(" *C, Kelembaban: ");
  Serial.print(h);
  Serial.println(" %");

  // Logika untuk Buzzer dan LED berdasarkan kondisi suhu/kelembaban
  if (t < MIN_SUHU || t > MAX_SUHU || h < MIN_KELEMBABAN || h > MAX_KELEMBABAN) {
    Serial.println("Kondisi tidak ideal! Mengaktifkan Buzzer & LED...");
    digitalWrite(BUZZER_PIN, HIGH); // Aktifkan buzzer
    digitalWrite(LED_PIN, HIGH);    // Nyalakan LED (misal merah untuk peringatan)
  } else {
    Serial.println("Kondisi tanaman ideal.");
    digitalWrite(BUZZER_PIN, LOW); // Matikan buzzer
    digitalWrite(LED_PIN, LOW);    // Matikan LED (atau nyalakan hijau jika ingin)
  }

  // Kirim data ke ThingSpeak setiap SEND_INTERVAL
  if (millis() - lastSendTime > SEND_INTERVAL) {
    Serial.print("Mengirim data ke ThingSpeak...");

    // Set field untuk ThingSpeak
    ThingSpeak.setField(1, t); // Field 1 untuk Suhu
    ThingSpeak.setField(2, h); // Field 2 untuk Kelembaban

    // Kirim data
    int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
    if (x == 200) {
      Serial.println(" Berhasil.");
    } else {
      Serial.println(" Gagal, HTTP error code " + String(x));
    }
    lastSendTime = millis();
  }

  delay(2000); // Jeda kecil sebelum pembacaan selanjutnya
}