[아두이노] 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. I2C 주소(Address)의 이해
I2C 장치는 각각 고유한 주소(Address)를 가집니다.
아두이노는 이 주소를 이용해 여러 장치 중 어떤 센서와 통신할지 구분합니다.
중요한 점: 주소는 제조 단계에서 거의 고정된다
여기서 Modbus와 큰 차이가 있습니다.
Modbus RTU에서는:
국번(ID)
을 사용자가 자유롭게 변경할 수 있는 경우가 많습니다.
하지만 I2C 센서는 대부분:
제조사 단계에서 주소가 거의 고정
되어 출고됩니다.
즉:
사용자가 임의로 주소를 바꾸기 어려움
데이터시트에 정해진 주소만 사용 가능
같은 주소 장치를 여러 개 연결할 때 주의 필요
합니다.
SHT30의 주소
SHT30은 두 개의 주소 중 하나를 사용합니다.
| ADDR 상태 | 주소 |
|---|---|
| GND 연결 | 0x44 |
| VCC 연결 | 0x45 |
대부분의 모듈은 기본값인:
0x44
를 사용합니다.
왜 주소가 2개뿐일까?
SHT30 내부에는:
ADDR 핀
이 존재합니다.
이 핀을:
GND에 연결하면 →
0x44VCC에 연결하면 →
0x45
로 동작합니다.
즉 완전히 자유롭게 주소를 설정하는 것이 아니라:
제조사가 허용한 제한된 주소만 선택 가능
한 구조입니다.
6. 아두이노 라이브러리 설치
Arduino IDE에서:
라이브러리 매니저
를 열고 다음 라이브러리를 설치합니다.
Adafruit SHT31
설치 시 Adafruit BusIO도 함께 설치됩니다.
7. 기본 테스트 코드
다음 코드는 가장 기본적인 SHT30 테스트 코드입니다.
#include <Wire.h>
#include "Adafruit_SHT31.h"
Adafruit_SHT31 sht31 = Adafruit_SHT31();
void setup() {
Serial.begin(9600);
if (!sht31.begin(0x44)) {
Serial.println("SHT30 미검출!");
while (1);
}
Serial.println("SHT30 연결 성공");
}
void loop() {
float temperature = sht31.readTemperature();
float humidity = sht31.readHumidity();
if (!isnan(temperature) && !isnan(humidity)) {
Serial.print("온도: ");
Serial.print(temperature);
Serial.print(" °C");
Serial.print(" | 습도: ");
Serial.print(humidity);
Serial.println(" %");
}
else {
Serial.println("센서 읽기 실패");
}
delay(2000);
}
8. 코드 분석
객체 생성
Adafruit_SHT31 sht31 = Adafruit_SHT31();
SHT30 센서 제어 객체를 생성합니다.
센서 초기화
sht31.begin(0x44)
I2C 주소 0x44를 가진 센서를 찾습니다.
만약 센서가 응답하지 않으면:
false
를 반환합니다.
온도 읽기
sht31.readTemperature()
섭씨 온도를 읽습니다.
습도 읽기
sht31.readHumidity()
상대 습도(%RH)를 읽습니다.
9. 왜 NaN이 발생할까?
초보자들이 가장 많이 보는 값입니다.
nan
NaN은:
Not a Number
의 의미입니다.
즉 센서 데이터를 정상적으로 읽지 못했다는 뜻입니다.
주요 원인
① SDA/SCL 반전
가장 흔한 원인.
② 주소(Address) 불일치
센서가 0x45인데 코드에서:
0x44
로 접근하는 경우.
③ 전원 문제
일부 모듈은:
3.3V 전용
5V 허용
여부가 다릅니다.
④ 배선 접촉 불량
브레드보드에서 매우 흔하게 발생합니다.
10. 습도가 갑자기 90% 이상 올라가는 이유
센서를 손으로 감싸면:
습도 급상승
하는 경우가 많습니다.
이것은 센서 이상이 아닙니다.
사람 손 주변은:
땀
수분
체온
영향이 매우 크기 때문입니다.
오히려 빠르게 반응한다면 센서 감도가 좋다는 의미입니다.
11. 온도가 계속 높게 나오는 이유
이것도 매우 흔합니다.
원인은 대부분:
자가 발열(Self-Heating)
입니다.
대표적인 열원
Arduino 레귤레이터
DC-DC 컨버터
ESP32 WiFi 칩
LCD 백라이트
이런 부품 근처에 센서를 붙이면:
센서 주변 공기 온도 상승
이 발생합니다.
12. 실무 권장 배치
실무에서는 보통 이렇게 구성합니다.
[Arduino 본체] ---- 케이블 ---- [SHT30]
즉 센서를 보드에서 떨어뜨려 배치합니다.
그래야:
자가 발열 감소
공기 흐름 확보
측정 정확도 향상
효과를 얻을 수 있습니다.
13. I2C 스캐너로 주소 찾기
센서 주소가 확실하지 않을 때는
I2C Scanner 코드를 사용합니다.
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("I2C Scanner");
}
void loop() {
byte error, address;
for(address = 1; address < 127; address++ ) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C 장치 발견: 0x");
if (address < 16)
Serial.print("0");
Serial.println(address, HEX);
}
}
delay(5000);
}
정상 연결 시:
0x44
또는:
0x45
가 출력됩니다.
마무리
SHT30은 매우 정밀하고 사용하기 쉬운 센서이지만,
실제로는:
SDA/SCL 반전
주소 문제
자가 발열
배선 불량
같은 단순한 원인 때문에 많은 시간을 소비하게 됩니다.
특히 I2C 센서는:
제조사에서 정한 주소 체계
를 사용하기 때문에,
Modbus처럼 자유롭게 국번을 바꾸는 개념과는 다르다는 점을 이해하는 것이 중요합니다.
하지만:
I2C 원리 이해
주소 개념 이해
Scanner 활용
열원 분리
만 제대로 해도 대부분의 문제는 빠르게 해결할 수 있습니다.
댓글
댓글 쓰기