Pendahuluan
Di artikel sebelumnya kita sudah membuat Web Server ESP32 untuk monitoring sensor DHT22 lewat browser. Itu bagus untuk akses lokal, tapi di dunia IoT nyata, banyak perangkat perlu mengirim data ke satu sistem pusat — tanpa saling tahu IP masing-masing.
Di sinilah protokol MQTT (Message Queuing Telemetry Transport) berperan. MQTT adalah standar de facto untuk komunikasi IoT: ringan, cepat, dan cocok untuk ESP32 yang mengirim data sensor secara berkala.
Dalam tutorial ini, kamu akan belajar konsep dasar MQTT dan membuat ESP32 mem-publish data suhu & kelembaban DHT22 ke broker MQTT publik.
Apa itu MQTT?
MQTT menggunakan pola publish/subscribe (pub/sub):
Publisher — perangkat yang mengirim data (ESP32 kamu)
Subscriber — perangkat/aplikasi yang menerima data (HP, server, Home Assistant)
Broker — server perantara yang meneruskan pesan berdasarkan topic
Topic — "alamat" pesan, misalnya
kodingindonesia/esp32/suhu
ESP32 tidak perlu tahu siapa yang membaca datanya. Cukup publish ke topic tertentu — broker yang mengurus sisanya.
Analogi sederhana: MQTT seperti grup WhatsApp. ESP32 mengirim pesan ke grup (topic), siapa saja yang ada di grup (subscriber) bisa membaca — tanpa perlu chat langsung ke setiap orang.
MQTT vs HTTP — Kapan Pakai Apa?
| Aspek | HTTP | MQTT |
|---|---|---|
| Model | Request–Response | Publish–Subscribe |
| Ukuran header | Lebih besar | Sangat ringan |
| Koneksi | Buka–tutup tiap request | Persistent (tetap terhubung) |
| Cocok untuk | API web, upload file | Sensor IoT, telemetry real-time |
Yang Kamu Butuhkan
ESP32 DevKit + sensor DHT22 (wiring sama seperti tutorial sebelumnya)
Arduino IDE dengan board ESP32 terinstall
Koneksi WiFi
Aplikasi subscriber MQTT (opsional): MQTT Explorer di laptop, atau app MQTT Client di HP
Prasyarat: Sudah paham koneksi WiFi ESP32 dan cara membaca sensor DHT22. Jika belum, baca artikel Menghubungkan ESP32 ke WiFi dan Membaca Sensor DHT22 terlebih dahulu. Disarankan juga sudah membaca Web Server ESP32 + DHT22.
Install Library
Install library berikut lewat Arduino IDE → Sketch → Include Library → Manage Libraries:
PubSubClient — oleh Nick O'Leary (client MQTT untuk Arduino/ESP32)
DHT sensor library — oleh Adafruit (+ Adafruit Unified Sensor)
Broker MQTT untuk Latihan — Eclipse Mosquitto
Untuk tutorial ini kita memakai test server resmi dari proyek Eclipse Mosquitto — broker MQTT open source yang populer di dunia IoT:
Host:
test.mosquitto.orgPort:
1883(MQTT plain, tanpa TLS)Autentikasi: tidak perlu username/password
Penting — broker bukan website:
test.mosquitto.orgadalah server MQTT, bukan halaman web. Jika kamu ketik alamat itu di browser Chrome/Firefox, akan muncul error — itu normal. MQTT berjalan di port 1883, bukan port 80/443. ESP32 dan MQTT Explorer yang terhubung ke broker, bukan browser biasa.
Keamanan: Broker publik hanya untuk belajar dan uji coba. Jangan kirim data sensitif. Untuk production, install Mosquitto sendiri di Raspberry Pi/VPS (lihat mosquitto.org/download) dengan autentikasi username/password.
Kode Program: ESP32 + DHT22 + MQTT
Ganti ssid dan password WiFi kamu, lalu upload ke ESP32:
#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
// ── WiFi ──────────────────────────────────────────────
const char* ssid = "NamaWiFiKamu";
const char* password = "PasswordWiFiKamu";
// ── MQTT Broker ───────────────────────────────────────
const char* mqttServer = "test.mosquitto.org";
const int mqttPort = 1883;
const char* mqttTopic = "kodingindonesia/esp32/dht22";
// ── DHT22 ───────────────────────────────────────────
#define DHT_PIN 4
#define DHT_TYPE DHT22
DHT dht(DHT_PIN, DHT_TYPE);
WiFiClient espClient;
PubSubClient mqttClient(espClient);
unsigned long waktuKirimTerakhir = 0;
const unsigned long intervalKirim = 5000; // kirim setiap 5 detik
void koneksiWiFi() {
Serial.print("Menghubungkan ke WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi terhubung!");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}
void koneksiMQTT() {
mqttClient.setServer(mqttServer, mqttPort);
while (!mqttClient.connected()) {
Serial.print("Menghubungkan ke MQTT broker...");
// Client ID unik agar tidak bentrok dengan perangkat lain
String clientId = "ESP32-Kindo-" + String(random(0xffff), HEX);
if (mqttClient.connect(clientId.c_str())) {
Serial.println(" terhubung!");
} else {
Serial.print(" gagal, rc=");
Serial.print(mqttClient.state());
Serial.println(" — coba lagi dalam 5 detik");
delay(5000);
}
}
}
void kirimDataSensor() {
float suhu = dht.readTemperature();
float kelembaban = dht.readHumidity();
if (isnan(suhu) || isnan(kelembaban)) {
Serial.println("Gagal membaca DHT22, lewati pengiriman.");
return;
}
// Payload JSON
String payload = "{";
payload += "\"suhu\":" + String(suhu, 2) + ",";
payload += "\"kelembaban\":" + String(kelembaban, 2) + ",";
payload += "\"device\":\"ESP32-001\"";
payload += "}";
if (mqttClient.publish(mqttTopic, payload.c_str())) {
Serial.println("Data terkirim: " + payload);
} else {
Serial.println("Gagal publish ke MQTT!");
}
}
void setup() {
Serial.begin(115200);
randomSeed(micros());
dht.begin();
koneksiWiFi();
koneksiMQTT();
}
void loop() {
// Jaga koneksi MQTT tetap hidup
if (!mqttClient.connected()) {
koneksiMQTT();
}
mqttClient.loop();
// Kirim data sensor secara berkala
if (millis() - waktuKirimTerakhir >= intervalKirim) {
waktuKirimTerakhir = millis();
kirimDataSensor();
}
}Uji Coba: Subscribe ke Topic yang Sama
Setelah ESP32 berjalan, buka Serial Monitor (115200 baud). Kamu harus melihat log Data terkirim: {...} setiap 5 detik.
Sekarang subscribe ke topic yang sama untuk melihat data masuk:
Opsi 1 — MQTT Explorer (Laptop, disarankan)
Download MQTT Explorer
Buat koneksi baru: Host
test.mosquitto.org, Port1883Connect → cari topic
kodingindonesia/esp32/dht22Kamu akan melihat JSON suhu & kelembaban update setiap 5 detik
Opsi 2 — mosquitto_sub (Terminal)
mosquitto_sub -h test.mosquitto.org -t "kodingindonesia/esp32/dht22" -vPerintah mosquitto_sub adalah tool CLI dari paket Mosquitto — tersedia di Linux, Mac, dan Windows setelah install Mosquitto.
Memahami Struktur Topic
Topic MQTT menggunakan hierarki seperti folder:
kodingindonesia/esp32/dht22
└── organisasi / perangkat / jenis-dataBest practice penamaan topic:
Gunakan huruf kecil dan slash
/sebagai pemisahJangan mulai dengan
$— reserved untuk sistem brokerGunakan wildcard saat subscribe:
kodingindonesia/#(semua sub-topic)
QoS (Quality of Service)
MQTT punya 3 level QoS yang menentukan jaminan pengiriman:
QoS 0 — kirim sekali, tanpa konfirmasi (paling ringan, default PubSubClient)
QoS 1 — minimal sekali sampai (ada ACK)
QoS 2 — tepat sekali sampai (paling andal, paling berat)
Untuk data sensor suhu yang dikirim tiap 5 detik, QoS 0 sudah cukup — jika satu paket hilang, paket berikutnya segera menyusul.
Tips & Troubleshooting
rc=-2 saat connect: Broker tidak terjangkau. Cek koneksi internet WiFi.
rc=4 (bad credentials): Broker butuh username/password —
test.mosquitto.orgport 1883 tidak perlu auth.Broker tidak bisa dibuka di browser: Normal. Pakai MQTT Explorer atau ESP32, bukan Chrome.
Data tidak muncul di subscriber: Pastikan topic sama persis, case-sensitive.
ESP32 reconnect terus: Client ID bentrok — kode di atas sudah pakai ID random.
Nilai suhu NaN: Cek wiring DHT22 dan resistor pull-up 10kΩ.
PubSubClient buffer kecil: Jika payload panjang, tambahkan
mqttClient.setBufferSize(512);disetup().
Gabungkan dengan Web Server (Artikel Sebelumnya)
MQTT dan Web Server bisa jalan bersamaan di ESP32:
Web Server → monitoring lokal via browser di rumah
MQTT → kirim data ke cloud/dashboard/Home Assistant
Keduanya komplementer — bukan pengganti satu sama lain.
Langkah Selanjutnya
Subscribe MQTT di Home Assistant untuk smart home dashboard
Setup broker Mosquitto pribadi di Raspberry Pi atau VPS
Tambahkan relay dan subscribe ke topic kontrol untuk nyalakan/matikan lampu
Simpan data ke database via subscriber Node.js atau Python di server
Pelajari MQTT over TLS (port 8883) untuk koneksi aman
Pro tip: Ubah topic menjadi unik untuk kamu, misalnya
kodingindonesia/anton/esp32/dht22, agar tidak bentrok dengan peserta tutorial lain yang memakai topic yang sama di broker publik.