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

// Ganti dengan kredensial WiFi Anda
const char* ssid = "Wokwi-GUEST";
const char* password = "";

// Ganti dengan kredensial MQTT Anda
const char* mqtt_server = "broker.emqx.io"; // Contoh broker MQTT
const char* mqtt_topic_temp = "sensor/dht22/temperature"; // Topik untuk suhu
const char* mqtt_topic_hum = "sensor/dht22/humidity"; // Topik untuk kelembapan

// Inisialisasi DHT
#define DHTPIN 4 // Pin yang digunakan untuk DHT22
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  Serial.begin(115200);
  dht.begin();

  // Menghubungkan ke WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");

  // Menghubungkan ke broker MQTT
  client.setServer(mqtt_server, 1883);
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  // Membaca suhu dan kelembapan
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  // Memeriksa apakah pembacaan gagal dan keluar lebih awal (NaN)
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // Mengirim data suhu ke broker MQTT
  client.publish(mqtt_topic_temp, String(t).c_str());
  // Mengirim data kelembapan ke broker MQTT
  client.publish(mqtt_topic_hum, String(h).c_str());

  // Menunggu beberapa detik sebelum pembacaan berikutnya
  delay(2000);
}

void reconnect() {
  // Loop hingga terhubung kembali
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Mencoba untuk menghubungkan
    if (client.connect("DHT22Client")) {
      Serial.println("connected");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" trying again in 5 seconds");
      delay(5000);
    }
  }
}