ESP32 MicroPython OLED SSD1309
ESP32는 IoT 및 임베디드 프로젝트에 널리 사용되는 강력한 Wi-Fi 지원 마이크로컨트롤러입니다. MicroPython과 DIYables OLED SSD1309 라이브러리를 결합하면 선명한 단색 OLED 디스플레이를 프로젝트에 손쉽게 추가할 수 있습니다.
이 튜토리얼에서 다루는 내용:
- OLED SSD1309를 ESP32에 연결하기 — I2C 데이터 핀 2개만 필요합니다.
- 텍스트와 숫자 표시하기.
- 도형 그리기: 픽셀, 선, 사각형, 비트맵.
- 하드웨어 스크롤 사용하기.
- 대비 조절 및 디스플레이 어둡게 하기.

필요한 부품
| 1 | × | 38-pin ESP32 ESP-WROOM-32 Dev Module - Narrow | 쿠팡 | 아마존 | |
| 1 | × | (또는) 38-pin ESP32 ESP-WROOM-32 Dev Module - Wide | 쿠팡 | 아마존 | |
| 1 | × | (또는) 30-pin ESP32 ESP-WROOM-32 Dev Module - Wide | 아마존 | |
| 1 | × | (또는) ESP32 Uno-form board | 아마존 | |
| 1 | × | (또는) ESP32 S3 Uno-form board | 아마존 | |
| 1 | × | USB 케이블 타입-A to 타입-C (USB-A PC용) | 쿠팡 | 아마존 | |
| 1 | × | USB 케이블 타입-C to 타입-C (USB-C PC용) | 아마존 | |
| 1 | × | SSD1309 I2C OLED Display 128x64 (2.42 inch) | 아마존 | |
| 1 | × | 점퍼케이블 | 쿠팡 | 아마존 | |
| 1 | × | (추천) ESP32용 스크루 터미널 확장 보드 | 쿠팡 | 아마존 | |
| 1 | × | (추천) Breakout Expansion Board for ESP32 | 쿠팡 | 아마존 | |
| 1 | × | (추천) ESP32용 전원 분배기 | 쿠팡 | 아마존 |
OLED SSD1309에 대하여
SSD1309는 유기/폴리머 발광 다이오드 도트 매트릭스 그래픽 디스플레이 시스템용 컨트롤러가 내장된 단일 칩 CMOS OLED/PLED 드라이버입니다. I2C(2선식) 프로토콜을 사용하여 마이크로컨트롤러에 연결되므로, 전원 외에 SDA와 SCL 두 라인만 필요합니다.
디스플레이는 자체 발광(백라이트 불필요)하며, 높은 대비, 넓은 시야각, 밝고 어두운 환경 모두에서 읽기 가능합니다. 일반적으로 128×64와 128×32 픽셀 변형으로 제공됩니다.
주요 특징:
- I2C 인터페이스 (기본 주소 0x3C)
- 128×64 픽셀 해상도 (또는 128×32, 96×16, 64×48, 64×32)
- 수평 및 대각선 방향의 하드웨어 스크롤 내장
- 대비 조절 가능 (0–255)
- framebuf.FrameBuffer 확장 — 모든 MicroPython 드로잉 프리미티브가 기본 지원
핀 설명
| 핀 | 용도 | ESP32 연결 |
|---|---|---|
| SDA | I2C 데이터 라인 | GPIO21에 연결 |
| SCL | I2C 클럭 라인 | GPIO22에 연결 |
| VCC | 3.3V~5V 전원 입력 | 3.3V에 연결 |
| GND | 접지 | GND에 연결 |

배선
ESP32는 3.3V 로직으로 동작하며, SSD1309 디스플레이와 호환됩니다.
| OLED SSD1309 | ESP32 | 비고 |
|---|---|---|
| SDA | GPIO21 | I2C 데이터 |
| SCL | GPIO22 | I2C 클럭 |
| VCC | 3.3V | 전원 |
| GND | GND | 접지 |
- 브레드보드를 사용한 ESP32와 SSD1309 OLED 128x64 디스플레이 연결 방법

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
- 나사 단자 브레이크아웃 보드를 사용한 ESP32와 SSD1309 OLED 128x64 디스플레이 연결 방법

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
팁: ESP32의 사용 가능한 I2C 지원 GPIO 핀을 자유롭게 사용할 수 있습니다. 코드에서 SCL_PIN과 SDA_PIN 값만 업데이트하면 됩니다.
빠른 시작
Thonny IDE를 사용하여 ESP32에서 MicroPython 코드를 설정하고 실행하는 방법:
- Thonny IDE가 컴퓨터에 설치되어 있는지 확인합니다.
- ESP32 보드에 MicroPython 펌웨어가 로드되어 있는지 확인합니다.
- ESP32에서 MicroPython을 처음 사용하는 경우, ESP32 마이크로파이썬 - 시작하기 가이드를 참조하세요.
- 제공된 배선도에 따라 ESP32 보드를 OLED SSD1309에 연결합니다.
- USB 케이블로 ESP32 보드를 컴퓨터에 연결합니다.
- 컴퓨터에서 Thonny IDE를 엽니다.
- Thonny IDE에서 Tools Options로 이동합니다.
- Interpreter 탭에서 드롭다운 메뉴의 MicroPython (ESP32)를 선택합니다.
- 올바른 포트가 선택되어 있는지 확인합니다. Thonny IDE가 자동으로 감지하지만, 수동으로 선택해야 할 수도 있습니다(Windows에서는 COM3, Linux에서는 /dev/ttyUSB0).
- Thonny IDE의 Tools Manage packages로 이동합니다.
- "DIYables-MicroPython-OLED-SSD1309"를 검색하여 DIYables에서 만든 OLED SSD1309 라이브러리를 찾습니다.
- DIYables-MicroPython-OLED-SSD1309를 클릭한 후 Install 버튼을 클릭하여 라이브러리를 설치합니다.

- 제공된 MicroPython 코드를 복사하여 Thonny 편집기에 붙여넣습니다.
- 다음 방법으로 코드를 ESP32에 저장합니다:
- Save 버튼을 클릭하거나 Ctrl+S를 누릅니다.
- 저장 대화상자에서 MicroPython device를 선택합니다.
- 파일 이름을 main.py로 지정합니다.
- 녹색 Run 버튼을 클릭하거나 F5를 눌러 스크립트를 실행합니다.
- 결과를 관찰합니다 — OLED 디스플레이에 텍스트와 그래픽이 나타나야 합니다.
기본 코드 템플릿
ESP32 코드 — Hello World
실행해보기
- 위 배선도에 따라 OLED SSD1309를 ESP32에 연결합니다.
- Thonny IDE로 코드를 업로드합니다.
- 화면에 "Hello, World!", "DIYables", "SSD1309 OLED 128 x 64"가 표시되어야 합니다.
텍스트 드로잉 참조
| 메서드 호출 | 동작 | 비고 |
|---|---|---|
| oled.fill(0) | 전체 화면 지우기 (모든 픽셀 끄기) | 새 프레임 그리기 전 항상 호출 |
| oled.text("Hello!", 0, 0) | 열 0, 행 0에 텍스트 그리기 | 8×8 픽셀 내장 폰트; 행당 16자, 64px 디스플레이에 8행 |
| oled.text("Line 2", 0, 16) | 두 번째 줄에 텍스트 그리기 | 행 높이는 8px; 다음 줄은 y+8 또는 y+16 |
| oled.show() | 프레임버퍼를 물리적 디스플레이로 전송 | show() 호출 전까지 아무것도 표시되지 않음 |
ESP32 코드 — 도형 그리기
실행해보기
- Thonny IDE로 코드를 업로드합니다.
- 디스플레이가 대각선 픽셀, 선 팬, 격자선, 사각형 외곽선, 채워진 사각형을 순서대로 보여줍니다.
드로잉 메서드 참조
| 메서드 호출 | 그리는 내용 | 비고 |
|---|---|---|
| oled.pixel(x, y, 1) | (x, y)에 단일 픽셀 | 0 = 끄기, 1 = 켜기 |
| oled.line(x1, y1, x2, y2, 1) | 두 점 사이에 선 | 브레즌햄 알고리즘 |
| oled.hline(x, y, w, 1) | 폭 w의 수평선 | 수평에서 line()보다 빠름 |
| oled.vline(x, y, h, 1) | 높이 h의 수직선 | 수직에서 line()보다 빠름 |
| oled.rect(x, y, w, h, 1) | 사각형 외곽선 | (x, y)에 왼쪽 상단 모서리 |
| oled.fill_rect(x, y, w, h, 1) | 채워진 사각형 | rect()와 동일한 매개변수 |
ESP32 코드 — 텍스트 스크롤
실행해보기
- Thonny IDE로 코드를 업로드합니다.
- 디스플레이가 오른쪽, 왼쪽, 오른쪽 대각선, 왼쪽 대각선 순으로 스크롤하고 반복합니다.
하드웨어 스크롤 참조
| 메서드 호출 | 스크롤 방향 | 비고 |
|---|---|---|
| oled.scroll_right(0x00, 0x07) | 오른쪽 | 페이지 0–7 = 64px 디스플레이의 모든 행 |
| oled.scroll_left(0x00, 0x07) | 왼쪽 | 페이지 0–7 = 전체 화면 높이 |
| oled.scroll_diag_right(0x00, 0x07) | 오른쪽 대각선(오른쪽 + 아래) | 수평 및 수직 스크롤 결합 |
| oled.scroll_diag_left(0x00, 0x07) | 왼쪽 대각선(왼쪽 + 아래) | 수평 및 수직 스크롤 결합 |
| oled.stop_scroll() | 스크롤 중지 | 새 내용 그리기 전 호출 |
참고: 새 스크롤 내용을 업데이트하려면 스크롤을 시작하기 전에 프레임버퍼를 수정(예: oled.fill() + oled.show() 호출)하세요. 새 드로잉 명령을 보내기 전에 항상 stop_scroll()을 호출하세요.
ESP32 코드 — 대비 및 어둡게 하기
실행해보기
- Thonny IDE로 코드를 업로드합니다.
- 디스플레이 밝기가 올라갔다 내려갔다 하며, 어두운 상태와 전체 밝기 상태를 번갈아 보여줍니다.
대비 및 어둡게 하기 참조
| 메서드 호출 | 효과 | 비고 |
|---|---|---|
| oled.set_contrast(0) | 최소 밝기 | 값 범위 0–255 |
| oled.set_contrast(128) | 중간 밝기 | 값은 dim/restore용으로 내부에 저장됨 |
| oled.set_contrast(255) | 최대 밝기 | 초기화 후 기본값은 0xCF (207) |
| oled.dim(True) | 대비를 0으로 낮추기 (어둡게) | 저장된 대비 값은 수정되지 않음 |
| oled.dim(False) | 저장된 대비 복원 | set_contrast()로 설정한 값 복원 |
| oled.invert(True) | 하드웨어 수준에서 모든 픽셀 반전 | 프레임버퍼 변경 없음 |
| oled.invert(False) | 일반 픽셀 극성 복원 | — |
ESP32 코드 — 비트맵
실행해보기
- Thonny IDE로 코드를 업로드합니다.
- 디스플레이 중앙에 16×16 하트 아이콘이 나타납니다. 일반 프레임과 반전된 프레임이 번갈아 표시됩니다.
비트맵 드로잉 참조
| 메서드 호출 | 설명 | 비고 |
|---|---|---|
| framebuf.FrameBuffer(data, w, h, framebuf.MONO_HMSB) | 원시 바이트를 비트맵 FrameBuffer로 래핑 | 행 우선 MSB 우선 데이터에 MONO_HMSB 사용 |
| oled.blit(icon_fb, x, y) | (x, y)에 디스플레이 프레임버퍼로 비트맵 복사 | 모든 픽셀이 복사됨 (투명도 없음) |
| oled.blit(icon_fb, x, y, 1) | key=1로 blit — 값 1인 픽셀 건너뜀 | 채워진 배경에서 XOR 스타일 효과에 유용 |
비트맵 데이터 저장 방법: 각 행은 왼쪽에서 오른쪽으로, 최상위 비트 우선(MONO_HMSB)으로 저장됩니다. 행당 바이트 수는 ceil(width / 8)입니다. 16픽셀 너비 이미지의 경우 행당 2바이트입니다.
라이브러리 참조
전체 API 문서(모든 생성자, 메서드, 상수 포함)는 DIYables MicroPython OLED SSD1309 라이브러리 참조를 확인하세요.
다음 단계
- DHT11 또는 DHT22 센서와 결합하여 실시간 온도 및 습도 측정값을 표시해보세요.
- 버튼을 추가하여 여러 디스플레이 화면 사이를 순환해보세요.
- framebuf.FrameBuffer.blit()을 사용하여 애니메이션 스프라이트 디스플레이를 만들어보세요.