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
|Topologi
| Implementasi
Bagian ini merupakan langkah-langkah untuk upload kode program dan menjalankan di MQTT
> Arduino IDE
#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
}
> MQTT
| 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
Web Dashboard IoT
Monitoring data real-time & modern.
- ✔ Real-time
- ✔ UI modern
- ✔ Aman & scalable
Sertifikasi IoT BNSP
Upgrade skill + sertifikat resmi.
- ✔ Sertifikasi BNSP
- ✔ Praktik langsung
- ✔ Untuk profesional
| FAQ (Frequently Asked Questions)
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.
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.
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.