// Proyek 136 - Alarm Air Tumpah di Lantai
// Board: NodeMCU ESP8266 V3 | Dashboard: klenik.ichibot.id
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// ===== ISI DULU =====
const char* WIFI_NAMA = "nama-wifi-kamu";
const char* WIFI_PASS = "password-wifi-kamu";

// topic MQTT: ganti budi1234 dengan KODE-mu (sama dengan di dashboard Klenik)
const char* TOPIK_BASAH = "ichibot/budi1234/p136/basah";
const char* TOPIK_LOG   = "ichibot/budi1234/p136/log";
const char* TOPIK_NILAI = "ichibot/budi1234/p136/nilai";

const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int BUZZER = D2;
const int BATAS_BASAH = 700;          // A0 di bawah angka ini = papan terkena air
bool basah = false;
unsigned long terakhir = 0;

void langganan() {}

void sambungWiFi() {
  WiFi.begin(WIFI_NAMA, WIFI_PASS);
  Serial.print("WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" OK, IP " + WiFi.localIP().toString());
}

void sambungMQTT() {
  while (!mqtt.connected()) {
    if (mqtt.connect(WiFi.macAddress().c_str())) {
      Serial.println("Terhubung ke Klenik");
      langganan();
    } else {
      Serial.println("Broker gagal, coba lagi 3 detik");
      delay(3000);
    }
  }
}
void setup() {
  Serial.begin(115200);
  pinMode(BUZZER, OUTPUT);
  sambungWiFi();
  mqtt.setServer(BROKER, 1883);
}

void loop() {
  if (!mqtt.connected()) sambungMQTT();
  mqtt.loop();
  digitalWrite(BUZZER, basah && (millis() / 300) % 2);

  if (millis() - terakhir < 1000) return;
  terakhir = millis();
  int nilai = analogRead(A0);         // kering ±1024, basah turun
  bool sekarang = nilai < BATAS_BASAH;
  if (sekarang != basah) {
    basah = sekarang;
    mqtt.publish(TOPIK_BASAH, basah ? "1" : "0", true);
    mqtt.publish(TOPIK_LOG, basah ? "AIR DI LANTAI! Cek mesin cuci/tandon/pipa" : "Lantai sudah kering");
  }
  mqtt.publish(TOPIK_NILAI, String(nilai).c_str());
}
