#include <WiFi.h>
#include <MQTT.h>
#include <DHT.h>
// --- Konfigurasi Anda ---
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.emqx.io"; // emqx, hivemq, mosquitto
const int mqtt_port = 1883;
// --- Pin Konfigurasi ---
#define DHTPIN 4
#define DHTTYPE DHT22
#define LED_PIN 2
// --- Konfigurasi MQTT ---
const char* mqtt_topic_data = "esp32/dht22/data"; // Topik untuk hantar data
const char* mqtt_topic_command = "esp32/button/command"; // Topik untuk terima arahan
const char* mqtt_client_id = "ijam-esp32-dht22-6781";
// --- Pembolehubah JSON Anda ---
String b_nama = "Smart Classroom"; // <-- TETAPKAN NAMA SENSOR ANDA
// --- Pembolehubah Global ---
WiFiClient net;
MQTTClient mqtt;
DHT dht(DHTPIN, DHTTYPE);
unsigned long lastMsg = 0;
const long interval = 5000; // 5 saat
// --- Fungsi Sambungan WiFi (Sama seperti sebelum) ---
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Menyambung ke ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi tersambung");
}
// --- FUNGSI CALLBACK
// Ini dijalankan apabila mesej diterima
void messageReceived(String &topic, String &payload) {
Serial.print("Mesej diterima [");
Serial.print(topic);
Serial.print("] ");
Serial.println(payload);
// Kawal LED & Relay
if (topic == mqtt_topic_command) {
if (payload == "ON") {
digitalWrite(LED_PIN, HIGH);
Serial.println("LED dihidupkan");
} else if (payload == "OFF") {
digitalWrite(LED_PIN, LOW);
Serial.println("LED dimatikan");
}
}
}
// --- Fungsi Sambung Semula MQTT ---
void connectMQTT() {
Serial.print("Menyambung ke MQTT...");
// Gelung sehingga kita disambung semula
while (!mqtt.connect(mqtt_client_id)) {
Serial.print(".");
delay(500);
if (millis() > 30000 && !mqtt.connected()) { // Gagal selepas 30s
Serial.println(" Gagal sambung MQTT. Mulakan semula ESP.");
ESP.restart();
}
}
Serial.println(" disambungkan!");
// Langgan topik arahan
mqtt.subscribe(mqtt_topic_command);
}
// --- Fungsi Persediaan (Setup) ---
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
dht.begin();
setup_wifi(); // Sambung ke WiFi
mqtt.begin(mqtt_server, mqtt_port, net);
// Sediakan pelayan MQTT dan fungsi 'callback'
// mqtt.setHost(mqtt_server, mqtt_port);
mqtt.onMessage(messageReceived); // <-- Cara baru untuk tetapkan 'callback'
}
// --- Fungsi Gelung Utama (Loop) ---
void loop() {
// Pastikan sambungan MQTT sentiasa ada
if (!mqtt.connected()) {
connectMQTT();
}
// mqtt.loop() adalah penting untuk pustaka ini
mqtt.loop();
// Dapatkan masa semasa
unsigned long now = millis();
// Hantar data hanya setiap 5 saat
if (now - lastMsg > interval) {
lastMsg = now;
// Baca sensor
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Gagal membaca dari sensor DHT!");
return;
}
// Tukar float kepada String untuk JSON
String s_data = String(t, 2); // 't' (suhu) dipetakan ke data1
String k_data = String(h, 2); // 'h' (kelembapan) dipetakan ke data2
// ================= PUBLISH TO MQTT (Kod Anda) =================
String jsonData = "{";
jsonData += "\"b_nama\":\"" + b_nama + "\",";
jsonData += "\"data1\":\"" + s_data + "\",";
jsonData += "\"data2\":\"" + k_data + "\"";
jsonData += "}";
Serial.print("\nJSON Payload:");
Serial.println(jsonData);
// Hantar data menggunakan kod anda
// (Topik ditukar kepada mqtt_topic_data)
mqtt.publish(mqtt_topic_data, jsonData);
}
}