#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
// ===== Konfigurasi WiFi =====
const char* WIFI_SSID = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
// ===== Konfigurasi MQTT untuk Klenik (via EMQX) =====
#define MQTT_SERVER "mqtt.ichibot.id"
#define MQTT_PORT 1883 // EMQX, bukan 1884 (punya ThingsBoard)
// Tanpa username/password (EMQX open)
// ===== Topic -- WAJIB unik, sisipkan nama/identitas Anda! =====
#define TOPIC_TELEMETRY "T18/suhu"
#define TOPIC_TELEMETRY1 "T18/kelembaban"
#define TOPIC_LED "T18/led"
#define TOPIC_BRIGHTNESS "T18/cerah"
//#define TOPIC_DATA "T18/command"
// ===== Konfigurasi sensor DHT =====
#define DHT_PIN 4
#define DHT_TYPE DHT22
DHT dht(DHT_PIN, DHT_TYPE);
// ===== Konfigurasi LED (kontrol dari Klenik) =====
#define LED_PIN 16
WiFiClient espClient;
PubSubClient mqtt(espClient);
unsigned long lastSend = 0;
const long sendInterval = 3000; // kirim tiap 3 detik
void connectWiFi() {
Serial.print("Menghubungkan ke WiFi");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("WiFi terhubung, IP: ");
Serial.println(WiFi.localIP());
}
void mqttCallback(char* topic, byte* payload, unsigned int length) {
char msg[64];
memcpy(msg, payload, length);
msg[length] = '\0';
String topicStr = String(topic);
String message = String(msg);
Serial.print("Pesan masuk [");
Serial.print(topicStr);
Serial.print("]: ");
Serial.println(message);
if (topicStr == TOPIC_LED) {
if (message == "ON" || message == "1") {
digitalWrite(LED_PIN, HIGH);
Serial.println("LED ON (dari Klenik)");
} else {
digitalWrite(LED_PIN, LOW);
Serial.println("LED OFF (dari Klenik)");
}
}
if (topicStr == TOPIC_BRIGHTNESS) {
int brightness = message.toInt();
analogWrite(LED_PIN, brightness);
Serial.print("Brightness: ");
Serial.println(brightness);
}
/*if (topiStr == TOPIC_DATA){
if (message == "ON" || message == "1") {
digitalWrite(LED_PIN, HIGH);
Serial.println("Reset");
} else {
digitalWrite(LED_PIN, LOW);
Serial.println("LED OFF (dari Klenik)");
}*/
}
void reconnectMQTT() {
while (!mqtt.connected()) {
Serial.print("Menghubungkan ke broker MQTT...");
// ID client harus unik juga, tambahkan random supaya tidak bentrok
String clientId = "ESP32Client-T18" + String(random(0xffff), HEX);
if (mqtt.connect(clientId.c_str())) {
Serial.println("terhubung!");
mqtt.subscribe(TOPIC_LED);
mqtt.subscribe(TOPIC_BRIGHTNESS);
//mqtt.subscribe(TOPIC_DATA);
} else {
Serial.print("gagal, rc=");
Serial.print(mqtt.state());
Serial.println(" coba lagi dalam 5 detik");
delay(5000);
}
}
}
void sendTelemetry() {
float t = dht.readTemperature();
float h = dht.readHumidity();
if (isnan(t) || isnan(h)) {
Serial.println("Gagal membaca sensor DHT!");
return;
}
// Kirim angka biasa (format mqtt.publish(TOPICpaling simpel, dibaca langsung oleh Klenik)
mqtt.publish(TOPIC_TELEMETRY, String(t, 1).c_str());
mqtt.publish(TOPIC_TELEMETRY1, String(h, 1).c_str());
Serial.print("Terkirim -> ");
Serial.print(TOPIC_TELEMETRY);
Serial.print(" : ");
Serial.println(t, 1);
Serial.print("Terkirim -> ");
Serial.print(TOPIC_TELEMETRY1);
Serial.print(" : ");
Serial.println(h, 1);
}
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
dht.begin();
connectWiFi();
mqtt.setServer(MQTT_SERVER, MQTT_PORT);
mqtt.setCallback(mqttCallback);
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
connectWiFi();
}
if (!mqtt.connected()) {
reconnectMQTT();
}
mqtt.loop();
unsigned long now = millis();
if (now - lastSend > sendInterval) {
lastSend = now;
sendTelemetry();
}
}