홍창민정보·인공지능 교사

몸·온도·습도 · 난이도 쉬움

DHT11과 DHT22 온습도 센서를 나란히 읽어 해상도·정확도·읽는 간격 차이 확인하기

DHT11과 DHT22는 선 하나로 온도와 습도를 보내지만 범위, 정확도, 소수점, 읽는 간격이 달라요. 두 센서를 3.3V로 함께 읽는 배선과 코드, 풀업 저항, 읽으면 앞 측정값이 나오는 성질, 포화 소금물(약 75%RH)로 습도를 점검하는 탐구를 정리했어요.

글 홍창민 · 갱신 2026-10-31 · 읽는 데 약 9분 · 가상 실행 확인 (실물 미확인)

이 센서로 무엇을 잴 수 있나

DHT11과 DHT22(AM2302)는 공기의 온도와 상대습도를 디지털 숫자로 보내는 센서예요. 생김새와 배선이 거의 같아서 섞어 쓰기 쉽지만, 속은 달라요. DHT11은 저항식 습도 소자와 NTC 온도 소자를, DHT22는 고분자 정전용량식 습도 소자를 써요. 데이터시트(DHT11은 D-Robotics판, DHT22는 Aosong판)의 숫자를 나란히 놓으면 차이가 분명해요.

항목 DHT11 DHT22(AM2302)
습도 범위 20~90%RH 0~100%RH
온도 범위 0~50℃ −40~80℃
습도 정확도 ±5%RH ±2%RH(최대 ±5%RH)
온도 정확도 ±2℃ ±0.5℃
MicroPython이 주는 값 정수 0.1 단위 소수
읽는 간격 1초 넘게 2초 넘게

DHT11의 1초는 D-Robotics판 기준이고, Aosong의 DHT11 설명서는 2초 넘게라고 적어요. 그래서 아래 코드는 두 센서를 모두 2초 간격으로 읽어요. 이 센서들로는 교실이나 상자 안의 습도와 온도 변화를 잴 수 있어요. 환기 전후의 습도, 젖은 수건을 넣은 상자의 습도가 오르는 속도, 두 센서가 같은 공기에서 얼마나 다르게 읽는지 같은 것이에요.

원리

두 센서는 DATA 선 하나로 주고받아요. 피코가 DATA를 잠깐(DHT11 데이터시트 기준 18ms 넘게) LOW로 당겼다 놓으면 센서가 대답하고, 40비트를 보내요. 습도 정수·소수, 온도 정수·소수, 그리고 앞의 네 바이트를 더한 값의 끝 8비트인 검사 바이트예요. MicroPython 내장 dht 모듈은 검사 바이트가 맞지 않으면 예외를 일으켜요.

같은 40비트라도 읽는 방법이 달라요. dht 모듈의 원본 코드를 보면 DHT11은 습도와 온도의 정수 바이트만 돌려주고, DHT22는 두 바이트를 16비트로 이어 10으로 나눠요. 그래서 DHT11은 24, 55처럼 정수로, DHT22는 24.3, 55.8처럼 소수로 나와요. 소수점이 있다고 더 정확한 것은 아니에요. 해상도는 0.1이어도 정확도는 ±0.5℃, ±2%RH예요.

Aosong의 DHT11 설명서에는 놓치기 쉬운 성질이 하나 적혀 있어요. 읽을 때 나오는 값은 바로 앞에서 잰 결과라서, 오래 쉬었다가 읽으면 첫 값은 지난 상태를 보여 줘요. 그래서 아래 코드는 시작할 때 한 번 읽고 버려요.

상대습도는 공기 온도에도 좌우돼요. 같은 양의 수증기가 있어도 공기가 따뜻해지면 상대습도는 내려가요. 센서를 손에 쥐거나 피코 바로 옆, 햇빛 드는 곳에 두면 온도가 오르면서 습도는 낮게 나와요. 선을 늘려 센서만 떨어뜨려요.

준비물

  • 라즈베리파이 피코와 USB 케이블
  • DHT11, DHT22 각 1개(3핀 모듈이나 4핀 단품), 브레드보드, 점퍼선
  • 4핀 단품이라면 4.7kΩ이나 5.1kΩ 저항(센서마다 1개)
  • 탐구용: 뚜껑 있는 반찬통, 병뚜껑만 한 작은 컵, 굵은 소금, 물, 수건, 테이프, 초시계

배선

DHT11과 DHT22 온습도 센서를 나란히 읽어 해상도·정확도·읽는 간격 차이 확인하기: 브레드보드에 피코와 센서를 꽂은 배선 그림
시나브로 PICO 브레드보드 작업대와 같은 계산으로 그린 배선이에요. 위 + 줄은 3.3V, 아래 + 줄은 5V예요.
브레드보드 따라 꽂기 순서 (8단계)
  1. 피코를 브레드보드 가운데 홈에 걸쳐 꽂아요. USB 단자가 왼쪽을 보게 하고, 1번 핀이 f2, 40번 핀이 e2에 들어가요. 다리가 홈 양쪽에 모두 들어갔는지 옆에서 봐요.
  2. 주황 선: 피코 36번 핀(3V3(OUT)) 옆 칸 a6 → 위쪽 + 줄(3.3V). 이제 이 줄 전체가 3.3V예요.
  3. 검은 선: 피코 38번 핀(GND) 옆 칸 a4 → 위쪽 − 줄(GND). 이제 이 줄 전체가 GND예요.
  4. 온습도 센서 DHT11/22 꽂기: 다리 VCC (+) · DATA (OUT) · GND (−)를 위쪽 a24 · a25 · a26에 차례로 꽂아요. 다리가 브레드보드에 바로 안 들어가면 암-수 점퍼선으로 같은 칸에 이어요.
  5. 주황 선(3.3V 전원): 온습도 센서 VCC (+) 줄 b24 → 위쪽 + 줄(3.3V)
  6. 초록 선(신호): 온습도 센서 DATA (OUT) 줄 b25 → 피코 20번 핀(GP15) 옆 칸 j21
  7. 검은 선(GND): 온습도 센서 GND (−) 줄 b26 → 위쪽 − 줄(GND)
  8. 마지막 확인: ① 위쪽 + 줄(3.3V)과 아래쪽 + 줄(5V)이 서로 이어지지 않았나요? ② 모든 부품의 GND가 − 줄에 이어졌나요? ③ 5V 신호 다리는 저항을 거쳐 피코에 이어졌나요? ④ 긴 브레드보드는 + − 줄이 가운데에서 끊긴 것도 있어요(빨간·파란 선이 끊겨 있으면 짧은 선으로 이어요). ⑤ 그림과 한 칸씩 비교한 뒤 USB를 꽂아요.
모듈 핀 피코 핀 비고
VCC (+) 3V3 (36번) 두 센서 모두 3.3V
DATA (OUT) GP15 (20번) DHT11, 그림과 같은 자리
DATA (OUT) GP14 (19번) DHT22, 두 번째 센서
GND (−) GND (38번) 두 센서와 피코의 접지를 함께

배선 그림은 센서 하나(GP15)를 보여 줘요. 두 번째 센서는 같은 방법으로 꽂고 DATA만 GP14에 이어요. 데이터시트의 전원 범위는 DHT11 3~5.5V, AM2302 3.3~5.5V라서 피코의 3V3로 켤 수 있어요. 3.3V로 켜면 DATA도 3.3V라 분압이 필요 없어요. Aosong 설명서는 3.3V로 켤 때 선을 1m보다 길게 하지 말라고 적어요.

3핀 모듈은 보통 기판에 풀업 저항이 있어요(시나브로 PICO 안내). 4핀 단품은 1번 VDD, 2번 DATA, 3번 빈 핀, 4번 GND이고, DATA와 VDD 사이에 풀업을 직접 달아요. 데이터시트는 5kΩ(D-Robotics판, 선 20m 미만)이나 5.1kΩ(Aosong 설명서)을 권해요. 시나브로 PICO 안내의 10kΩ으로 읽기 실패가 잦다면 4.7kΩ이나 5.1kΩ으로 바꿔 봐요.

코드

import dht
from machine import Pin
import time

s11 = dht.DHT11(Pin(15))        # DHT11 DATA → GP15
s22 = dht.DHT22(Pin(14))        # DHT22 DATA → GP14
GAP = 2                         # DHT22는 2초 넘게 쉬어야 해요(DHT11은 1초)
fail11 = 0
fail22 = 0

def read(s):
    try:
        s.measure()
        return s.temperature(), s.humidity()
    except Exception:           # 체크섬 오류, 응답 없음(OSError)
        return None, None

time.sleep(1)                   # 전원을 켜고 1초 동안은 명령을 보내지 않아요
read(s11)                       # 처음 읽은 값은 이전 측정이라 버려요
read(s22)
time.sleep(GAP)

while True:
    t11, h11 = read(s11)
    t22, h22 = read(s22)
    if t11 is None:
        fail11 += 1
    if t22 is None:
        fail22 += 1
    if t11 is not None and t22 is not None:
        print(f"DATA: t11={t11}, h11={h11}, t22={t22:.1f}, h22={h22:.1f}, dt={t22 - t11:.1f}, dh={h22 - h11:.1f}")
    else:
        print(f"읽기 실패: DHT11 {fail11}번, DHT22 {fail22}번")
    time.sleep(GAP)
  • 라이브러리는 펌웨어에 들어 있는 dht 모듈이라 따로 넣지 않아요.
  • read()는 측정에 실패하면 멈추지 않고 None을 돌려줘요. 실패 횟수는 따로 세요.
  • 두 데이터시트 모두 전원을 켠 뒤 1초는 명령을 보내지 말라고 해서 처음에 1초 쉬어요.
  • dt, dh는 DHT22에서 DHT11을 뺀 차이예요. 두 센서를 붙여 두고 이 값이 얼마나 흔들리는지 봐요.

값 해석과 보정

차이가 나도 정상일 수 있어요. 두 센서를 붙여 두었는데 습도가 6%RH 다르다면, 각각의 정확도(±5%RH, ±2%RH)를 더한 7%RH 안이라 둘 다 규격대로일 수 있어요. 어느 쪽이 맞는지는 기준이 있어야 알 수 있어요.

포화 소금물이 그 기준이 돼요. 밀폐한 통 안에 물에 젖은 소금(녹고 남을 만큼 넉넉히)을 두면 통 안의 습도가 정해진 값으로 모여요. 미국 국립표준국(지금의 NIST) 학술지에 실린 Greenspan(1977)의 표에서 염화나트륨 포화 용액은 25℃에서 약 75.3%RH, 20℃에서 약 75.5%RH예요. 센서가 72%RH를 가리킨다면 이 습도 근처에서 약 3%RH 낮게 읽는다는 뜻이에요(탐구 1).

반응을 기다려요. D-Robotics 데이터시트의 DHT11 습도 응답 시간(변화의 63%까지)은 바람 1m/s에서 6~15초, 온도는 6~30초예요. 바람이 없는 상자 안에서는 더 오래 걸리니, 장소를 옮긴 직후 몇 분 값은 기록에서 빼요.

자주 하는 실수

  1. 1초에 여러 번 읽기. 측정 간격보다 빨리 부르면 체크섬 오류나 응답 없음이 늘어요. 2초 간격을 지켜요.
  2. 센서 이름과 클래스를 바꿔 쓰기. DHT11을 DHT22로 읽으면 습도 55%가 1408.0처럼, DHT22를 DHT11로 읽으면 2처럼 엉뚱하게 나와요. 원본 코드의 바이트 해석이 달라서예요. 기판이나 케이스에 적힌 모델명을 확인해요.
  3. 4핀 단품의 3번 핀에 DATA를 잇기. 3번은 빈 핀이에요. 2번이 DATA예요.
  4. 소수점 한 자리를 정확도로 믿기. 0.1 단위는 해상도일 뿐이에요.
  5. 센서를 상자 안 물에 닿게 두기. 소금물 탐구에서 센서와 소금물은 닿지 않게 하고, 피코는 통 밖에 둬요.

이 센서로 잴 수 있는 탐구

1. 포화 소금물 통 안에서 두 센서는 75%에 얼마나 가까울까 - 질문: 염화나트륨 포화 소금물 통 안에서 DHT11과 DHT22는 각각 몇 %RH를 가리킬까? - 바꾸는 것: 센서 종류(DHT11, DHT22), 넣은 뒤 지난 시간 - 재는 것: 습도(%RH), 75.3%RH(25℃ 기준)와의 차이, 통 안 온도(℃) - 방법: 반찬통 바닥에 작은 컵을 두고 굵은 소금에 물을 조금씩 부어 젖은 반죽을 만들어요. 센서 두 개를 컵 위쪽에 매달고 선은 뚜껑 틈으로 빼 테이프로 막아요. 값이 더는 변하지 않을 때까지(몇 시간, 가능하면 하룻밤) 기록하고 마지막 1시간 평균을 써요. 다른 날 3번 반복해요.

2. 습한 상자로 옮기면 어느 센서가 먼저 따라갈까 - 질문: 실내에서 젖은 수건이 든 상자로 옮겼을 때 변화의 63%에 이르는 데 두 센서는 몇 초씩 걸릴까? - 바꾸는 것: 센서 종류, 상자 안 작은 USB 선풍기(켬, 끔) - 재는 것: 63% 도달 시간(초) - 방법: 실내에서 5분 기록한 평균을 처음 값, 상자 안 20분 뒤 평균을 나중 값으로 잡고, 그 사이 63% 지점을 지난 시각을 찾아요. 조건마다 3번 해요.

3. 읽는 간격을 줄이면 실패가 얼마나 늘까 - 질문: GAP을 0.5초, 1초, 2초로 바꾸면 100번 읽을 때 실패가 몇 번 나올까? - 바꾸는 것: GAP(0.5, 1, 2초) - 재는 것: 100번 중 실패 횟수(번), 실패율(%) - 방법: 센서를 한 번에 하나씩 연결해 같은 자리에서 재요. 데이터시트 간격(DHT11은 판에 따라 1초 또는 2초, DHT22는 2초)과 결과를 견줘 봐요.

안전

  • 전원은 3V3만 써요. 배선은 USB를 뽑고 바꿔요.
  • 소금물과 젖은 수건은 피코, 노트북과 떨어뜨려요. 물을 쏟으면 먼저 USB를 뽑아요.
  • 이 값으로 열사병 위험이나 실내 공기의 건강 영향을 판단하지 않아요.

더 알아보기

  • 데이터시트: D-Robotics "DHT11 Humidity & Temperature Sensor"(범위, 정확도, 응답 시간, 5kΩ 풀업, 1초 간격), Aosong "DHT11 Product Manual"(5.1kΩ 풀업, 3.3V일 때 선 1m, 앞 측정값을 읽는 성질), Aosong "AM2302/DHT22"(범위, 정확도, 0.1 해상도, 2초 간격)
  • 라이브러리: MicroPython 펌웨어 내장 dht 모듈(micropython-lib의 drivers/sensor/dht, MIT). DHT11은 정수 바이트, DHT22는 16비트 ÷ 10
  • 표준 자료: L. Greenspan, "Humidity Fixed Points of Binary Saturated Aqueous Solutions", J. Res. NBS 81A(1977)
  • 기초 글: 잴 수 있는 탐구 주제 만들기, 센서 값의 신뢰도, 피코 핀 지도, 브레드보드 처음 쓰기
글쓴이

홍창민 · 울산 학성고등학교 정보·인공지능 교사. 수업에 쓰는 도구(시나브로 PICO 웹 IDE, 학교 AI 서버 등)를 직접 만들어 운영해요. 소개 보기 · 고칠 곳 알려 주기