#include <WiFi.h>          // Untuk koneksi internet
#include <PubSubClient.h>  // Untuk komunikasi MQTT

const char* ssid = "Wokwi-GUEST";   // Nama WiFi Wokwi
const char* password = "";          // Password dikosongkan

const char* mqtt_server = "broker.hivemq.com";  // Broker MQTT
WiFiClient espClient;
PubSubClient client(espClient);

#define TRIG_PIN 5
#define ECHO_PIN 18

// Fungsi untuk membaca jarak dari sensor HC-SR04
float bacaJarak() {
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  long durasi = pulseIn(ECHO_PIN, HIGH);
  float jarak = durasi * 0.034 / 2; // dalam cm

  return jarak;
}

// Fungsi untuk mengirim data tinggi air ke broker MQTT
void kirimKeMQTT(float tinggiAir) {
  char pesan[50];
  dtostrf(tinggiAir, 6, 2, pesan);  // Konversi float ke string
  client.publish("jinni/banjir/tinggi", pesan);  // Kirim ke topik
}

void setup() {
  Serial.begin(115200);
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);

  // Mulai koneksi WiFi
  Serial.print("Menyambung ke WiFi");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("Terhubung ke WiFi");

  // Set server MQTT
  client.setServer(mqtt_server, 1883);
}

void loop() {
  if (!client.connected()) {
    reconnect();  // Cek koneksi MQTT
  }
  client.loop();  // Proses komunikasi MQTT

  float jarak = bacaJarak();  // Baca jarak dari sensor
  float tinggiAir = 100.0 - jarak;  // Misal tangki 100cm
  Serial.print("Tinggi Air: ");
  Serial.print(tinggiAir);
  Serial.println(" cm");

  kirimKeMQTT(tinggiAir);  // Kirim data ke MQTT

  delay(3000);  // Kirim data tiap 3 detik
}

// Fungsi untuk reconnect ke broker MQTT
void reconnect() {
  while (!client.connected()) {
    Serial.print("Menghubungkan ke MQTT...");
    // Coba sambungkan dengan Client ID yang unik
    if (client.connect("ESP32Client_12345")) {
      Serial.println("Terhubung ke MQTT!");
    } else {
      Serial.print("Gagal, status error: ");
      Serial.println(client.state());  // Debug jika gagal
      delay(5000);  // Coba lagi setelah 5 detik
    }
  }
}