Cara Menghubungkan MQTT Publisher ke Broker MQTT dengan Mudah (Lengkap & Praktis)

Pada artikel ini, akan dibahas bagaimana mengimplementasikan sistem pembacaan data dari dua sensor suhu dan kelembapan menggunakan ESP32, kemudian mengirimkan data tersebut ke broker MQTT dalam format JSON. Selain itu, data yang dikirim juga akan ditampilkan secara langsung melalui aplikasi MQTT client sehingga memudahkan proses monitoring.

Dengan mengikuti langkah-langkah yang dijelaskan, diharapkan pembaca dapat memahami alur komunikasi dari pembacaan sensor hingga pengiriman data secara real-time, serta mampu mengembangkan sistem monitoring berbasis IoT secara mandiri.

Sebelumnya baca terlebih dahulu cara menampilkan data sensor pada LCD I2C 16×2.

Tonton Video Tutorialnya Di Sini!!!

| Alat dan Bahan

Arduino IDE

Link Download >>>

MQTTX

Link Download >>>

|Topologi

| Implementasi

Bagian ini merupakan langkah-langkah untuk upload kode program dan menjalankan di MQTT

> Arduino IDE

  • Buka aplikasi Arduino IDE
  • Pilih Board dan juga Port yang sesuai
  • Install Library PubSubClient dan juga ArduinoJson dengan klik pada Sketch>>Include Library>>Manage Libraries
  • Upload kode program dibawah ini
  • ➕➕
    arduino_mqtt.cpp
    #include <WiFi.h>
    #include <PubSubClient.h>
    #include <ArduinoJson.h>
    #include <ModbusMaster.h>
    #include <Wire.h> 
    #include <LiquidCrystal_I2C.h>
    
    //Konfigurasi WiFi dan MQTT
    const char* ssid = "SSID WiFi Kalian";
    const char* password = "Password WiFi Kalian";
    const char* mqtt_server = "broker.emqx.io";
    const char* TOPIC_JSON = "edutic/modbus/data";
    
    //Konfigurasi PIN
    #define MODBUS_EN_PIN  4 // DE dan RE pin
    #define MODBUS_RO_PIN 18 // RO pin  
    #define MODBUS_DI_PIN 19 // DI pin 
    #define LED_PIN 2
    
    //Konfigurasi Modbus
    #define MODBUS_SERIAL_BAUD 9600 // Baud rate MODBUS
    #define MODBUS_PARITY SERIAL_8N1 // Parity Modbus
    #define MODBUS_ADDRESS 0x0001 // Alamat register data XY-MD02 (hexadesimal)
    #define MODBUS_QUANTITY 2 // Jumlah data yang diambil (Temp & Hum)
    
    //Inisialisasi Objek
    WiFiClient espClient;
    PubSubClient mqtt(espClient);
    ModbusMaster modbus1;
    ModbusMaster modbus2;
    LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C umum 0x27
    
    //Variabel Global Data Sensor
    float temp1, hum1, temp2, hum2;
    unsigned long prevMillis = 0;
    const int intervalPengiriman = 5000;
    
    // Fungsi Kontrol Transmisi RS485
    void modbusPreTransmission()
    {
      // Delay dikurangi agar tidak menyebabkan timeout
      delay(10);
      digitalWrite(MODBUS_EN_PIN, HIGH);
    }
    
    void modbusPostTransmission()
    {
      digitalWrite(MODBUS_EN_PIN, LOW);
      delay(10);
    }
    
    //Fungsi Koneksi Wifi
    void setup_wifi() {
      delay(10);
      Serial.print("\nConnecting to ");
      Serial.println(ssid);
      WiFi.mode(WIFI_STA);
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      Serial.println("\nWiFi Terhubung");
    }
    
    //Fungsi Reconnect MQTT
    void reconnect() {
      while (!mqtt.connected()) {
        Serial.print("Attempting MQTT connection...");
        String clientId = "ESP32-Modbus-";
        clientId += String(random(0xffff), HEX);
        if (mqtt.connect(clientId.c_str())) {
          Serial.println("connected!");
        } else {
          Serial.print("failed, rc=");
          Serial.print(mqtt.state());
          Serial.println(" try again in 5 seconds");
          delay(5000);
        }
      }
    }
    
    
    void setup()
    {
      Serial.begin(115200);
      
      // Inisialisasi LCD
      lcd.init();
      lcd.backlight();
    
      pinMode(LED_PIN, OUTPUT);
      pinMode(MODBUS_EN_PIN, OUTPUT);
      digitalWrite(MODBUS_EN_PIN, LOW);
    
      setup_wifi();
    
      // Setup Serial2 untuk Modbus
      Serial2.begin(MODBUS_SERIAL_BAUD, MODBUS_PARITY, MODBUS_RO_PIN, MODBUS_DI_PIN);
      Serial2.setTimeout(1000);
      
      modbus1.preTransmission(modbusPreTransmission);
      modbus2.preTransmission(modbusPreTransmission);
      modbus1.postTransmission(modbusPostTransmission);
      modbus2.postTransmission(modbusPostTransmission);
      modbus1.begin(1, Serial2);
      modbus2.begin(2, Serial2);
    
      //Setup MQTT
      mqtt.setServer(mqtt_server, 1883);
    
      delay(2000);
      lcd.clear();
    }
    
    void loop() {
      if (!mqtt.connected()) {
        reconnect();
      }
      mqtt.loop();
    
      // Non-blocking timer untuk pembacaan dan pengiriman data
      if (millis() - prevMillis >= intervalPengiriman) {
        uint8_t result;
    
      int pooling;
      int hasil[2];
      float temperature;
      float humidity;
    
      // PEMBACAAN SENSOR 1 (SLAVE ID 1)
    
    
      pooling = modbus1.readInputRegisters(MODBUS_ADDRESS, MODBUS_QUANTITY);
      
      lcd.setCursor(0, 0); 
      if (pooling == modbus1.ku8MBSuccess) {
        hasil[0] = modbus1.getResponseBuffer(0x00);
        hasil[1] = modbus1.getResponseBuffer(0x01);
    
        temp1 = hasil[0] / 10.0f; // Menggunakan 10.0f agar hasil desimal
        hum1 = hasil[1] / 10.0f;
    
        // Tampilan Serial
        Serial.println("Sensor 1 Success");
        Serial.printf("T: %.1f, H: %.1f\n", temp1, hum1);
        
        // Tampilan LCD - Variabel dimasukkan di akhir printf
        lcd.printf("T1=%.1f H1=%2.1f%", temp1, hum1);
      }
      else {
        Serial.println("Sensor 1 GAGAL membaca data");
        lcd.print("T1= -- | H1= -- ");
      }
    
      delay(250); // Jeda antar request agar tidak bentrok
    
      // PEMBACAAN SENSOR 2 (SLAVE ID 2)
      pooling = modbus2.readInputRegisters(MODBUS_ADDRESS, MODBUS_QUANTITY);
      
      lcd.setCursor(0, 1); 
      if (pooling == modbus2.ku8MBSuccess) {
        hasil[0] = modbus2.getResponseBuffer(0x00);
        hasil[1] = modbus2.getResponseBuffer(0x01);
    
        temp2 = hasil[0] / 10.0f;
        hum2 = hasil[1] / 10.0f;
    
        // Tampilan Serial
        Serial.println("Sensor 2 Success");
        Serial.printf("T: %.1f, H: %.1f\n", temp2, hum2);
        
        // Tampilan LCD - Variabel dimasukkan di akhir printf
        lcd.printf("T2=%.1f H2=%.1f%", temp2, hum2);
      }
      else {
        Serial.println("Sensor 2 GAGAL membaca data");
        lcd.print("T2= -- | H2= -- ");
      }
    
      //Kirim Json ke MQTT
      JsonDocument doc;
      doc["id1_temp"] = temp1;
      doc["id1_hum"] = hum1;
      doc["id2_temp"] = temp2;
      doc["id2_hum"] = hum2;
    
      char buffer[256];
        serializeJson(doc, buffer); // Mengonversi JSON ke String agar bisa dikirim
        mqtt.publish(TOPIC_JSON, buffer);
    
        Serial.print("Published: ");
        Serial.println(buffer);
        
        prevMillis = millis();
      }
      delay(1000); // Interval update data
    }
    

  • Tunggu sampai program terupload dan klik pada Serial Monitor dan lihat hasil program yang sudah terupload.
  • > MQTT

  • Buka aplikasi MQTT
  • Tambahkan Connection dengan klik tanda (+).
  • Isi Nama Connection, Alamat Broker, dan juga Port, sesuaikan dengan yang ada pada program di Arduino IDE.
  • Selanjutnya tambahkan Subscription baru dengan klik + New Subscription.
  • Tuliskan topic sesuai yang ada pada program di Arduino IDE dan klik confirm.
  • Hasilnya akan menampilkan data Temperature dan juga Humidity dalam format JSON.
  • | Hasil Akhir

    Hasil akhirnya menunjukkan sistem monitoring IoT berbasis MQTT, di mana data suhu dan kelembapan dari dua sensor dikirim ke broker dan ditampilkan secara real-time di MQTTX.

    | Kesimpulan

    Integrasi Modbus RTU ke MQTT dengan ESP32 memungkinkan monitoring suhu dan kelembapan secara real-time, efisien, dan fleksibel. Sistem ini mampu membaca multi-sensor dalam satu jalur RS485 dan mengirim data dalam format JSON ke broker MQTT untuk berbagai kebutuhan monitoring. Dengan arsitektur yang sederhana namun powerful, solusi ini sangat cocok untuk pengembangan sistem IoT, baik skala pembelajaran maupun industri.

    Kami Siap Bantu Kamu

    Jasa IoT Industri

    Integrasi IoT untuk efisiensi industri.

    • ✔ Solusi custom
    • ✔ Implementasi profesional
    • ✔ Support berkelanjutan
    Konsultasi Gratis

    Web Dashboard IoT

    Monitoring data real-time & modern.

    • ✔ Real-time
    • ✔ UI modern
    • ✔ Aman & scalable
    Hubungi Kami

    Sertifikasi IoT BNSP

    Upgrade skill + sertifikat resmi.

    • ✔ Sertifikasi BNSP
    • ✔ Praktik langsung
    • ✔ Untuk profesional
    Daftar Sekarang

    | FAQ (Frequently Asked Questions)

    Mengapa data dikirim menggunakan MQTT dalam format JSON?

    MQTT digunakan karena ringan dan efisien untuk komunikasi IoT real-time. Format JSON memudahkan data untuk dibaca, diproses, serta diintegrasikan ke berbagai platform seperti dashboard web atau aplikasi monitoring seperti MQTTX.

    Apakah sistem ini bisa membaca lebih dari dua sensor?

    Ya, sistem ini dapat dikembangkan untuk membaca banyak sensor menggunakan metode daisy chain pada RS485. Setiap sensor hanya perlu memiliki alamat slave yang berbeda agar dapat diakses secara bergantian.

    Apakah sistem ini bisa dikembangkan lebih lanjut?

    Tentu saja. Sistem ini sangat fleksibel dan bisa dikembangkan dengan menambahkan dashboard IoT, penyimpanan database (seperti Firebase atau ThingsBoard), serta fitur notifikasi otomatis melalui WhatsApp atau Telegram.