온습도 센서로 실내 환경 자동 조절하기 (DHT22 센서 사용법)

1. 프로젝트 개요

온도와 습도는 실내 환경의 쾌적함을 좌우하는 핵심 요소입니다.
라즈베리파이와 DHT22 센서를 이용하면 실내 온습도를 실시간으로 측정하고,
자동으로 환기팬이나 가습기를 제어하여 최적의 상태를 유지할 수 있습니다.

이 프로젝트는 다음과 같은 기능을 목표로 합니다.

  • DHT22 센서로 온습도 측정
  • 임계값에 따라 환기팬 또는 가습기 자동 제어
  • Flask 웹 서버로 실시간 데이터 확인

라즈베리파이 초보자에게 매우 실용적인 IoT 자동화 입문 프로젝트입니다.

2. 필요한 준비물

  • 라즈베리파이 4 (또는 3 이상)
  • microSD 카드 (32GB 이상, 라즈베리파이 OS 설치)
  • 5V 3A 전원 어댑터
  • DHT22 센서 (또는 DHT11)
  • 10kΩ 저항 (풀업용)
  • 환기팬 또는 가습기 (릴레이 제어용)
  • 릴레이 모듈 (1채널)
  • 브레드보드 및 점퍼 케이블

DHT22는 DHT11보다 정확도와 반응 속도가 뛰어나기 때문에, 실내 환경 제어용으로 추천됩니다.

3. DHT22 센서의 동작 원리

DHT22 센서는 내부에 디지털 온습도 측정 모듈이 내장되어 있으며,
라즈베리파이와 단일 데이터 라인으로 통신합니다.

  • 측정 범위:
    • 온도: -40°C ~ +80°C
    • 습도: 0 ~ 100% RH
  • 정확도:
    • 온도 ±0.5°C
    • 습도 ±2~5% RH
  • 출력 형식: 디지털 신호 (PWM 방식)

DHT22는 아날로그 신호를 디지털로 변환해 직접 읽을 수 있으므로,
ADC(Analog-to-Digital Converter) 없이 바로 GPIO로 연결 가능합니다.

4. 라즈베리파이와 DHT22 연결하기

다음은 DHT22의 핀 구성입니다.

핀 번호기능라즈베리파이 연결
1VCC3.3V
2DATAGPIO 4
3NC (미사용)
4GNDGND

VCC와 DATA 사이에는 10kΩ 저항을 연결하여 풀업 저항 역할을 하게 합니다.
이렇게 하면 데이터 신호의 안정성이 높아집니다.

5. 파이썬으로 온습도 데이터 읽기

DHT22를 제어하려면 Adafruit DHT 라이브러리를 설치해야 합니다.

sudo apt update
sudo apt install python3-pip
sudo pip3 install Adafruit_DHT

이후 아래 코드를 작성합니다.

import Adafruit_DHT
import time

sensor = Adafruit_DHT.DHT22
pin = 4  # GPIO 4 사용

while True:
    humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
    if humidity is not None and temperature is not None:
        print(f"온도: {temperature:.1f}°C, 습도: {humidity:.1f}%")
    else:
        print("센서 데이터 읽기 실패")
    time.sleep(2)

이 코드를 실행하면 2초마다 현재 온도와 습도를 터미널에 표시합니다.

6. 자동 환기 및 가습 제어 시스템 구축

온도나 습도가 특정 기준을 넘거나 떨어질 때 자동으로 기기를 제어하려면 릴레이 모듈을 사용합니다.

import Adafruit_DHT
import RPi.GPIO as GPIO
import time

sensor = Adafruit_DHT.DHT22
pin = 4
relay_pin = 17

GPIO.setmode(GPIO.BCM)
GPIO.setup(relay_pin, GPIO.OUT)

while True:
    humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
    if humidity and temperature:
        print(f"온도: {temperature:.1f}°C, 습도: {humidity:.1f}%")

        if temperature > 28:
            print("온도 높음 → 환기팬 작동")
            GPIO.output(relay_pin, GPIO.HIGH)
        elif humidity < 40:
            print("습도 낮음 → 가습기 작동")
            GPIO.output(relay_pin, GPIO.HIGH)
        else:
            GPIO.output(relay_pin, GPIO.LOW)
            print("적정 환경 유지 중")
    else:
        print("센서 읽기 실패")

    time.sleep(5)

이 코드는 온도 28°C 이상일 때 환기팬, 습도 40% 이하일 때 가습기를 자동으로 켜도록 설정되어 있습니다.
릴레이 모듈을 통해 실제 전원 기기를 제어할 수 있습니다.

7. Flask 기반 실시간 모니터링 대시보드

데이터를 웹 페이지에서 확인하려면 Flask 웹 서버를 활용합니다.

from flask import Flask, render_template_string
import Adafruit_DHT

app = Flask(__name__)
sensor = Adafruit_DHT.DHT22
pin = 4

HTML = """
<h1>실시간 온습도 모니터링</h1>
<p>온도: {{ temp }}°C</p>
<p>습도: {{ hum }}%</p>
"""

@app.route("/")
def home():
    humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
    return render_template_string(HTML, temp=round(temperature,1), hum=round(humidity,1))

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

실행 후 http://라즈베리파이IP:5000으로 접속하면 브라우저에서 실시간 온습도 정보를 확인할 수 있습니다.

8. 자주 발생하는 문제와 해결법

1. 센서 데이터가 자주 None으로 표시됨

  • 전원(3.3V) 공급이 불안정할 때 발생합니다.
  • 데이터선 풀업 저항(10kΩ)이 반드시 필요합니다.

2. 온도 또는 습도 값이 비정상적으로 높거나 낮음

  • 직사광선이나 열원 근처에 센서를 설치하지 마세요.
  • 습기가 많은 환경에서는 센서가 오작동할 수 있습니다.

3. 릴레이가 작동하지 않음

  • GPIO 핀 번호를 BCM 기준으로 맞췄는지 확인
  • 전원 라인이 충분한 전류를 공급하는지 점검

9. 확장 아이디어 및 마무리

온습도 자동 제어 시스템은 단순히 실내 쾌적도를 유지하는 것을 넘어 다양한 확장 가능성을 가집니다.

  • 구글 홈 또는 스마트폰 앱 연동으로 원격 제어
  • Blynk, Home Assistant 같은 IoT 플랫폼 연결
  • 데이터 로그 저장 및 시각화 (InfluxDB + Grafana 사용)
  • 자동 창문 개폐 시스템과 결합하여 완전한 환경 제어 구축

라즈베리파이와 DHT22를 활용하면 비교적 적은 비용으로 실내 환경을 지능적으로 관리할 수 있습니다.
이 프로젝트를 완성하면, “스스로 조절되는 스마트룸”의 첫걸음을 직접 경험하게 될 것입니다.

Similar Posts

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다