Menampilkan Data Sensor XY-MD02 pada LCD I2C 16x2 Metode Daisy Chain

Tutorial ini fokus pada implementasi pembacaan sensor industri XY-MD02 menggunakan ESP32 dan Modul MAX485 sebagai konverter TTL ke RS-485. Hasil pembacaan suhu dan kelembapan akan ditampilkan secara real-time melalui LCD I2C 16×2. Dengan menggunakan protokol Modbus RTU, sistem ini menawarkan stabilitas transmisi data yang tinggi untuk pemantauan lingkungan.

Tonton Video Tutorial Untuk Menampilkan Data Sensor XY-MD02 pada LCD I2C 16×2 Metode Wiring Daisy Chain

| Alat dan Bahan

Arduino IDE

2 Buah Sensor XY- MD02

MAX485 TTL to RS-485 Converter

Female Jack DC

Power Adaptor

Breadboard

Kabel Jumper

Kabel USB

LCD I2C 16x2

| Design Wiring

| Implementasi

Berikut langkah-langkah untuk Wiring dan Upload Kode Program :

> Hardware

  • Tancapkan Max TTL to RS-485 ke Breadboard.
  • Solder pada bagian DE dan RE di Max TTL to RS-485 karena nanti keduanya akan sama-sama dihubungkan dengan pin D4 di ESP-32.
  • Hubungkan GND pada Max TTL to RS485 dengan GND pada ESP-32.
  • Hubungkan juga VCC pada Max TTL to RS485 dengan VCC pada ESP-32.
  • Hubungkan DI pada Max TTL to RS485 ke pin D19 pada ESP-32.
  • Pin DE dan RE pada MAX TTL to RS-485 dihubungkan dengan D4 pada ESP-32. Karena pin DE dan RE sebelumnya sudah di solder maka bisa ditancapkan pada breadboard yang sejajar dengan salah satu pin DE atau RE.
  • Untuk PIN RO pada MAX TTL to RS-485 hubungkan dengan pin D18 pada ESP-32.
  • Siapkan kabel jumper dengan ujung di kupas dan ujung lainnya Male. Hubungkan kedua kabel pada tembaga yang sudah dikupas tadi agar menjadi satu dengan jumlah 4 buah
  • Kabel pertama tancapkan terminal blok sensor 1 pada kode B dan hubungkan ke terminal blok sensor 2 pada kode B.
  • Selanjutnya tancapkan terminal blok sensor 1 pada kode A dan hubungkan ke terminal blok sensor 2 pada kode A.
  • Hubungkan juga terminal blok sensor 1 kode (-) dengan terminal blok sensor 2 kode (-). Sisi kabel lainnya tancapkan pada blok kode (-) pada Female Jack DC.
  • Untuk terminal blok sensor 2 kode (+) juga hubungkan dengan terminal blok sensor 2 kode (+). Sisi yang lain juga dihubungkan dengan blok kode (+) pada Female Jack DC.
  • Untuk kabel Jumper dari Metode Daisy Chain Sensor terminal blok A dan terminal blok B hubungkan ke pin A dan B pada MAX TTL to RS-485. Untuk Pin A dihubungkan dengan terminal blok A pada Sensor dan Pin B hubungkan dengan terminal blok B pada sensor jadi, A --> A dan B --> B.
  • Selanjutnya kita akan menghubungkan LCD I2C 16x2 ke ESP-32, Pin GND pada LCD akan kita hubungkan ke pin GND pada ESP 32. Dan pin VCC pada LCD kita akan hubungkan dengan pin 3,3V pada ESP-32.
  • Kemudian Pin SDA pada LCD dihubungkan pin D21 pada ESP-32 dan pin SCL pada LCD dihubungkan dengan pin D22 pada ESP-32.
  • Pastikan semua komponen terpasang dengan benar (tanda indikator lampu menyala berarti komponen sudah aktif).
  • > Software

  • Buka Aplikasi Arduino IDE
  • Pilih Board ESP32 Dev Module dan pilih port yang sesuai pada Arduino IDE
  • Menginstall Board ESP32 dengan buka File > Preferences.
  • Tambahkan URL : https://dl.espressif.com/dl/package_esp32_index.json di Additional Boards Manager URLs.
  • Klik Tools > Board > Board Manager, cari ESP32 kemudian Install.
  • Install Library Modbus Master dengan klik Sketch > Include Library > Manage Libraries Cari ModbusMaster dan klik Install.
  • Install Library Liquid Crystal I2C dengan klik Sketch > Include Library > Manage Libraries Cari LiquidCrystal I2C dan klik Install.
  • Salin kode program berikut dan tempelkan pada sketch di Arduino IDE.
  • ➕➕
    filename.cpp
    #include <ModbusMaster.h>
    #include <Wire.h> 
    #include <LiquidCrystal_I2C.h>
    
    #define MODBUS_EN_PIN  4 // DE dan RE pin
    #define MODBUS_RO_PIN 18 // RO pin  
    #define MODBUS_DI_PIN 19 // DI pin 
    #define MODBUS_SERIAL_BAUD 9600 // Baud rate MODBUS
    #define MODBUS_PARITY SERIAL_8N1 // Parity Modbus
    
    #define MODBUS_ADDRESS 0x0001 // Alamat register data XY-MD02
    #define MODBUS_QUANTITY 2 // Jumlah data yang diambil (Temp & Hum)
    
    ModbusMaster modbus;
    LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C umum 0x27
    
    // 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);
    }
    
    void setup()
    {
      Serial.begin(115200);
      
      // Inisialisasi LCD
      lcd.init();
      lcd.backlight();
    
      pinMode(MODBUS_EN_PIN, OUTPUT);
      digitalWrite(MODBUS_EN_PIN, LOW);
    
      // Setup Serial2 untuk Modbus
      Serial2.begin(MODBUS_SERIAL_BAUD, MODBUS_PARITY, MODBUS_RO_PIN, MODBUS_DI_PIN);
      Serial2.setTimeout(1000);
      
      modbus.preTransmission(modbusPreTransmission);
      modbus.postTransmission(modbusPostTransmission);
    
      delay(2000);
      lcd.clear();
    }
    
    void loop()
    {
      int pooling;
      int hasil[2];
      float temperature;
      float humidity;
    
      // PEMBACAAN SENSOR 1 (SLAVE ID 1)
    
      modbus.begin(1, Serial2); 
      pooling = modbus.readInputRegisters(MODBUS_ADDRESS, MODBUS_QUANTITY);
      
      lcd.setCursor(0, 0); 
      if (pooling == modbus.ku8MBSuccess) {
        hasil[0] = modbus.getResponseBuffer(0x00);
        hasil[1] = modbus.getResponseBuffer(0x01);
    
        temperature = hasil[0] / 10.0f; // Menggunakan 10.0f agar hasil desimal
        humidity = hasil[1] / 10.0f;
    
        // Tampilan Serial
        Serial.println("Sensor 1 Success");
        Serial.printf("T: %.1f, H: %.1f\n", temperature, humidity);
        
        // Tampilan LCD - Variabel dimasukkan di akhir printf
        lcd.printf("T1=%.1f H1=%2.1f%", temperature, humidity);
      }
      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)
      modbus.begin(2, Serial2); 
      pooling = modbus.readInputRegisters(MODBUS_ADDRESS, MODBUS_QUANTITY);
      
      lcd.setCursor(0, 1); 
      if (pooling == modbus.ku8MBSuccess) {
        hasil[0] = modbus.getResponseBuffer(0x00);
        hasil[1] = modbus.getResponseBuffer(0x01);
    
        temperature = hasil[0] / 10.0f;
        humidity = hasil[1] / 10.0f;
    
        // Tampilan Serial
        Serial.println("Sensor 2 Success");
        Serial.printf("T: %.1f, H: %.1f\n", temperature, humidity);
        
        // Tampilan LCD - Variabel dimasukkan di akhir printf
        lcd.printf("T2=%.1f H2=%.1f%", temperature, humidity);
      }
      else {
        Serial.println("Sensor 2 GAGAL membaca data");
        lcd.print("T2= -- | H2= -- ");
      }
    
      Serial.println("Berhasil Membaca Data");
      delay(1000); // Interval update data
    }

  • Verifikasi kode program dengan cara klik tombol Verify()untuk memeriksa kesalahan pada program sebelum di upload.
  • Upload program dengan klik tombol Upload(-->).
  • Apabila saaat proses upload terus menerus muncul Connecting...... Tekan tombol Boot pada ESP32 dan proses uploaddapat berjalan kembali.
  • | Hasil Akhir

    Hasil akhirnya kan menampilkan Temperature dan Humidity kedua Sensor pada LCD I2C 16×2.

    | Kesimpulan

    Dengan memahami konsep Daisy Chain dan pengaturan Slave ID yang tepat, Anda dapat memperluas sistem monitoring ini ke banyak sensor tanpa perlu menambah kabel komunikasi baru ke ESP32. Penggunaan LCD I2C memastikan data dari seluruh sensor dapat dipantau dengan praktis di lokasi.

    | FAQ (Frequently Asked Questions)

    Apa yang terjadi jika dua sensor dalam satu jalur memiliki Slave ID yang sama?

    Jika dua sensor atau lebih memiliki Slave ID yang sama, maka akan terjadi tabrakan data. ESP32 tidak akan bisa membaca data dari sensor manapun karena kedua sensor mencoba merespons perintah di waktu yang bersamaan.

    Bagaimana jika saya ingin menambah sensor ketiga atau keempat?

    Cukup memparalelkan kabel A+ dan B- ke sensor baru tambahan. Pastikan untuk mengatur sensor baru tersebut ke Slave ID 3, Slave ID 4, dan seterusnya, serta memastikan total beban tidak melebihi kapasitas bus RS-485 biasanya hingga 32 perangkat.

    Mengapa data suhu dan kelembapan di LCD tidak update?

    Masalah ini biasanya terletak pada polling rate atau jeda waktu pembacaan di dalam kode program. Pastikan untuk memberikan delay yang cukup, minimal 1-2 detik di antara pembacaan Sensor 1 dan Sensor 2 agar modul RS-485 memiliki waktu untuk memproses antrean data.