#include <WiFi.h>
#include <PubSubClient.h>
#include <Ultrasonic.h>

const char* ssid = "R_Kepala_Lab"; // Ganti dengan SSID WiFi Anda
const char* password = "Rkepalalab"; // Ganti dengan password WiFi Anda
const char* thingsboardServer = "http://thingsboard.cloud/api/v1/ezm0e778vg09f66lb2n4/telemetry"; // Ganti dengan alamat server ThingsBoard Anda
const char* accessToken = "Yezm0e778vg09f66lb2n4"; // Ganti dengan access token ThingsBoard Anda

const int triggerPin = 12; // Pin trigger sensor ultrasonik
const int echoPin = 14; // Pin echo sensor ultrasonik

Ultrasonic ultrasonic(triggerPin, echoPin); // Buat objek sensor ultrasonik
WiFiClient wifiClient; // Buat objek klien WiFi
PubSubClient client(wifiClient); // Buat objek klien MQTT

void setup() {
  Serial.begin(115200); // Inisialisasi komunikasi serial

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

  // Hubungkan ke ThingsBoard melalui MQTT
  client.setServer(thingsboardServer, 1883);
}

void loop() {
  // Baca data jarak dari sensor ultrasonik
  float distance = ultrasonic.read();

  // Format data jarak ke JSON
  String payload = "{";
  payload += "\"distance\":";
  payload += distance;
  payload += "}";

  // Hubungkan ke ThingsBoard jika belum terhubung
  if (!client.connected()) {
    if (client.connect("ESP32Client", accessToken, NULL)) {
      Serial.println("Connected to ThingsBoard");
    } else {
      Serial.print("Failed to connect to ThingsBoard, rc=");
      Serial.println(client.state());
    }
  }

  // Kirim data jarak ke ThingsBoard
  if (client.connected()) {
    client.publish("v1/devices/me/telemetry", payload.c_str());
    Serial.println("Data sent to ThingsBoard");
  }

  // Putuskan koneksi ThingsBoard jika tidak digunakan
  if (!client.connected()) {
    client.disconnect();
    Serial.println("Disconnected from ThingsBoard");
  }

  delay(1000); // Tunggu 1 detik sebelum mengulang loop
}