Komunikasi Modbus RTU Menggunakan Raspberry Pi sebagai Master dan Sensor Suhu dan Kelembaban sebagai Slave

Tujuan

  1. Memahami konsep komunikasi Modbus RTU dengan Raspberry Pi sebagai master dan sensor sebagai slave.
  2. Mampu mengintegrasikan sensor SHT20 dengan Raspberry Pi melalui protokol Modbus RTU.
  3. Menggunakan USB to RS485 untuk komunikasi antara master dan slave.

Alat dan Bahan

  1. Hardware:
    • Raspberry Pi (dengan Raspberry Pi OS terinstal).
    • USB to RS485 Converter.
    • Sensor SHT20 (Modbus RTU ready).
    • Kabel RS485.
    • Breadboard dan jumper kabel (opsional).
  2. Software:
    • Python 3.
    • Library pymodbus untuk Python.
    • Terminal emulator (misalnya, minicom atau Putty).
    • Datasheet sensor SHT20 untuk konfigurasi register.

Dasar Teori

  1. Modbus RTU: Protokol komunikasi serial berbasis master-slave. Master (Raspberry Pi) akan mengirim permintaan data dan slave (SHT20) akan merespons.
  2. Sensor SHT20: Sensor ini mendukung protokol Modbus RTU untuk membaca suhu dan kelembapan melalui register tertentu.
  3. RS485: Menggunakan dua kabel (A+ dan B-) untuk komunikasi serial jarak jauh dengan daya tahan terhadap gangguan.

Langkah Kerja

SHT20 to Raspberry PI

  • Persiapan Lingkungan
  1. Hubungkan USB to RS485 ke Raspberry Pi.
  2. Sambungkan kabel RS485 ke sensor SHT20 dengan pin A(+) dan B(-).
  3. Pastikan Raspberry Pi dinyalakan dan login ke terminal.
  • Instalasi Library Python
    • Update dan install Python serta pip:
sudo apt update

sudo apt install python3 python3-pip -y
    • Install library pymodbus:
sudo apt install python3-venv -y
python3 -m venv ~/modbus-env
source ~/modbus-env/bin/activate
pip install "pymodbus[serial]==3.6.9"

Raspberry Pi OS versi terbaru (Bookworm) menolak pip3 install langsung ke sistem dengan pesan externally-managed-environment. Karena itu library dipasang di virtual environment. Setiap kali membuka terminal baru, aktifkan lagi dengan source ~/modbus-env/bin/activate sebelum menjalankan program.

  • Konfigurasi Port Serial
    • Pastikan USB to RS485 terdeteksi:
ls /dev/ttyUSB*

Catat nama port (contoh: /dev/ttyUSB0).
    • Tambahkan pengguna ke grup dialout:
sudo usermod -a -G dialout $USER
  • Konfigurasi Sensor SHT20
  1. Pastikan ID slave, baudrate, parity, dan stopbits pada sensor sudah sesuai (lihat datasheet sensor).
  2. Konfigurasikan register sesuai tabel berikut:
    • Address Suhu: Misalnya, 0x0001.
    • Address Kelembapan: Misalnya, 0x0002.
  • Program Python untuk Master Modbus RTU
    • Buat file Python:
nano modbus_sht20.py
    • Masukkan kode berikut:
from pymodbus.client import ModbusSerialClient
import time

client = ModbusSerialClient(
    port="/dev/ttyUSB0",   # ubah sesuai port Anda
    baudrate=9600,
    bytesize=8,
    parity="N",
    stopbits=1,
    timeout=1,
)

if not client.connect():
    print("Gagal membuka port serial.")
    raise SystemExit(1)
print("Port terbuka, mulai membaca sensor...")

try:
    while True:
        # Baca 2 input register (FC04) mulai alamat 1: suhu dan kelembapan
        rr = client.read_input_registers(1, count=2, slave=1)
        if rr.isError():
            print("Error:", rr)
        else:
            suhu_raw, rh_raw = rr.registers
            if suhu_raw > 32767:          # nilai negatif (signed 16-bit)
                suhu_raw -= 65536
            print(f"Suhu: {suhu_raw / 10:.1f} °C | Kelembapan: {rh_raw / 10:.1f} %RH")
        time.sleep(2)
except KeyboardInterrupt:
    print("\nProgram dihentikan.")
finally:
    client.close()

Catatan versi: kode ini untuk pymodbus 3.6.x. Kode lama (pymodbus.client.sync, method='rtu', unit=1) hanya berjalan di pymodbus 2.x. Pada pymodbus 3.10 ke atas, parameter slave= diganti device_id=.

Simpan file dan keluar.

  • Jalankan Program
    • Jalankan program:
python3 modbus_sht20.py
    • Periksa apakah data suhu dan kelembapan terbaca dengan benar.
  • Troubleshooting
    • Pastikan baudrate, parity, stopbits, dan ID unit pada Raspberry Pi sama dengan konfigurasi sensor SHT20.
    • Gunakan alat monitoring seperti Modbus Poll untuk memverifikasi komunikasi.

Tugas

  1. Modifikasi program untuk membaca data dari beberapa register sekaligus.
  2. Logging data suhu dan kelembapan ke file CSV secara berkala.
  3. Tambahkan visualisasi data menggunakan library seperti Matplotlib.

Kesimpulan

Jelaskan bagaimana Raspberry Pi mengirimkan query Modbus RTU dan menerima data suhu serta kelembapan dari sensor SHT20.

Wiring USB–RS485 ke Sensor

Sensor SHT20 (XY-MD02)Sambung ke
VCC (+)Power supply DC 5–30 V (+), mis. 12 V
GND (−)Power supply (−)
A+A+ / D+ pada converter USB–RS485
B−B− / D− pada converter USB–RS485

Jangan mengambil daya sensor dari pin 5V Raspberry Pi jika jalurnya panjang; gunakan supply terpisah dan satukan ground jika komunikasi tidak stabil.

Membaca Beberapa Sensor dalam Satu Jalur RS485

RS485 bisa menampung banyak perangkat pada dua kabel yang sama (daisy chain). Syaratnya, setiap sensor memiliki slave ID berbeda. Ubah ID sensor kedua lebih dulu (mis. lewat Modbus Poll ke register alamat sesuai manual sensor), lalu baca bergantian:

SENSOR = {1: "Ruang panel", 2: "Gudang"}

for sid, nama in SENSOR.items():
    rr = client.read_input_registers(1, count=2, slave=sid)
    if rr.isError():
        print(f"{nama} (ID {sid}): tidak merespons")
        continue
    suhu, rh = rr.registers
    print(f"{nama}: {suhu / 10:.1f} °C, {rh / 10:.1f} %RH")
    time.sleep(0.1)   # jeda singkat antar-permintaan

Untuk kabel lebih dari beberapa puluh meter, gunakan kabel twisted pair dan pasang resistor terminasi 120 Ω di kedua ujung jalur.

Pembahasan Tugas: Logging ke CSV

Ganti bagian print di dalam loop dengan penulisan ke file CSV:

import csv
from datetime import datetime

with open("log_sht20.csv", "a", newline="") as f:
    csv.writer(f).writerow([datetime.now().isoformat(timespec="seconds"),
                            suhu_raw / 10, rh_raw / 10])

File CSV bisa dibuka di Excel atau dibaca dengan pandas untuk dibuat grafik menggunakan Matplotlib:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("log_sht20.csv", names=["waktu", "suhu", "rh"], parse_dates=["waktu"])
df.plot(x="waktu", y=["suhu", "rh"])
plt.show()

Troubleshooting

GejalaPenyebabSolusi
Permission denied: /dev/ttyUSB0User belum masuk grup dialoutJalankan sudo usermod -a -G dialout $USER, lalu logout/login atau reboot
ModuleNotFoundError: pymodbusVirtual environment belum aktifsource ~/modbus-env/bin/activate
ImportError: pymodbus.client.syncKode versi 2.x dijalankan di pymodbus 3.xGunakan kode yang diperbarui di atas
Modbus Error: No responseA/B terbalik, baud/ID salah, sensor tanpa dayaTukar A dan B, cek 9600 8N1 dan slave ID 1
Port berubah jadi ttyUSB1Converter dicabut-pasangGunakan nama tetap di /dev/serial/by-id/

Baca Juga

Related Articles

Tinggalkan Balasan

Chat Langsung dengan Kami
Staff bisaioti 1 — +62 823-3306-4821 E-Course, Offline Course, Hardware & Teknis IoT/OT Staff bisaioti 2 — +62 823-3306-4821 Training Korporat & Toko Hardware