// Proyek 049 - Deteksi Kemiringan & Guncangan MMA8452
// Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id
#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <SparkFun_MMA8452Q.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_MIRINGX = "ichibot/budi1234/p049/miringx";
const char* TOPIK_MIRINGY = "ichibot/budi1234/p049/miringy";
const char* TOPIK_LOG     = "ichibot/budi1234/p049/log";

const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
MMA8452Q akselero;                    // I2C: SDA D21, SCL D22
float batasGuncang = 0.5;             // g, perubahan di atas ini dianggap guncangan
float xTadi = 0, yTadi = 0, zTadi = 1;
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);
  Wire.begin();
  if (!akselero.begin()) Serial.println("MMA8452 tidak ditemukan, cek SDA/SCL");
  sambungWiFi();
  mqtt.setServer(BROKER, 1883);
}

void loop() {
  if (!mqtt.connected()) sambungMQTT();
  mqtt.loop();
  if (!akselero.available() || millis() - terakhir < 100) return;
  terakhir = millis();

  float x = akselero.getCalculatedX(), y = akselero.getCalculatedY(), z = akselero.getCalculatedZ();
  float miringX = atan2(x, sqrt(y * y + z * z)) * 180 / PI;   // derajat
  float miringY = atan2(y, sqrt(x * x + z * z)) * 180 / PI;
  float guncang = abs(x - xTadi) + abs(y - yTadi) + abs(z - zTadi);
  xTadi = x; yTadi = y; zTadi = z;

  static unsigned long lapor = 0;
  if (millis() - lapor >= 1000) {
    lapor = millis();
    mqtt.publish(TOPIK_MIRINGX, String(miringX, 0).c_str());
    mqtt.publish(TOPIK_MIRINGY, String(miringY, 0).c_str());
  }
  if (guncang > batasGuncang) {
    mqtt.publish(TOPIK_LOG, ("Guncangan " + String(guncang, 2) + " g").c_str());
    delay(300);                       // satu guncangan dilaporkan sekali
  }
}
