[아두이노] 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)VCC5V 또는 3.3V
흑색 (Black)GNDGND
백색 (White)SDAA4
녹색 (Green)SCLA5

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에 연결하면 → 0x44

  • VCC에 연결하면 → 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 활용

  • 열원 분리

만 제대로 해도 대부분의 문제는 빠르게 해결할 수 있습니다.

댓글

이 블로그의 인기 게시물

공압 속도 제어: 미터인 vs 미터아웃

[PLC] 센서 NPN, PNP 출력 타입별 결선방법 (OMRON E2E-X 시리즈 3선식 배선)

NPN, PNP 트랜지스터 차이점

[PLC] PLC 아날로그 입출력 기본

사각형의 넓이 공식의 증명

[아두이노] 가변저항(Potential Divider)과 전압분배(Voltage Divider)

[PLC] 서보 모터 브레이크 결선, 왜 릴레이 터미널을 써야 할까?

[투자] ETF 투자 가이드 : 카테고리별 ETF 선택 전략

[주식] 한국거래소(KRX) 데이터 API 입문 가이드

[PLC] 릴레이와 전자 접촉기 (MC)