Kirim Data Sensor dari ESP32 ke MQTT Broker (HiveMQ / Mosquitto)

📌 Artikel ini adalah bagian dari seri ESP32 di Industri: Panduan Implementasi IoT untuk Pabrik & Fasilitas Industri — Cluster 3 dari 7. Belum baca cara ESP32 membaca data Modbus? Lihat dulu Cluster 2: ESP32 sebagai Modbus Master.

Di artikel sebelumnya, kita sudah berhasil membuat ESP32 membaca data dari perangkat Modbus RTU. Sekarang saatnya membawa data itu keluar dari jalur serial: dengan ESP32 MQTT, data sensor bisa dikirim secara real-time ke dashboard monitoring, karena MQTT adalah protokol andalan di dunia Industrial IoT.

Artikel ini akan membahas cara kerja ESP32 MQTT secara lengkap: kenapa MQTT jadi standar de facto untuk IoT industri, cara setup broker (baik cloud maupun lokal), dan implementasi lengkap di ESP32.

Kenapa ESP32 MQTT Lebih Unggul Dibanding HTTP untuk Kirim Data Sensor?

Banyak pemula bertanya kenapa tidak langsung pakai HTTP request biasa untuk kirim data. Ada beberapa alasan teknis kenapa MQTT lebih unggul untuk kebutuhan Industrial IoT:

  • Lightweight — overhead protokol MQTT jauh lebih kecil dibanding HTTP, penting untuk device dengan bandwidth terbatas atau koneksi tidak stabil.
  • Publish-subscribe model — satu sensor bisa “publish” data ke banyak “subscriber” sekaligus (dashboard, database, alert system) tanpa perlu tahu siapa saja yang mendengarkan.
  • Quality of Service (QoS) — MQTT punya mekanisme untuk memastikan pesan benar-benar sampai, penting untuk data industri yang tidak boleh hilang begitu saja.
  • Koneksi persisten — device tetap terhubung ke broker, cocok untuk monitoring real-time dibanding HTTP yang request-response per transaksi.

Arsitektur MQTT broker dengan model publish-subscribe untuk ESP32 kirim data sensor

Pilihan Broker MQTT: Cloud vs Lokal

HiveMQ (Cloud)

Cocok untuk Anda yang baru mulai dan belum mau repot setup server sendiri. HiveMQ punya versi gratis (HiveMQ Cloud) yang cukup untuk skala prototyping dan monitoring skala kecil.

Kelebihan: tidak perlu maintenance server, akses dari mana saja, setup cepat. Kekurangan: bergantung koneksi internet ke luar fasilitas, ada batasan jumlah koneksi/data di tier gratis.

Mosquitto (Lokal/Self-hosted)

Broker open-source yang bisa Anda jalankan di Raspberry Pi, mini PC, atau server lokal di fasilitas Anda sendiri.

Kelebihan: data tetap di jaringan lokal (penting untuk fasilitas dengan kebijakan keamanan data ketat), tidak bergantung internet eksternal, gratis sepenuhnya. Kekurangan: perlu maintenance sendiri, butuh perangkat tambahan untuk hosting.

Rekomendasi untuk fasilitas industri: jika data sensor bersifat sensitif atau koneksi internet fasilitas Anda tidak stabil, Mosquitto lokal adalah pilihan lebih aman. Untuk prototyping cepat atau monitoring yang boleh diakses dari luar fasilitas, HiveMQ Cloud lebih praktis.

Yang Anda Butuhkan

  • ESP32 yang sudah bisa membaca data Modbus (lanjutan dari artikel sebelumnya)
  • Akun HiveMQ Cloud (gratis) atau Mosquitto broker yang sudah terinstall
  • Library PubSubClient di Arduino IDE

Instalasi library: Sketch > Include Library > Manage Libraries > cari “PubSubClient” > Install

Contoh Kode: ESP32 Publish Data Sensor ke MQTT

Berikut contoh lengkap yang menggabungkan pembacaan Modbus (dari artikel sebelumnya) dengan pengiriman data via MQTT:

#include <WiFi.h>
#include <PubSubClient.h>
#include <ModbusMaster.h>

// Konfigurasi WiFi
const char* ssid = "NAMA_WIFI_ANDA";
const char* password = "PASSWORD_WIFI_ANDA";

// Konfigurasi MQTT Broker
const char* mqtt_server = "broker.hivemq.com"; // ganti dengan broker Anda
const int mqtt_port = 1883;
const char* mqtt_topic = "bisaioti/sensor/suhu";

WiFiClient espClient;
PubSubClient client(espClient);

#define SLAVE_ID 1
ModbusMaster node;

void setupWiFi() {
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi terhubung");
}

void reconnectMQTT() {
  while (!client.connected()) {
    Serial.print("Menghubungkan ke MQTT broker...");
    if (client.connect("ESP32Client_bisaioti")) {
      Serial.println("terhubung");
    } else {
      Serial.print("gagal, kode error: ");
      Serial.print(client.state());
      delay(2000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  Serial2.begin(9600, SERIAL_8N1, 16, 17); // RX2, TX2 - terhubung ke TX/RX modul TTL-RS485

  node.begin(SLAVE_ID, Serial2);
  // Tidak perlu preTransmission/postTransmission - modul TTL-RS485 auto direction-control

  setupWiFi();
  client.setServer(mqtt_server, mqtt_port);
}

void loop() {
  if (!client.connected()) {
    reconnectMQTT();
  }
  client.loop();

  uint8_t result = node.readHoldingRegisters(0x0000, 1);

  if (result == node.ku8MBSuccess) {
    uint16_t rawValue = node.getResponseBuffer(0);
    float suhu = rawValue / 10.0;

    char payload[10];
    dtostrf(suhu, 4, 1, payload);

    client.publish(mqtt_topic, payload);

    Serial.print("Terkirim ke MQTT: ");
    Serial.println(payload);
  } else {
    Serial.print("Gagal baca Modbus, kode: ");
    Serial.println(result, HEX);
  }

  delay(5000); // kirim data setiap 5 detik
}

Penjelasan Bagian Penting

  • reconnectMQTT() — fungsi ini krusial untuk lingkungan industri di mana koneksi WiFi bisa terputus sewaktu-waktu. Tanpa auto-reconnect, ESP32 Anda akan berhenti mengirim data begitu koneksi putus sekali saja.
  • client.publish(mqtt_topic, payload) — inilah inti dari MQTT, mengirim data ke topic tertentu yang bisa “didengarkan” oleh Node-RED, dashboard, atau subscriber lain.
  • Topic naming (bisaioti/sensor/suhu) — gunakan struktur topic yang konsisten dan hierarkis, misalnya pabrik/area1/mesin2/suhu, supaya mudah di-filter saat jumlah sensor bertambah banyak.

Praktik Terbaik MQTT untuk Lingkungan Industri

  • Gunakan QoS minimal 1 untuk data penting — memastikan pesan minimal terkirim sekali meski ada gangguan jaringan.
  • Set username/password pada broker — jangan biarkan broker MQTT Anda terbuka tanpa autentikasi, terutama jika terhubung ke internet.
  • Gunakan TLS/SSL untuk broker cloud jika data yang dikirim bersifat sensitif (port 8883 alih-alih 1883).
  • Buat struktur topic yang scalable sejak awal — perubahan struktur topic setelah banyak device terpasang akan merepotkan.
  • Monitor status koneksi — tambahkan Last Will and Testament (LWT) di MQTT supaya sistem tahu kalau ESP32 tiba-tiba offline.

Langkah Selanjutnya

Data sensor yang sudah terkirim ke MQTT broker baru berguna kalau Anda punya cara untuk memvisualisasikan dan menyimpannya secara historis. Di artikel berikutnya, kita akan menghubungkan data MQTT ini ke Node-RED sebagai orchestrator dan InfluxDB sebagai database time-series, lalu menampilkannya dalam dashboard monitoring yang bisa Anda pantau kapan saja.

Sambil menunggu, Anda juga bisa lihat pendekatan dashboard alternatif (Modbus RTU langsung ke Node-RED tanpa MQTT) di Integrasi Modbus RTU ke Node-RED: Step by Step.

📌 Call to Action

Belum punya data sensor untuk dikirim? Mulai dari sini: Dapatkan modul konverter 4-20mA to Modbus RTU untuk sensor industri Anda → tokopedia.com/bisaioti

Ingin belajar membangun sistem monitoring lengkap dari sensor sampai dashboard? Ikuti kelas “Dari Sensor Industri ke Dashboard: Baca Data 4-20mA via Modbus RTU” → bisaioti.com/lab