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 16x2. Baca Cara Menampilkan Data Sensor pada LCD I2C 16x2 Di Sini >>> | Daftar Isi Alat dan Bahan Topologi Implementasi Hasil Akhir Kesimpulan Frequently Asked Questions https://youtu.be/eNWjJ4HU-Ds?si=Pl3KZs_vCw1ljuVyTonton Video Tutorialnya Di Sini!!! | Alat dan Bahan Arduino IDE Link Download >>> MQTTX Link Download >>> ESP 32 Link Pembelian >>> |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 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 #include #include #include #include #include #include //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: %.1fn", 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: %.1fn", 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.