Chapter 11. DHT11 온습도 센서와 LCD 시각화

주변의 온도와 습도를 정밀하게 측정하는 DHT11 센서를 다뤄보고, 수집된 데이터를 LCD 화면에 깔끔하게 출력하는 웨더 스테이션의 기초를 다집니다.

DHT11과 I2C LCD 연결도 DHT11 데이터 핀은 GP15에, I2C LCD의 SDA와 SCL은 GP8과 GP9에 연결합니다. 온습도 입력 Pico 2 W LCD 출력 DHT11 온도 / 습도 측정 DATA Pico 2 W DHT + I2C LCD 2초마다 측정 후 표시 GP15 GP8 SDA GP9 SCL Temp: 24.0 C Hum : 58 % I2C LCD 16x2 전원은 DHT11 VCC->3V3, LCD VCC->5V 또는 3V3(모듈 사양 확인), 모든 GND는 공통 연결

DHT11: VCC→3V3, Data→GP15, GND→GND. LCD는 SDA→GP8, SCL→GP9에 연결합니다.

11.1 준비물과 연결 핀

센서와 LCD를 함께 쓰는 장이므로 데이터 선과 I2C 선을 구분해서 연결합니다. LCD 주소가 다르면 Chapter 9의 I2C 스캔 코드로 주소를 먼저 확인하세요.

부품 Pico 2 W 핀 역할
DHT11 DataGP15온습도 데이터 입력
LCD SDA / SCLGP8 / GP9I2C 화면 출력
전원 / GND3V3, GND공통 전원 기준

11.2 실시간 환경 모니터링 소스 코드

MicroPython의 내장 dht 라이브러리를 사용합니다. Chapter 9에서 사용한 LCD 라이브러리가 Pico에 이미 저장되어 있어야 합니다.

import machine
import dht
import time
from pico_i2c_lcd import I2cLcd

# I2C LCD 설정
i2c = machine.I2C(0, sda=machine.Pin(8), scl=machine.Pin(9), freq=400000)
lcd = I2cLcd(i2c, 0x27, 2, 16)

sensor = dht.DHT11(machine.Pin(15))

def lcd_line(row, text):
    lcd.move_to(0, row)
    lcd.putstr(text[:16].ljust(16))

def show_status(temp=None, hum=None, error=None):
    if error:
        lcd_line(0, "DHT11 Error")
        lcd_line(1, "Check wiring")
        print("센서 읽기 실패:", error)
        return

    lcd_line(0, f"Temp: {temp:>2} C")
    lcd_line(1, f"Hum : {hum:>2} %")
    print(f"온도: {temp}C, 습도: {hum}%")

print("온습도 모니터링 시스템 시작...")
lcd_line(0, "DHT11 + LCD")
lcd_line(1, "Initializing...")
time.sleep(1)

while True:
    try:
        sensor.measure()
        temp = sensor.temperature()
        hum = sensor.humidity()
        show_status(temp, hum)
    except OSError as e:
        show_status(error=e)
    
    # DHT11은 너무 자주 읽으면 실패하므로 2초 이상 간격을 둡니다.
    time.sleep(2)

11.3 동작 흐름

Pico는 2초마다 DHT11에 측정을 요청하고 온도와 습도 값을 읽습니다. 정상 값은 LCD 두 줄에 고정 폭으로 표시하고, 읽기 실패가 발생하면 배선 확인 메시지를 띄워 수업 중 디버깅이 쉽도록 했습니다.

💡 DHT11 사용 팁

DHT11은 매우 저렴하고 대중적이지만, 온도는 ±2℃, 습도는 ±5% 정도의 오차가 있을 수 있습니다. 더 정밀한 프로젝트를 원하신다면 DHT22BME280 센서를 고려해 보세요. 코드 구조는 거의 동일합니다.