ESP32 MicroPython OLED SSD1309

ESP32는 IoT 및 임베디드 프로젝트에 널리 사용되는 강력한 Wi-Fi 지원 마이크로컨트롤러입니다. MicroPython과 DIYables OLED SSD1309 라이브러리를 결합하면 선명한 단색 OLED 디스플레이를 프로젝트에 손쉽게 추가할 수 있습니다.

이 튜토리얼에서 다루는 내용:

ESP32 마이크로파이썬 oLED ssd1309

필요한 부품

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에 연결
oLED ssd1309 핀아웃

배선

ESP32는 3.3V 로직으로 동작하며, SSD1309 디스플레이와 호환됩니다.

OLED SSD1309 ESP32 비고
SDA GPIO21 I2C 데이터
SCL GPIO22 I2C 클럭
VCC 3.3V 전원
GND GND 접지
  • 브레드보드를 사용한 ESP32와 SSD1309 OLED 128x64 디스플레이 연결 방법
ESP32 ssd1309 oLED 128x64 배선도

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

ESP32와 ssd1309 oLED 연결 방법

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

팁: ESP32의 사용 가능한 I2C 지원 GPIO 핀을 자유롭게 사용할 수 있습니다. 코드에서 SCL_PINSDA_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 버튼을 클릭하여 라이브러리를 설치합니다.
ESP32 oLED ssd1309 라이브러리
  • 제공된 MicroPython 코드를 복사하여 Thonny 편집기에 붙여넣습니다.
  • 다음 방법으로 코드를 ESP32에 저장합니다:
    • Save 버튼을 클릭하거나 Ctrl+S를 누릅니다.
    • 저장 대화상자에서 MicroPython device를 선택합니다.
    • 파일 이름을 main.py로 지정합니다.
  • 녹색 Run 버튼을 클릭하거나 F5를 눌러 스크립트를 실행합니다.
  • 결과를 관찰합니다 — OLED 디스플레이에 텍스트와 그래픽이 나타나야 합니다.

기본 코드 템플릿

from machine import I2C, Pin from DIYables_MicroPython_OLED_SSD1309 import OLED_SSD1309 # Pin configuration — change to match your wiring SCL_PIN = 22 # GPIO22 SDA_PIN = 21 # GPIO21 SCREEN_WIDTH = 128 SCREEN_HEIGHT = 64 SCREEN_ADDRESS = 0x3C i2c = I2C(0, scl=Pin(SCL_PIN), sda=Pin(SDA_PIN), freq=400_000) oled = OLED_SSD1309(SCREEN_WIDTH, SCREEN_HEIGHT, i2c, addr=SCREEN_ADDRESS) # Clear the display, draw something, then push to screen oled.fill(0) oled.text("Hello, World!", 0, 0) oled.show()

ESP32 코드 — Hello World

""" Example: Hello World – basic text on SSD1309 OLED Works with: ESP32 Product page: https://diyables.io/products/2.4-inch-oled-display-module-ssd1309-128x64 Wiring guide: ESP32: OLED SSD1309 ESP32 ──────────── ────────── SDA -> GPIO21 SCL -> GPIO22 VCC -> 3.3V GND -> GND """ from machine import I2C, Pin from DIYables_MicroPython_OLED_SSD1309 import OLED_SSD1309 # ── Pin configuration ──────────────────────────────────────────────────────── SCL_PIN = 22 # GPIO22 SDA_PIN = 21 # GPIO21 SCREEN_WIDTH = 128 SCREEN_HEIGHT = 64 SCREEN_ADDRESS = 0x3C # ── Setup ──────────────────────────────────────────────────────────────────── i2c = I2C(0, scl=Pin(SCL_PIN), sda=Pin(SDA_PIN), freq=400_000) oled = OLED_SSD1309(SCREEN_WIDTH, SCREEN_HEIGHT, i2c, addr=SCREEN_ADDRESS) # ── Draw ───────────────────────────────────────────────────────────────────── oled.fill(0) # Line 1 – normal 8×8 font oled.text("Hello, World!", 0, 0) # Line 3 oled.text("DIYables", 0, 16) # Line 4 oled.text("SSD1309 OLED", 0, 32) oled.text("128 x 64", 0, 40) oled.show()

실행해보기

  • 위 배선도에 따라 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 코드 — 도형 그리기

""" Example: Draw Shapes – lines, rectangles, and circles on SSD1309 OLED Works with: ESP32 Product page: https://diyables.io/products/2.4-inch-oled-display-module-ssd1309-128x64 Wiring guide: ESP32: OLED SSD1309 ESP32 ──────────── ────────── SDA -> GPIO21 SCL -> GPIO22 VCC -> 3.3V GND -> GND Note: framebuf.FrameBuffer provides: pixel, fill, fill_rect, rect, line, hline, vline, text, blit, scroll, and (on newer MicroPython) ellipse & poly. Circles and triangles require manual drawing or the ellipse/poly helpers. """ from machine import I2C, Pin from DIYables_MicroPython_OLED_SSD1309 import OLED_SSD1309 import time # ── Pin configuration ──────────────────────────────────────────────────────── SCL_PIN = 22 # GPIO22 SDA_PIN = 21 # GPIO21 SCREEN_WIDTH = 128 SCREEN_HEIGHT = 64 SCREEN_ADDRESS = 0x3C # ── Setup ──────────────────────────────────────────────────────────────────── i2c = I2C(0, scl=Pin(SCL_PIN), sda=Pin(SDA_PIN), freq=400_000) oled = OLED_SSD1309(SCREEN_WIDTH, SCREEN_HEIGHT, i2c, addr=SCREEN_ADDRESS) def demo_pixels(): """Scatter individual pixels diagonally.""" oled.fill(0) w, h = SCREEN_WIDTH, SCREEN_HEIGHT for i in range(0, w, 4): oled.pixel(i, i * h // w, 1) oled.show() time.sleep_ms(1500) def demo_lines(): """Fan of lines from the top-left corner. """ oled.fill(0) w, h = SCREEN_WIDTH, SCREEN_HEIGHT for i in range(0, w, 8): oled.line(0, 0, i, h - 1, 1) for i in range(0, h, 8): oled.line(0, 0, w - 1, i, 1) oled.show() time.sleep_ms(1500) def demo_h_v_lines(): """Horizontal and vertical lines.""" oled.fill(0) w, h = SCREEN_WIDTH, SCREEN_HEIGHT # horizontal lines for y in range(0, h, 8): oled.hline(0, y, w, 1) # vertical lines for x in range(0, w, 16): oled.vline(x, 0, h, 1) oled.show() time.sleep_ms(1500) def demo_rectangles(): """Nested rectangle outlines. """ oled.fill(0) w, h = SCREEN_WIDTH, SCREEN_HEIGHT for i in range(0, h // 2, 4): oled.rect(i, i, w - 2 * i, h - 2 * i, 1) oled.show() time.sleep_ms(1500) def demo_filled_rects(): """Alternating filled rectangles.""" oled.fill(0) w, h = SCREEN_WIDTH, SCREEN_HEIGHT for i in range(0, h // 2, 6): color = 1 if (i // 6) % 2 == 0 else 0 oled.fill_rect(i, i, w - 2 * i, h - 2 * i, color) oled.show() time.sleep_ms(1500) def demo_ellipse(): """Ellipses (requires MicroPython 1.20+ for framebuf.ellipse). """ oled.fill(0) cx, cy = SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 try: for r in range(4, min(cx, cy), 8): oled.ellipse(cx, cy, r, r, 1) # circle outline oled.show() except AttributeError: # ellipse not available; fall back to a manual Bresenham circle _draw_circle(cx, cy, 20, 1) oled.show() time.sleep_ms(1500) def _draw_circle(cx, cy, r, c): """Bresenham circle (fallback when framebuf.ellipse is unavailable).""" x, y, err = r, 0, 1 - r while x >= y: for dx, dy in [(x, y), (y, x), (-y, x), (-x, y), (-x, -y), (-y, -x), (y, -x), (x, -y)]: oled.pixel(cx + dx, cy + dy, c) y += 1 if err < 0: err += 2 * y + 1 else: x -= 1 err += 2 * (y - x) + 1 # ── Main loop ──────────────────────────────────────────────────────────────── while True: demo_pixels() demo_lines() demo_h_v_lines() demo_rectangles() demo_filled_rects() demo_ellipse() """

실행해보기

  • 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 코드 — 텍스트 스크롤

""" Example: Scroll Text – hardware scrolling on SSD1309 OLED Works with: ESP32 Product page: https://diyables.io/products/2.4-inch-oled-display-module-ssd1309-128x64 Wiring guide: ESP32: OLED SSD1309 ESP32 ──────────── ────────── SDA -> GPIO21 SCL -> GPIO22 VCC -> 3.3V GND -> GND """ from machine import I2C, Pin from DIYables_MicroPython_OLED_SSD1309 import OLED_SSD1309 import time # ── Pin configuration ──────────────────────────────────────────────────────── SCL_PIN = 22 # GPIO22 SDA_PIN = 21 # GPIO21 SCREEN_WIDTH = 128 SCREEN_HEIGHT = 64 SCREEN_ADDRESS = 0x3C # ── Setup ──────────────────────────────────────────────────────────────────── i2c = I2C(0, scl=Pin(SCL_PIN), sda=Pin(SDA_PIN), freq=400_000) oled = OLED_SSD1309(SCREEN_WIDTH, SCREEN_HEIGHT, i2c, addr=SCREEN_ADDRESS) # ── Draw static content ─────────────────────────────────────────────────────── oled.fill(0) oled.text("DIYables", 20, 28) # centred-ish on 128×64 oled.show() time.sleep_ms(2000) # ── Scroll loop ─────────────────────────────────────────────────────────────── while True: # Scroll right across all pages (0–7) oled.scroll_right(0x00, 0x07) time.sleep_ms(3000) oled.stop_scroll() time.sleep_ms(500) # Scroll left oled.scroll_left(0x00, 0x07) time.sleep_ms(3000) oled.stop_scroll() time.sleep_ms(500) # Diagonal scroll right oled.scroll_diag_right(0x00, 0x07) time.sleep_ms(3000) oled.stop_scroll() time.sleep_ms(500) # Diagonal scroll left oled.scroll_diag_left(0x00, 0x07) time.sleep_ms(3000) oled.stop_scroll() time.sleep_ms(500)

실행해보기

  • 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 코드 — 대비 및 어둡게 하기

""" Example: Contrast & Dim – contrast control on SSD1309 OLED Works with: ESP32 Product page: https://diyables.io/products/2.4-inch-oled-display-module-ssd1309-128x64 Wiring guide: ESP32: OLED SSD1309 ESP32 ──────────── ────────── SDA -> GPIO21 SCL -> GPIO22 VCC -> 3.3V GND -> GND """ from machine import I2C, Pin from DIYables_MicroPython_OLED_SSD1309 import OLED_SSD1309 import time # ── Pin configuration ──────────────────────────────────────────────────────── SCL_PIN = 22 # GPIO22 SDA_PIN = 21 # GPIO21 SCREEN_WIDTH = 128 SCREEN_HEIGHT = 64 SCREEN_ADDRESS = 0x3C # ── Setup ──────────────────────────────────────────────────────────────────── i2c = I2C(0, scl=Pin(SCL_PIN), sda=Pin(SDA_PIN), freq=400_000) oled = OLED_SSD1309(SCREEN_WIDTH, SCREEN_HEIGHT, i2c, addr=SCREEN_ADDRESS) # ── Draw a test pattern ─────────────────────────────────────────────────────── oled.fill(0) oled.fill_rect(0, 0, 64, 32, 1) # top-left filled block oled.fill_rect(64, 32, 64, 32, 1) # bottom-right filled block oled.text("Contrast Demo", 8, 28) # label over the blocks oled.show() time.sleep_ms(2000) # ── Contrast / dim loop ─────────────────────────────────────────────────────── while True: # Gradually increase contrast 0 → 255 for c in range(0, 256, 5): oled.set_contrast(c) time.sleep_ms(30) time.sleep_ms(1000) # Gradually decrease contrast 255 → 0 for c in range(255, -1, -5): oled.set_contrast(c) time.sleep_ms(30) time.sleep_ms(1000) # Dim on / off toggle oled.dim(True) time.sleep_ms(2000) oled.dim(False) time.sleep_ms(2000)

실행해보기

  • 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 코드 — 비트맵

""" Example: Bitmap – display a monochrome bitmap image on SSD1309 OLED Works with: ESP32 Product page: https://diyables.io/products/2.4-inch-oled-display-module-ssd1309-128x64 Wiring guide: ESP32: OLED SSD1309 ESP32 ──────────── ────────── SDA -> GPIO21 SCL -> GPIO22 VCC -> 3.3V GND -> GND How bitmap drawing works: framebuf.FrameBuffer.blit() copies one FrameBuffer onto another. Bitmap data must be stored row-by-row, MSB first → use framebuf.MONO_HMSB. The blit() call then handles the conversion into the display's MONO_VLSB layout automatically. """ import framebuf from machine import I2C, Pin from DIYables_MicroPython_OLED_SSD1309 import OLED_SSD1309 import time # ── Pin configuration ──────────────────────────────────────────────────────── SCL_PIN = 22 # GPIO22 SDA_PIN = 21 # GPIO21 SCREEN_WIDTH = 128 SCREEN_HEIGHT = 64 SCREEN_ADDRESS = 0x3C # ── Bitmap data – 16 × 16 heart, stored row-by-row MSB first ───────────────── # Each row uses 2 bytes (ceil(16 / 8) = 2). HEART_W = 16 HEART_H = 16 heart_data = bytearray([ 0x00, 0x00, # ................ 0x0C, 0x30, # ....##....##.... 0x1E, 0x78, # ...####..####... 0x3F, 0xFC, # ..############.. 0x7F, 0xFE, # .##############. 0x7F, 0xFE, # .##############. 0xFF, 0xFF, # ################ 0xFF, 0xFF, # ################ 0xFF, 0xFF, # ################ 0x7F, 0xFE, # .##############. 0x3F, 0xFC, # ..############.. 0x1F, 0xF8, # ...##########... 0x0F, 0xF0, # ....########.... 0x07, 0xE0, # .....######..... 0x03, 0xC0, # ......####...... 0x01, 0x80, # .......##....... ]) # ── Setup ──────────────────────────────────────────────────────────────────── i2c = I2C(0, scl=Pin(SCL_PIN), sda=Pin(SDA_PIN), freq=400_000) oled = OLED_SSD1309(SCREEN_WIDTH, SCREEN_HEIGHT, i2c, addr=SCREEN_ADDRESS) # Wrap the raw bytes in a FrameBuffer using MONO_HMSB (row-major, MSB first) heart_fb = framebuf.FrameBuffer(heart_data, HEART_W, HEART_H, framebuf.MONO_HMSB) # ── Draw and animate ────────────────────────────────────────────────────────── while True: # Draw the heart centred on the display x = (SCREEN_WIDTH - HEART_W) // 2 y = (SCREEN_HEIGHT - HEART_H) // 2 oled.fill(0) oled.blit(heart_fb, x, y) oled.text("DIYables", 24, 50) oled.show() time.sleep_ms(800) # Invert colours for a "pulse" effect oled.fill(1) oled.blit(heart_fb, x, y, 1) # key=1 → blit only pixels that are OFF in source oled.show() time.sleep_ms(400)

실행해보기

  • 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()을 사용하여 애니메이션 스프라이트 디스플레이를 만들어보세요.