#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
- I2C 통신을 위한
Wire
라이브러리, 그래픽 처리를 위한 Adafruit_GFX
, OLED 제어를 위한 Adafruit_SSD1306
라이브러리를 포함한다.
#include "images.h" // 이미지 파일을 포함하는 헤더 파일
-
images.h
는 미리 준비한 이미지 데이터를 C 배열 형태로 포함하는 헤더 파일이다. 여기에는 VeryGood
, Good
, Bad
, VeryBad
배열이 정의되어 있다.
#define SCREEN_WIDTH 128 // OLED 디스플레이의 너비 (픽셀 단위)
#define SCREEN_HEIGHT 32 // OLED 디스플레이의 높이 (픽셀 단위)
- OLED 디스플레이의 해상도를 정의한다. 이 프로젝트에서는 128x32 OLED를 사용한다.
#define OLED_RESET -1 // 리셋 핀 번호 (아두이노 리셋 핀을 공유하는 경우 -1)
#define SCREEN_ADDRESS 0x3C // I2C 주소: 128x64는 0x3D, 128x32는 0x3C
- OLED 디스플레이의 I2C 통신 주소와 리셋 핀을 설정한다.
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
- 지정한 해상도와 Wire(I2C) 객체, 리셋 핀으로 OLED 디스플레이 객체
display
를 생성한다.
void setup() {
Serial.begin(115200);
- 시리얼 모니터를 위한 통신 속도를 115200bps로 설정한다.
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;)
; // OLED 초기화 실패 시, 무한 루프로 진행 정지
}
- OLED 디스플레이를 초기화한다.
SSD1306_SWITCHCAPVCC
는 내부 3.3V 전원으로 공급하고, 지정된 I2C 주소로 통신한다. 초기화 실패 시 시리얼 모니터에 에러 메시지를 출력하고 무한 루프에 빠지게 한다.
display.display();
delay(2000); // 2초간 Adafruit 스플래시 화면 표시
- 초기 화면(Adafruit 로고 등)을 표시하고 2초간 대기한다.
display.clearDisplay(); // OLED 디스플레이를 지운다
display.drawBitmap(
0, 0,
VeryGood, 32, 32, 1); // (0,0) 좌표에 VeryGood 이미지를 출력
-
images.h
에서 정의한 VeryGood 이미지를 좌측 상단 (0,0) 좌표에 출력한다. 크기는 32x32, 색상은 흰색(1)으로 지정한다.
display.drawBitmap(
32, 0,
Good, 32, 32, 1); // (32,0) 좌표에 Good 이미지 출력
-
Good
이미지를 x=32, y=0 위치에 출력한다.
display.drawBitmap(
64, 0,
Bad, 32, 32, 1); // (64,0) 좌표에 Bad 이미지 출력
-
Bad
이미지를 x=64, y=0 위치에 출력한다.
display.drawBitmap(
96, 0,
VeryBad, 32, 32, 1); // (96,0) 좌표에 VeryBad 이미지 출력
-
VeryBad
이미지를 x=96, y=0 위치에 출력한다.
display.display(); // 디스플레이에 출력된 내용을 갱신하여 표시한다
- 버퍼에 그려진 이미지를 OLED 화면에 실제로 표시한다.
- 본 예제에서는 루프에서 반복 동작을 하지 않는다. 즉,
setup()
에서 한 번 이미지를 그리고 끝난다.
-
역할: ESP32로 공공데이터(미세먼지 등) 아이콘을 OLED에 출력하는 기본 코드이다.
-
포인트: I2C 통신으로 SSD1306 OLED 초기화, images.h의 C 배열 이미지 출력, 초기화 실패 대비 루프 처리.