/*
Program : Kirim data DHT22 dan Potensiometer ke MQTT Broker (JSON & String)
*/
#include <WiFi.h>
#include <PubSubClient.h>
#include <DHTesp.h>
#include <ArduinoJson.h>
// --- Konfigurasi WiFi ---
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// --- Konfigurasi MQTT Broker (gunakan broker publik, misal test.mosquitto.org) ---
const char* mqtt_server = "broker.emqx.io";
const int mqtt_port = 1883;
// --- Inisialisasi objek ---
WiFiClient espClient;
PubSubClient client(espClient);
DHTesp dht;
// --- Pin setup ---
#define DHT_PIN 15
#define POT_PIN 34
void setup_wifi() {
delay(1000);
Serial.print("Menghubungkan ke WiFi ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi terkoneksi!");
}
void reconnect() {
while (!client.connected()) {
Serial.print("Menghubungkan ke MQTT...");
if (client.connect("ESP32_Deni")) {
Serial.println("Terhubung!");
} else {
Serial.print("Gagal, rc=");
Serial.print(client.state());
Serial.println(" mencoba lagi dalam 5 detik...");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
dht.setup(DHT_PIN, DHTesp::DHT22);
delay(2000);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
TempAndHumidity data = dht.getTempAndHumidity();
int potValue = analogRead(POT_PIN);
float voltage = (potValue / 4095.0) * 3.3;
// --- Format JSON ---
StaticJsonDocument<200> doc;
doc["temperature"] = data.temperature;
doc["humidity"] = data.humidity;
doc["pot_value"] = potValue;
doc["voltage"] = voltage;
char jsonBuffer[256];
serializeJson(doc, jsonBuffer);
// --- Publish ke MQTT ---
client.publish("deni/iot/json", jsonBuffer);
Serial.println("Data JSON dikirim: ");
Serial.println(jsonBuffer);
// --- Format String biasa ---
String dataString = "Temp: " + String(data.temperature, 1) +
"°C, Humi: " + String(data.humidity, 1) +
"%, Pot: " + String(potValue);
client.publish("deni/iot/string", dataString.c_str());
Serial.println("Data String dikirim: ");
Serial.println(dataString);
delay(3000);
}