[파이썬] SHT30 Modbus 온습도 센서(XY-MD02, SHA9D01 등) RS485 데이지 체인 완벽 가이드
스마트팜, 공장 자동화, 환경 모니터링 시스템에서는 하나의 통신 라인에 여러 개의 센서를 연결하는 멀티 드롭(Multi-drop) 구성이 자주 사용됩니다.
특히 SHT30 기반의 RS485 Modbus 센서(XY-MD02 등)는 가격이 저렴하고 사용이 쉬워 현장에서 매우 많이 사용됩니다.
하지만 단순히 선만 연결하면 통신 충돌, 데이터 깨짐, 응답 없음 등의 문제가 발생할 수 있습니다.
이번 글에서는 다음 내용을 실전 기준으로 정리합니다.
RS485 데이지 체인 결선 원리
Slave ID 설정 방법
종단저항(Termination) 처리
Modbus 레지스터 구조
Python 데이터 수집 예제
현장 구축 시 주의사항
1. RS485 데이지 체인(Daisy Chain)의 원리
RS485는 여러 장치를 하나의 버스(Bus)에 연결하는 통신 방식입니다.
핵심은 모든 장치를 한 줄(Line) 로 연결하는 것입니다.
데이지 체인 방식
PC/USB-RS485 컨버터
│
├── 센서 1
│
├── 센서 2
│
└── 센서 3
실제 배선은 아래처럼 이어집니다.
A(+) : 컨버터 → 센서1 → 센서2 → 센서3
B(-) : 컨버터 → 센서1 → 센서2 → 센서3
GND : 공통 연결
2. 왜 스타(Star) 결선이 위험한가?
초보자가 가장 많이 하는 실수가 바로 스타 결선입니다.
잘못된 스타 결선 예시
┌── 센서1
컨버터 ──────┼── 센서2
└── 센서3
이 방식은 다음 문제를 유발합니다.
신호 반사(Reflection)
Echo 발생
데이터 충돌
CRC 오류 증가
통신 거리 감소
RS485는 기본적으로 하나의 긴 선로를 가정하고 설계된 통신 방식입니다.
따라서 반드시 아래처럼 구성해야 합니다.
올바른 데이지 체인
컨버터 ─ 센서1 ─ 센서2 ─ 센서3
3. 가장 중요한 작업: Slave ID 설정
왜 필요한가?
모든 센서는 공장 출하시 기본적으로 다음 상태입니다.
Slave ID = 1
즉, 여러 개를 바로 연결하면 모두 동시에 응답합니다.
결과:
통신 충돌
데이터 깨짐
응답 불가
따라서 반드시 한 대씩 연결하여 ID를 변경해야 합니다.
4. SHT30 Modbus ID 설정 방법
Slave ID 저장 레지스터
레지스터 주소: 0x0101
Python 예제
client.write_register(
address=0x0101,
value=2,
slave=1
)
의미:
현재 ID 1인 센서를
ID 2로 변경
5. 권장 ID 구성 예시
| 센서 위치 | Slave ID |
|---|---|
| 입구 | 1 |
| 중앙 | 2 |
| 출구 | 3 |
현장에서는 보통 위치 기준으로 번호를 부여합니다.
6. 실제 RS485 배선 방법
A/B 라인 연결
컨버터 A → 센서1 A → 센서2 A → 센서3 A
컨버터 B → 센서1 B → 센서2 B → 센서3 B
주의:
A는 끝까지 A끼리
B는 끝까지 B끼리
절대 교차되면 안 됩니다.
7. GND 연결은 왜 필요한가?
RS485는 차동(Differential) 신호 방식이라 A/B만으로도 동작할 수 있습니다.
하지만 실제 산업 환경에서는 장치 간 전위차가 발생할 수 있습니다.
그 결과:
랜덤 통신 오류
CRC 에러
응답 불안정
따라서 다음처럼 공통 GND를 연결하는 것이 매우 중요합니다.
컨버터 GND → 센서1 GND → 센서2 GND
8. 종단저항(Termination)의 역할
RS485 선로가 길어질수록 신호는 선 끝에서 반사됩니다.
이를 방지하기 위해 선로 끝에 종단저항을 추가합니다.
원리
종단저항은 선로의 특성 임피던스를 맞춰 신호 반사를 흡수합니다.
일반적으로:
120Ω 사용
9. 종단저항 연결 위치
매우 중요
종단저항은 선로 양 끝에만 넣습니다.
[컨버터] ---------------- [마지막 센서]
120Ω 120Ω
10. XY-MD02 계열 종단저항 연결 방법
대부분의 저가형 SHT30 Modbus 센서는 종단저항 점퍼가 없습니다.
따라서 직접 연결해야 합니다.
방법
마지막 센서의:
A 단자 ↔ B 단자
사이에 120Ω 저항을 연결합니다.
11. 스터브(Stub) 길이 주의
메인 버스에서 센서로 갈라지는 가지선을 Stub라고 합니다.
나쁜 예
메인선 ───────────────
│
│ 2m
│
센서
Stub가 길어지면 안테나처럼 동작하여 노이즈를 유발합니다.
12. 권장 Stub 길이
실무 권장:
30cm 이하
가능하면 메인 라인에 직접 붙이는 것이 가장 좋습니다.
13. 통신 케이블 선택
권장 케이블:
RS485 전용 케이블
트위스트 페어(Twisted Pair)
실드 케이블(Shielded Cable)
왜 꼬여 있어야 하나?
A/B 선이 서로 꼬여 있으면 외부 노이즈가 두 선에 동일하게 유입됩니다.
RS485 수신기는 두 선의 차이만 읽기 때문에 노이즈가 상쇄됩니다.
14. 전원 공급 시 주의사항
센서 수가 많아지면 말단에서 전압 강하가 발생합니다.
특히:
5V 사용 시
긴 거리 배선
얇은 케이블
에서 문제가 심해집니다.
권장 사항
DC 12V ~ 24V 사용 권장
그리고 각 센서 입력 허용 전압을 반드시 확인하세요.
15. SHT30 레지스터 구조
대부분의 XY-MD02 계열은 아래 구조를 사용합니다.
| 데이터 | 주소 | 설명 |
|---|---|---|
| 온도 | 0x0000 | 값 / 10 |
| 습도 | 0x0001 | 값 / 10 |
예:
읽은 값: 253
실제 온도: 25.3℃
16. Python 멀티 드롭 데이터 수집 예제
from pymodbus.client import ModbusSerialClient
client = ModbusSerialClient(
port='COM3',
baudrate=9600,
parity='N',
stopbits=1,
bytesize=8,
timeout=1
)
client.connect()
sensor_ids = [1, 2, 3]
for s_id in sensor_ids:
response = client.read_holding_registers(
address=0x0000,
count=2,
slave=s_id
)
if not response.isError():
temp = response.registers[0] / 10.0
humi = response.registers[1] / 10.0
print(
f"[센서 {s_id}] "
f"온도: {temp:.1f}℃, "
f"습도: {humi:.1f}%"
)
client.close()
17. 통신이 안 될 때 체크리스트
① A/B 반전 여부
가장 흔한 문제입니다.
A ↔ B 교차 여부 확인
② 모든 센서 ID 중복 여부
동일 ID가 존재하면 충돌 발생.
③ 종단저항 과다 사용 여부
종단저항은:
양 끝만 사용
중간 센서마다 넣으면 신호가 약해집니다.
④ USB-RS485 컨버터 품질
저가형 CH340 계열은 노이즈 환경에서 불안정할 수 있습니다.
가능하면:
FTDI
CP2102
산업용 컨버터
사용 권장.
18. 실무 팁
센서 개수가 많다면?
10대 이상이면:
전원 분리
리피터 사용
통신 속도 하향
을 고려하세요.
긴 거리라면?
100m 이상에서는:
9600bps 이하 권장
속도를 낮출수록 안정성이 올라갑니다.
마무리
RS485 시스템의 안정성은 단순히 코드보다 배선 품질에 훨씬 크게 좌우됩니다.
특히 핵심은 다음 4가지입니다.
데이지 체인 유지
Slave ID 중복 제거
종단저항 정확히 처리
Stub 최소화
이 기본 원칙만 지켜도 RS485 기반 환경 모니터링 시스템의 안정성은 크게 향상됩니다.
스마트팜, PLC, 산업 자동화, IoT 환경 구축 시 반드시 익혀야 하는 핵심 개념입니다.
댓글
댓글 쓰기