#include <Arduino.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include "DHT.h"
// --- Kredensial Jaringan & MQTT ---
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_broker = "bb34e537503640d8be5c558a750405ce.s1.eu.hivemq.cloud";
const int mqtt_port = 8883;
const char* mqtt_username = "jaws123";
const char* mqtt_password = "Jaws1234";
// Topic diubah agar relevan dengan sensor DHT22
const char* topic_publish_dht = "esp32/dht22_sensor";
// --- Konfigurasi Sensor DHT22 ---
const int dht_pin = 19;
#define DHTTYPE DHT22
DHT dht(dht_pin, DHTTYPE);
// --- Pembuatan Instance ---
WiFiClientSecure wifiClient;
PubSubClient mqttClient(wifiClient);
// --- Variabel Timer Non-Blocking ---
unsigned long previous_time = 0;
unsigned long lastReconnectAttempt = 0;
const unsigned long PUBLISH_INTERVAL = 10000; // Konsisten: 10 detik
void setup() {
Serial.begin(115200);
// Inisialisasi Sensor DHT
dht.begin();
// Inisialisasi Wi-Fi
Serial.print("Connecting to Wi-Fi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to Wi-Fi");
// Konfigurasi Klien Secure (Peringatan: Hindari setInsecure untuk tahap produksi)
wifiClient.setInsecure();
mqttClient.setServer(mqtt_broker, mqtt_port);
}
// Fungsi Reconnect Non-Blocking
boolean reconnect() {
String clientId = "ESP32Client-" + String(random(0xffff), HEX);
if (mqttClient.connect(clientId.c_str(), mqtt_username, mqtt_password)) {
Serial.println("Connected to MQTT Broker.");
return true;
}
Serial.print("Failed, rc=");
Serial.println(mqttClient.state());
return false;
}
void loop() {
// 1. Manajamen Koneksi MQTT (Non-Blocking)
if (!mqttClient.connected()) {
unsigned long now = millis();
if (now - lastReconnectAttempt > 5000) { // Coba koneksi ulang tiap 5 detik
lastReconnectAttempt = now;
Serial.println("Attempting MQTT connection...");
if (reconnect()) {
lastReconnectAttempt = 0;
}
}
return; // Cegah pembacaan sensor jika MQTT terputus untuk menghemat resource
}
mqttClient.loop(); // Pertahankan aktivitas koneksi (Keep-Alive)
// 2. Logika Pembacaan dan Publikasi (Non-Blocking)
unsigned long now = millis();
if (now - previous_time >= PUBLISH_INTERVAL) {
previous_time = now;
// Membaca kelembaban dan suhu dalam Celcius
float h = dht.readHumidity();
float t = dht.readTemperature();
// Validasi kebenaran data (mencegah NaN terkirim jika sensor gagal/kabel terputus)
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Menyusun data dalam format JSON
String payload = "{\"temperature\": " + String(t, 2) + ", \"humidity\": " + String(h, 2) + "}";
// Publikasi data ke MQTT broker
Serial.print("Publishing to ");
Serial.print(topic_publish_dht);
Serial.print(" | Payload: ");
Serial.println(payload);
mqttClient.publish(topic_publish_dht, payload.c_str());
}
}