[아두이노] 라이브러리 없이 SHT30 온습도 센서 직접 제어하기 (Arduino/I2C)

대부분 아두이노에서 센서를 다룰 때는 전용 라이브러리를 사용합니다. 하지만 산업 현장이나 임베디드 환경에서는 메모리 절약, 디버깅 편의성, 그리고 예외 처리 강화를 위해 데이터시트를 직접 해석하여 구현하는 경우가 많습니다. 특히 PLC, 산업용 제어기기, 펌웨어 개발에서는 라이브러리 의존성을 줄이는 것이 시스템 안정성 측면에서 큰 장점이 됩니다. 이번 글에서는 Wire.h 만 사용하여 SHT30 센서를 직접 제어하는 방법을 정리해 보겠습니다. 1. SHT30의 통신 메커니즘 이해하기 SHT30은 I2C 기반 디지털 온습도 센서입니다. 라이브러리 내부에서 실제로 수행되는 동작은 생각보다 단순합니다. MCU와 센서는 아래 순서대로 통신합니다. Single Shot Mode 동작 순서 I2C START 조건 생성 센서 주소( 0x44 ) 전송 측정 명령어( 0x2C06 ) 전송 센서 내부 측정 완료까지 대기 측정 결과 6바이트 읽기 Raw 데이터를 온습도로 변환 즉, 라이브러리란 결국 이 과정을 함수로 감춰놓은 것에 불과합니다. 2. SHT30 기본 배선 Arduino UNO 기준 SHT30 Arduino UNO VCC 3.3V ~ 5V GND GND SDA A4 SCL A5 3. 중요한 특징: I2C 주소는 제조 단계에서 결정됨 SHT30 모듈은 일반적으로 아래 두 가지 주소 중 하나를 사용합니다. ADDR 핀 상태 I2C 주소 LOW 0x44 HIGH 0x45 문제는 알리익스프레스 등에서 판매되는 일부 SHT30 모듈은: ADDR 핀이 외부로 노출되지 않거나 PCB 내부에서 GND/VCC로 고정되어 있는 경우가 많다는 점입니다. 즉: 사용자가 주소를 변경할 수 없는 경우가 존재 제조 단계에서 주소가 사실상 결정됨 이라는 특징이 있습니다. 따라서 여러 개의 SHT30을 동시에 연결하려면: 0x44 0x45 주소 조합을 고려해야 하며, 동일 주소 센서를 여러 개 연결해야 하는 경우에는: I2C 멀티플렉서(TCA9548A) 별도 I2C 버스 RS485 기반 센서 등을...

[아두이노] SHT30 온습도 센서 직접 연결 가이드: I2C 배선부터 실전 트러블슈팅까지

  산업용 현장에서 많이 사용하는 SHT30 온습도 센서는 정확도가 높고 반응 속도가 빨라 아두이노 프로젝트에서도 자주 사용됩니다. 하지만 실제로 연결해 보면: 센서가 인식되지 않음 값이 NaN으로 출력됨 습도가 이상하게 튐 온도가 계속 높게 나옴 같은 문제를 자주 겪게 됩니다. 이번 포스팅에서는 SHT30의 I2C 연결 원리 → 아두이노 배선 → 주소(Address) 개념 → 실전 테스트 코드 → 현장에서 자주 발생하는 오류 원인 까지 한 번에 정리해 보겠습니다. 1. SHT30이란? SHT30은 Sensirion 계열의 디지털 온습도 센서입니다. 특징: 높은 정확도 빠른 응답 속도 디지털 출력 I2C 인터페이스 사용 아날로그 센서처럼 ADC 계산이 필요하지 않고, 온도와 습도를 디지털 데이터로 바로 읽을 수 있습니다. 2. SHT30은 왜 I2C를 사용할까? SHT30은 I2C(Inter-Integrated Circuit) 통신을 사용합니다. I2C는 단 2개의 신호선만으로 여러 장치를 연결할 수 있는 통신 방식입니다. 사용되는 선: 이름 역할 SDA 데이터(Data) SCL 클럭(Clock) 즉: 아두이노 ↔ SHT30 사이에: 데이터 선(SDA) 타이밍 선(SCL) 2개만 있으면 통신이 가능합니다. 3. 아두이노 연결 방법 (Wiring) Arduino Uno/Nano 기준 연결입니다. SHT30 선 색상 기능 Arduino 적색 (Red) VCC 5V 또는 3.3V 흑색 (Black) GND GND 백색 (White) SDA A4 녹색 (Green) SCL A5 4. 가장 많이 하는 실수: SDA/SCL 반전 현장에서 가장 흔한 문제입니다. 다음 두 선을 헷갈리는 경우가 매우 많습니다. 선 기능 SDA 데이터 SCL 클럭 만약 두 선이 뒤바뀌면: 전원 LED는 정상 아두이노도 정상 코드도 정상 인데 센서만 동작하지 않습니다. 대표 증상 다음과 같은 현상이 발생합니다. SHT30 미검출 또는: nan nan nan 이 계속 출력됩니다. 5. I2...

[파이썬] 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 설정 왜 필요한가? 모든 센서는 공장 출...

[파이썬] SHT30 Modbus 센서 (SHA9D01): 단순 측정을 넘어 '제어'와 '교정'까지

이미지
알리익스프레스에서 흔히 판매되는 SHT30 Modbus RTU 온습도 센서 (이 글에서는  SHA9D01 모델 사용함.) 는 단순히 데이터를 읽는 수준을 넘어, 실제 산업 환경에서 필요한 다양한 설정 기능을 제공합니다. 대표적으로: 슬레이브 ID 변경 통신 속도(Baudrate) 변경 온도/습도 오차 보정(Calibration) 등을 지원하며, 이를 통해 여러 개의 센서를 하나의 RS485 라인에 연결하거나 현장 환경에 맞는 정밀 보정까지 수행할 수 있습니다. 이번 글에서는 이러한 고급 기능들을 실제 Modbus 레지스터 기반으로 상세히 분석해보겠습니다. 1. SHT30 Modbus 센서의 고급 기능 많은 입문자들이: 온도 읽기 습도 읽기 까지만 사용하지만, 실제 산업 환경에서는 센서 설정 기능이 훨씬 중요합니다. 예를 들어: 공장 내부 여러 위치에 센서를 설치 스마트팜 여러 구역 모니터링 PLC 기반 중앙 통합 제어 등을 하려면 센서마다 서로 다른 주소(ID)가 필요합니다. 또한 설치 환경에 따라 측정 오차가 발생할 수 있기 때문에 보정 기능도 매우 중요합니다. 2. Modbus 기능 코드(Function Code) 이해 SHT30 Modbus 모듈은 일반적으로 아래 기능 코드를 지원합니다. 기능 코드 이름 설명 03 Read Holding Registers 데이터 읽기 06 Write Single Register 단일 설정값 변경 16 Write Multiple Registers 여러 설정 동시 변경 Function Code 03 가장 많이 사용하는 읽기 명령입니다. 예: 온도 읽기 습도 읽기 ID 읽기 보드레이트 읽기 등에 사용됩니다. Function Code 06 설정 변경 시 가장 중요합니다. 예: 슬레이브 ID 변경 온도 보정값 변경 습도 보정값 변경 등에 사용됩니다. Function Code 16 여러 개의 레지스터를 동시에 수정할 때 사용합니다. 하지만 실제 현장에서는 안정성을 위해: 06번 명령으로 하나씩 수정 하는 경우가 많습니다. 3...

[파이썬] SHT30 Modbus RS485 온습도 센서 제어 가이드 (결선부터 레지스터 분석까지)

산업용 현장이나 스마트 팜에서 정밀한 환경 데이터 수집을 위해 많이 사용되는 SHT30 Modbus RTU 센서. 이번 글에서는 이 센서를 아두이노가 아닌 PC 에 직접 연결하여 파이썬(Python) 으로 데이터를 읽어오는 전체 과정을 정리해보겠습니다. RS485 결선 방법부터 Modbus 레지스터 구조, 파이썬 코드, 실제 통신 패킷 분석까지 한 번에 이해할 수 있도록 구성했습니다. 1. 하드웨어 구성 및 물리적 결선 PC는 RS485 신호를 직접 읽을 수 없으므로 반드시 USB to RS485 컨버터 가 필요합니다. 또한 센서의 안정적인 동작을 위해 외부 전원을 사용하는 것이 좋습니다. 준비물 SHT30 Modbus RS485 센서 USB to RS485 컨버터 DC 전원 공급 장치 (5V ~ 24V) PC 점퍼선 상세 결선표 센서 선 색상 신호 명칭 연결 대상 비고 적색 (Red) VCC 외부 전원 (+) DC 5V ~ 24V 흑색 (Black) GND 외부 전원 (-) 및 컨버터 GND 공통 접지 필수 황색 (Yellow) RS485-A USB 컨버터 A(D+) 데이터 + 백색 (White) RS485-B USB 컨버터 B(D-) 데이터 - 핵심 포인트: 공통 접지(Common GND) RS485는 차동 신호 방식이라 노이즈에 강하지만, 실제 현장에서는 반드시 GND를 공통으로 연결 하는 것이 안정적입니다. 즉: 센서 GND 외부 전원 GND RS485 컨버터 GND 이 세 개를 서로 연결하는 것이 좋습니다. 2. Modbus 레지스터 구조 이해 SHT30 Modbus 센서는 내부 데이터를 Holding Register 형태로 저장합니다. 우리는 특정 주소(Register Address)를 읽어서 온도와 습도를 가져오게 됩니다. 레지스터 맵(Register Map) 주소 (HEX) 내용 데이터 타입 처리 방식 0x0000 현재 온도 16-bit Signed Integer 값 ÷ 10.0 0x0001 현재 습도 16-bit Unsigned Integ...

[아두이노] 역전압 스파이크의 해결사, 플라이백 다이오드 완벽 가이드

이미지
전기 회로를 설계하다 보면 모터나 릴레이처럼 코일(인덕터) 이 포함된 부품을 자주 사용하게 됩니다. 그런데 전원을 끄는 순간, 트랜지스터가 손상되거나 MCU가 리셋되는 현상 이 발생할 수 있습니다. 이 현상의 원인은 바로 역전압 스파이크(Back EMF) 입니다. 오늘은 이 문제를 다이오드 하나로 해결하는 원리 를 이해해보겠습니다. 1. 근본적인 원인: 인덕터의 ‘전류 유지 성질’ DC 모터 내부에는 구리선이 감긴 코일(인덕터)이 존재합니다. 이 인덕터는 전류를 유지하려는 성질 을 가지고 있습니다. ✔ 에너지 저장 전류가 흐르면 코일 주변에 자기장이 형성되며 에너지가 저장됩니다. 에너지(E) = 0.5 × 인덕턴스(L) × 전류(I)의 제곱 즉, 전류가 클수록 저장되는 에너지는 빠르게 증가합니다. ✔ 전류 유지 전원을 차단하면 전류는 즉시 0이 되어야 할 것 같지만, 인덕터는 저장된 에너지를 이용해 기존 방향으로 계속 전류를 흐르게 하려 합니다. 2. 왜 전압 극성이 반대로 바뀔까? 많이 헷갈리는 부분입니다. 전류는 그대로 흐르려 하는데, 왜 전압은 반대로 뒤집힐까요? ✔ 핵심 개념: 인덕터는 순간적으로 발전기처럼 동작한다 전원이 연결된 상태 → 전원이 전류를 밀어줌 전원이 끊어진 상태 → 인덕터가 전류를 밀어냄 즉, 전원이 사라지면 인덕터가 직접 전압을 만들어냅니다. ✔ 중요한 포인트 전류를 계속 흐르게 하려면, 출구 쪽 전압이 입구보다 더 높아야 합니다. 그래서 인덕터는 전압을 강제로 만들어내며, 이 과정에서 기존과 반대 극성의 전압 이 형성됩니다. 3. 보호 회로가 없을 때 발생하는 문제 플라이백 다이오드가 없다면 매우 위험한 상황이 됩니다. ✔ 전압 폭주 인덕터는 전류를 유지하기 위해 전압을 크게 증가시킵니다. 이 전압은 수백 볼트에서 수천 볼트까지 올라갈 수 있습니다. ✔ 전기적 충격 (Water Hammer 현상) 수도 배관을 갑자기 잠글 때 충격이 발생하는 것처럼, 전기 회로에서도 유사한 충격이 발생합니다. ✔ 실제 피해 스위치에서 스파크(불꽃) ...

[아두이노] 트랜지스터(BJT)를 이용한 DC 모터 제어와 회로 설계의 이해

이미지
아두이노와 같은 MCU로 DC 모터를 제어할 때, BJT 트랜지스터는 핵심적인 역할을 합니다. 이 글에서는 원리부터 실무 설계까지 깔끔하게 정리합니다. 1. BJT의 핵심 원리 BJT의 본질은 다음 한 줄로 정리됩니다. Ic = hFE × Ib Ic: 컬렉터 전류 Ib: 베이스 전류 hFE: 전류 증폭률 (보통 50~200) 👉 의미: "작은 베이스 전류로 큰 컬렉터 전류를 제어한다" 2. 모터 OFF/ON 동작 베이스 전류 없음 → Ic = 0 → 모터 OFF 베이스 전류 있음 → Ic 흐름 → 모터 ON 즉, 전자 스위치 3. PWM 속도 제어 핵심 PWM은 이렇게 이해하면 안 깨진다: 평균전압 = 최대전압 × 듀티비 예: 5V × 50% = 2.5V 효과 👉 모터는 관성 때문에 평균값으로 반응 4. 역전압(백 EMF) 핵심 수식 모터는 코일이라서 다음이 발생: V = L × (dI/dt) 👉 의미: 전류가 급격히 변하면 큰 전압이 튀어나옴 그래서 반드시 다이오드 필요 5. 베이스 저항이 왜 필요한가 아두이노 핀은 전류를 무한히 못 준다. 예시 계산: Ib = (5V - 0.7V) / R 👉 R = 1kΩ일 때 Ib ≈ (5 - 0.7) / 1000 Ib ≈ 4.3mA 👉 안전한 수준 6. BJT의 구조적 한계 (1) 공통 접지 필요 아두이노 GND = 모터 GND (2) 노이즈 역류 모터 → GND → MCU (3) 전류 기반이라 비효율 큰 전류 = 큰 발열 7. 실무 해결 전략 ✔ 포토커플러 전기 대신 빛으로 신호 전달 → 완전 절연 ✔ MOSFET 전압으로 제어 → 발열 ↓ 효율 ↑ 8. 실무 권장 구조 [아두이노] → [포토커플러] → [MOSFET] → [모터] 핵심 요약 Ic = hFE × Ib V = L × (dI/dt) 평균전압 = V × 듀티비 👉 이 3개만 이해하면 80% 끝 결론 BJT는 "입문용 + 개념 이해용"으로는 최고지만, 실무에서는 반드시 다음으로 넘어가야 한다: 👉 MOSFET ...