OLED 디스플레이에 실시간 온도·습도 출력하기 (I2C 활용)

라즈베리파이와 아두이노 같은 보드에서 센서 데이터를 시각적으로 출력하고 싶다면, OLED 디스플레이를 활용하는 것이 가장 간단하고 효율적인 방법입니다. OLED는 전력 소모가 적고, 작은 크기에도 선명한 문자를 표현할 수 있어 임베디드 프로젝트에 최적화되어 있습니다. 이번 글에서는 I2C 방식으로 OLED 디스플레이를 연결하고, DHT11 또는 DHT22 센서로 측정한 온도·습도 데이터를 실시간으로 출력하는 방법을 단계별로 설명합니다.

OLED 디스플레이란

OLED(Organic Light Emitting Diode)는 유기 발광 다이오드 디스플레이라고 하며, 백라이트 없이 자체 발광하는 방식의 화면입니다. 작은 모듈 형태의 OLED는 대부분 SSD1306 드라이버를 사용하며, 0.96인치 128×64 해상도 모델이 가장 널리 쓰입니다. 글자, 그래프, 센서 데이터를 표시하기에 충분한 크기이며, I2C(Inter-Integrated Circuit) 인터페이스를 통해 손쉽게 라즈베리파이와 연결할 수 있습니다.

OLED 디스플레이의 장점은 다음과 같습니다.

  • 전력 소모가 적고 수명이 길다
  • 높은 명암비와 선명한 표시
  • 코드로 간단히 텍스트, 아이콘, 센서값 표시 가능
  • 아두이노, 라즈베리파이 등 다양한 보드와 호환

준비물

온도·습도 측정과 OLED 출력 프로젝트를 위한 기본 구성품은 아래와 같습니다.

  • 라즈베리파이 4 Model B (또는 3B, Zero 2 W 등)
  • DHT11 또는 DHT22 온습도 센서
  • 0.96인치 I2C OLED 디스플레이 (SSD1306 드라이버)
  • 점퍼 케이블 (암수 타입)
  • Python3 및 필요한 라이브러리

센서와 OLED는 모두 3.3V 전원으로 동작하므로 라즈베리파이에 바로 연결할 수 있습니다.

I2C 연결 방식

I2C는 두 개의 신호선(SDA, SCL)으로 여러 장치를 제어할 수 있는 통신 방식입니다. 라즈베리파이의 기본 핀 번호는 다음과 같습니다.

핀 이름기능연결 대상
1 (3.3V)전원OLED VCC, DHT 전원
3 (GPIO2)SDAOLED SDA
5 (GPIO3)SCLOLED SCL
6 (GND)접지OLED GND, DHT GND
7 (GPIO4)데이터DHT11/DHT22 DATA

연결을 완료했다면 I2C 인터페이스를 활성화해야 합니다.

sudo raspi-config

Interface Options → I2C → Enable 선택 후 재부팅합니다.

I2C가 정상적으로 활성화되었는지 확인하려면 다음 명령어를 입력합니다.

sudo apt install i2c-tools
sudo i2cdetect -y 1

0x3C 또는 0x3D 주소가 표시되면 OLED 모듈이 인식된 것입니다.

Python 환경 설정

온습도 센서와 OLED를 제어하기 위해 필요한 라이브러리를 설치합니다.

sudo apt update
sudo apt install python3-pip
pip3 install Adafruit_DHT
pip3 install adafruit-circuitpython-ssd1306
pip3 install pillow
  • Adafruit_DHT: DHT11, DHT22 센서 데이터를 읽기 위한 라이브러리
  • adafruit-circuitpython-ssd1306: OLED 디스플레이 제어용
  • Pillow (PIL): 텍스트 및 그래픽 출력용 이미지 처리 라이브러리

실시간 온도·습도 출력 코드

아래는 DHT22 센서로 측정한 데이터를 OLED 화면에 실시간으로 표시하는 Python 예제입니다.

import time
import board
import busio
import adafruit_ssd1306
import Adafruit_DHT
from PIL import Image, ImageDraw, ImageFont

# I2C 및 OLED 초기화
i2c = busio.I2C(board.SCL, board.SDA)
oled = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)

# 센서 타입 및 핀 설정
DHT_SENSOR = Adafruit_DHT.DHT22
DHT_PIN = 4

# 폰트 및 디스플레이 초기화
font = ImageFont.load_default()

while True:
    humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)
    if humidity is not None and temperature is not None:
        oled.fill(0)
        image = Image.new("1", (oled.width, oled.height))
        draw = ImageDraw.Draw(image)
        draw.text((0, 0), "Raspberry Pi Sensor", font=font, fill=255)
        draw.text((0, 20), f"Temp: {temperature:.1f} C", font=font, fill=255)
        draw.text((0, 40), f"Hum:  {humidity:.1f} %", font=font, fill=255)
        oled.image(image)
        oled.show()
    else:
        print("센서에서 데이터를 읽을 수 없습니다.")
    time.sleep(2)

코드를 실행하면 OLED 화면에 실시간으로 온도(°C)와 습도(%)가 표시됩니다. DHT11을 사용할 경우 센서 타입을 Adafruit_DHT.DHT11로 변경하면 됩니다.

코드 설명

  1. 센서 데이터 읽기
    Adafruit_DHT.read_retry() 함수는 측정 오류가 발생해도 자동으로 재시도하며 안정적인 데이터를 반환합니다.
  2. OLED 초기화
    SSD1306_I2C(128, 64, i2c)는 128×64 해상도의 OLED를 설정하는 명령입니다.
  3. 텍스트 표시
    Pillow의 ImageDraw 모듈을 사용해 문자열을 이미지 형태로 그린 뒤 OLED로 전송합니다.
  4. 주기적 업데이트
    2초 간격으로 측정값을 새로 표시하도록 설정했습니다.

프로젝트 확장 아이디어

  • 데이터 로깅 기능 추가
    측정된 온도·습도 데이터를 CSV나 SQLite DB에 저장해 장기 변화를 분석할 수 있습니다.
  • Wi-Fi 기반 웹 모니터링
    Flask 서버를 이용해 웹 브라우저에서 실시간 측정값을 확인하도록 확장할 수 있습니다.
  • 자동 제어 시스템 구축
    특정 온도 이상일 때 팬을 켜거나, 습도가 낮으면 가습기를 작동시키는 스마트 환경 제어로 발전시킬 수 있습니다.
  • 그래프 출력
    Pillow를 이용해 간단한 그래프나 아이콘을 그려 시각적인 디스플레이를 구성할 수 있습니다.

성능 및 안정성 팁

  • DHT11은 저가형으로 측정 속도와 정확도가 낮으므로, 보다 정확한 값을 원한다면 DHT22를 사용하는 것이 좋습니다.
  • 전원 노이즈나 통신 오류를 방지하기 위해 I2C 케이블 길이는 짧게 유지해야 합니다.
  • 부팅 시 자동 실행되도록 rc.local이나 systemd에 등록하면 독립형 장비처럼 동작할 수 있습니다.

마무리

I2C 기반의 OLED 디스플레이는 라즈베리파이 프로젝트에서 센서 데이터를 시각화하기에 매우 효율적입니다. 본 실습에서는 온도와 습도를 실시간으로 출력하는 기본 구조를 다뤘지만, 이를 기반으로 다양한 환경 제어 시스템이나 IoT 모니터링 장비로 확장할 수 있습니다.

간단한 센서와 디스플레이를 조합하는 것만으로도 직관적인 시각 피드백을 제공할 수 있으며, 이를 통해 임베디드 시스템 개발의 이해도를 높이고 실전 응용 능력을 강화할 수 있습니다.

Similar Posts

답글 남기기

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