Chapter 11. DHT11 온습도 센서와 LCD 시각화
주변의 온도와 습도를 정밀하게 측정하는 DHT11 센서를 다뤄보고, 수집된 데이터를 LCD 화면에 깔끔하게 출력하는 웨더 스테이션의 기초를 다집니다.
DHT11: VCC→3V3, Data→GP15, GND→GND. LCD는 SDA→GP8, SCL→GP9에 연결합니다.
11.1 준비물과 연결 핀
센서와 LCD를 함께 쓰는 장이므로 데이터 선과 I2C 선을 구분해서 연결합니다. LCD 주소가 다르면 Chapter 9의 I2C 스캔 코드로 주소를 먼저 확인하세요.
| 부품 | Pico 2 W 핀 | 역할 |
|---|---|---|
| DHT11 Data | GP15 | 온습도 데이터 입력 |
| LCD SDA / SCL | GP8 / GP9 | I2C 화면 출력 |
| 전원 / GND | 3V3, 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% 정도의 오차가 있을 수 있습니다. 더 정밀한 프로젝트를 원하신다면 DHT22나 BME280 센서를 고려해 보세요. 코드 구조는 거의 동일합니다.