ESP32, OLED (한글 출력 하기)

OLED

종류

ESP32나 Arduino에서 사용할 수 있는 oled의 종류는 매우 많지만, 주로 128*64 픽셀을 가진 0.96인치, 1.3인치의 SSD1306, SH1106 컨트롤러를 사용한 oled가 판매되고 있으며, 통신 프로토콜은 I2C나 SPI를 사용한다. oled 모듈 구입시 픽셀수, 컨트롤러 및 통신프로토콜을 잘 알아두어야 스케치 작성시 참고할 수 있음에 유의한다. I2C 방식은 GPIO를 2개만 사용하여 구성이 쉽다는 장점이 있고, SPI방식은 4~5개의 GPIO를 사용하지만 속도가 빠르다는 장점이 있다. 겉모습만으로는 컨트롤러를 확인하기는 어렵다.

I2C SPI

이밖에도 U8g2 라이브러리에서 사용가능한 다양한 oled의 종류를 아래 링크에서 확인할 수 있다.

Constructor Reference for U8g2 library



SPI OLED

pinmap

OLED ESP32 (HW_SPI로 사용시) (VSPI) (I2C겸용보드인 경우)
GND GND
VDD 3.3V
D0 18 (HW_SPI 사용시 GPIO_18로 고정) SCK/CLK/CLOCK SCL
D1 23 (HW_SPI 사용시 GPIO_23으로 고정) DATA/DIN/MOSI SDA
RES 15 RST/RESET
DC 14 Data Command
CS 5 Chip Select

※ HW_SPI로 사용하는 경우에는 D0, D1의 핀번호를 바꿀 수 없으며, SW_SPI로 사용하는 경우에는 사용되는 모든 핀의 번호를 임의로 지정하여 사용할 수 있다.


schematic

  • SW_SPI 연결시에는 스케치에서 지정하는 GPIO핀에 연결한다.
  • HW_SPI로 연결할 때의 회로도는 아래 그림과 같다.


sketch

oled를 SPI로 연결하는 경우, 다음을 추가해야 한다.

1
#include <SPI.h>

sketch: SH1106, HW_SPI

HW_SPI를 사용하는 경우에는 D0(CLK), D1(MOSI)을 ESP32에 지정된 핀으로 사용하기 때문에, 나머지 3개의 핀만 sketch에서 지정해주면 된다.

1
2
// for HW_SPI (VSPI)
U8G2_SH1106_128X64_NONAME_F_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 5, /* dc=*/ 14, /* reset=*/ 15);

sketch: SH1106, SW_SPI

SW_SPI를 사용하는 경우, 4~5개의 핀을 sketch에 지정해주어야 한다.

1
2
// for SW_SPI
U8G2_SH1106_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 26, /* data=*/ 25, /* cs=*/ 5, /* dc=*/ 14, /* reset=*/ 15);

sketch: SSD1306, HW_SPI

SSD1306을 사용하는 oled의 경우 U8G2_SH1106_~ 부분을 U8G2_SSD1306_~ 으로 수정하여 사용한다. 자세한 옵션은 Constructor Reference for U8g2 library에서 확인할 수 있다.

1
2
// for HW_SPI (VSPI)
U8G2_SSD1306_128X64_NONAME_F_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 5, /* dc=*/ 14, /* reset=*/ 15);

sketch: SSD1306, SW_SPI

SW_SPI를 사용하는 경우, 4~5개의 핀을 sketch에 지정해주어야 한다.

1
2
// for SW_SPI
U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 26, /* data=*/ 25, /* cs=*/ 5, /* dc=*/ 14, /* reset=*/ 15);


I2C OLED

pinmap

OLED ESP32
GND GND
VDD 3.3V
SDA 21 (HW_I2C 사용시 GPIO_21로 고정)
SCL 22 (HW_I2C 사용시 GPIO_22으로 고정)

schematic


sketch

sketch: SH1106, HW_I2C

HW_I2C를 사용하는 경우에는 SDA, SCL을 ESP32에 지정된 핀으로 사용하기 때문에, 구동 드라이버만 지정해주면 된다.

1
2
// for SH1106,  I2C, (ESP32: SDA 21, SCL 22)
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

sketch: SSD1306, HW_I2C
1
2
// for SSD1306, I2C, (ESP32: SDA 21, SCL 22)
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);


U8g2 라이브러리

ESP32나 Arduino에서 OLED를 사용을 위한 대표적인 라이브러리는 3~4가지 정도이다.

  • U8glib
  • U8g2
  • Adafruit SSD1306
  • UTF8_HanDraw

이들 중에서도 특히 U8glib와 Adafruit SSD1306 라이브러리가 가장 많이 사용되고 있다. 그렇지만 한글 출력이 쉽지 않다는 단점이 있으며, U8glib는 현재 개발이 중단된 상태이기도 하다. U8g2는 U8glib를 이어 새롭게 개발되는 라이브러리이며, U8glib의 기능을 모두 포함하고 있으므로 접근이 용이하다. 그러므로 여기서는 U8g2 라이브러리를 중심으로 ESP32에서 OLED를 사용하는 방법을 알아보고, 이에 더하여 한글 출력이 용이한 UTF8_HanDraw를 사용해보도록 한다.


사용 방법

라이브러리 설치
  • 스케치> 라이브러리 포함하기> 라이브러리 관리> u8g2 검색 후 설치 클릭


U8g2 reference

U8g2 라이브러리 사용에 필요한 명령어들은 u8g2reference · olikraus/u8g2 Wiki · GitHub 를 참고한다.


sketch

  • SH1106 드라이버를 사용하여 HW_SPI로 OLED 출력을 수행할 경우, 아래와 같은 예제를 사용해볼 수 있다.

  • 실제 사용하는 OLED 드라이버와 통신 프로토콜에 따라 sketch를 수정해서 사용해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <Arduino.h>
#include <U8g2lib.h>

// for SPI
#include <SPI.h>

// for using Korean NanumGothicCoding font
//#include "u8g2_font_unifont_t_korean_NanumGothicCoding_16.h"

// Please UNCOMMENT one of the contructor lines below
// U8g2 Contructor List (Frame Buffer)
// The complete list is available here: https://github.com/olikraus/u8g2/wiki/u8g2setupcpp
// Please update the pin numbers according to your setup. Use U8X8_PIN_NONE if the reset pin is not connected

// for HW_SPI (VSPI)
U8G2_SH1106_128X64_NONAME_F_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 5, /* dc=*/ 14, /* reset=*/ 15);
// for SW_SPI
//U8G2_SH1106_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 26, /* data=*/ 25, /* cs=*/ 5, /* dc=*/ 14, /* reset=*/ 15);
// for SSD1306, I2C, (ESP32: SDA 21, SCL 22)
//U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
// for SH1106, I2C, (ESP32: SDA 21, SCL 22)
//U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setup() {
u8g2.begin();
u8g2.enableUTF8Print(); // enable UTF8 support for the Arduino print() function
}

void loop() {
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_ncenB14_tr);
u8g2.drawStr(0,15, "SKS STEAM!");
u8g2.drawTriangle(27,50, 64,32, 100,50);
} while ( u8g2.nextPage() );
delay(1000);
}

기본 사용 선언

void setup() 내에 U8g2 라이브러리를 사용하여 oled를 사용하는 것을 선언 한다.

1
u8g2.begin();

폰트
  • 폰트는 u8g2_font_ncenB14_tr를 사용하고 있는데, fntlist8 · olikraus/u8g2 Wiki · GitHub에서 글자 크기별로 사용 가능한 폰트 목록을 확인할 수 있다.
  • 폰트명에 ncenB14가 포함되어 있으므로 폰트(세로) 픽셀수가 14 라는 것을 알 수 있다.
1
u8g2.setFont(u8g2_font_ncenB14_tr);

drawing sheet 사용하여, 그림 그려보기

128X64 픽셀을 표시한 Drawing Sheet를 사용하여, 원하는 그림을 그려보자.

Drawing Sheet


drawStr
1
u8g2.drawStr(0,15, "SKS STEAM!")
  • drawStr를 통해 문자를 프린트할 수 있다.
  • 예제에서 사용한 0,15는 프린트할 문자열 “SKS STEAM!“ 중 맨 앞글자인 “S“의 왼쪽 아래 시작 픽셀을 의미한다.
  • 폰트사이즈가 14이므로 0,15 픽셀에서 시작하며, 0,1 픽셀까지 출력에 사용한다.
  • 만약 시작 픽셀을 0,14로 바꾸면, 0,0 픽셀까지 출력하므로, 문자를 올바르게 출력할 수 있다.
  • 만약 시작 픽셀을 0,13으로 2픽셀 위로 올리게되면 0,-1 픽셀까지 출력되므로, 글자의 맨 윗부분 1행 전체가 삭제된 상태로 출력된다.
  • 음수(-)를 허용하므로, 이를 적절히 이용하면 가로방향 또는 세로방향 스크롤로 사용할 수 있다.

drawTriangle
1
u8g2.drawTriangle(27,50, 64,32, 100,50);
  • U8g2 라이브러리에서 삼각형을 그릴때 사용하는 명령어이다.
  • 지정된 픽셀(128x64)내에 3쌍의 순서쌍으로 3개의 꼭지점을 지정하면 이에 맞춰 삼각형을 그린다. 여기서는 (27,50), (64,32), (100,50)이 꼭지점이다.

※ 그밖의 도형을 그리거나 글자 모양을 바꾸려면, u8g2reference · olikraus/u8g2 Wiki · GitHub 를 참고한다.


한글 사용하기

U8g2 라이브러리에서 한글을 사용하려면, 한글 폰트를 사용하여야 한다. 기본적으로 제공되는 한글 폰트는 2가지가 있다.

  • u8g2_font_unifont_t_korean1 : 사용가능한 글자가 제한되며, 용량이 17kB 정도

  • u8g2_font_unifont_t_korean2 : korean1폰트보다 사용가능한 글자수가 많으나, 용량이 70kB 정도

    1
    u8g2.setFont(u8g2_font_unifont_t_korean2);
  • 한글 사용을 위해 void setup()에 아래의 코드를 추가하여야 한다.

    1
    u8g2.enableUTF8Print();   // enable UTF8 support for the Arduino print() function

sketch: 한글 사용하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <Arduino.h>
#include <U8g2lib.h>

// for SPI
#include <SPI.h>

// Please UNCOMMENT one of the contructor lines below
// U8g2 Contructor List (Frame Buffer)
// The complete list is available here: https://github.com/olikraus/u8g2/wiki/u8g2setupcpp
// Please update the pin numbers according to your setup. Use U8X8_PIN_NONE if the reset pin is not connected

// for HW_SPI (VSPI)
U8G2_SH1106_128X64_NONAME_F_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 5, /* dc=*/ 14, /* reset=*/ 15);
// for SW_SPI
//U8G2_SH1106_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 26, /* data=*/ 25, /* cs=*/ 5, /* dc=*/ 14, /* reset=*/ 15);
// for SSD1306, I2C, (ESP32: SDA 21, SCL 22)
//U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
// for SH1106, I2C, (ESP32: SDA 21, SCL 22)
//U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setup(void)
{
u8g2.begin();
u8g2.enableUTF8Print();
}

void loop(void)
{
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_ncenB14_tr);
u8g2.drawStr(0, 15, "SKS STEAM!");
u8g2.drawTriangle(27,50, 64,32, 100,50);
} while ( u8g2.nextPage() );
delay(1000);

u8g2.firstPage();
do {
//u8g2.setFont(u8g2_font_unifont_t_korean1);
u8g2.setFont(u8g2_font_unifont_t_korean2);
u8g2.setFontDirection(0);
u8g2.clearBuffer();
u8g2.setCursor(0, 16);
u8g2.print("Hello!");
u8g2.setCursor(0, 40);
u8g2.print("안녕하세요.");
u8g2.sendBuffer();
} while ( u8g2.nextPage() );
delay(1000);
}

나눔고딕폰트 사용하기

  • (한글의 모든 글자를 사용해야 할 경우) U8g2 라이브러리에서 사용할 나눔고딕 폰트를 다운로드 (created by xyz37) 한다.

    u8g2_font_unifont_t_korean_NanumGothicCoding_16.h

    주의! 폰트 크기가 1.09MB이므로 메모리가 작은 아두이노에서는 위 폰트를 사용하기 어렵지만, ESP32에서 사용할 수 있다. U8g2에서 제공하는 폰트인 korean1이 17k, korean2는 70k이므로 아두이노를 사용해야하는 경우는, (모든 한글 글자를 표현할 수 없더라도) korean1이나 korean2 폰트를 사용해야 한다.


  • 다운로드 받은 나눔고딕 폰트 파일을 **”u8g2 라이브러리 폴더”**에 넣는다.


  • u8g2 라이브러리 폴더의 위치를 모를 경우,

    아래 그림과 같이 아두이노 IDE에서 파일> 환경설정 에서 스케치북 위치를 확인한 후,

(스케치북 위치)/libraries/U8g2/src/ 폴더를 찾아, 폰트 파일을 넣는다.


  • 위 폰트를 사용하려면 스케치에 다음을 포함해야 한다.

    1
    #include "u8g2_font_unifont_t_korean_NanumGothicCoding_16.h"
    1
    2
    3
    4
    void loop() {
    u8g2.setFont(u8g2_font_unifont_t_korean_NanumGothicCoding_16);

    }

sketch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <Arduino.h>
#include <U8g2lib.h>

// for SPI
#include <SPI.h>

// for using Korean NanumGothicCoding font
#include "u8g2_font_unifont_t_korean_NanumGothicCoding_16.h"

// Please UNCOMMENT one of the contructor lines below
// U8g2 Contructor List (Frame Buffer)
// The complete list is available here: https://github.com/olikraus/u8g2/wiki/u8g2setupcpp
// Please update the pin numbers according to your setup. Use U8X8_PIN_NONE if the reset pin is not connected

// for HW_SPI (VSPI)
U8G2_SH1106_128X64_NONAME_F_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 5, /* dc=*/ 14, /* reset=*/ 15);
// for SW_SPI
//U8G2_SH1106_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 26, /* data=*/ 25, /* cs=*/ 5, /* dc=*/ 14, /* reset=*/ 15);
// for SSD1306, I2C, (ESP32: SDA 21, SCL 22)
//U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
// for SH1106, I2C, (ESP32: SDA 21, SCL 22)
//U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setup(void)
{
u8g2.begin();
u8g2.enableUTF8Print();
}

void loop(void)
{
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_ncenB14_tr);
u8g2.drawStr(0, 15, "SKS STEAM!");
u8g2.drawTriangle(27,50, 64,32, 100,50);
} while ( u8g2.nextPage() );
delay(1000);

u8g2.firstPage();
do {
//u8g2.setFont(u8g2_font_unifont_t_korean1);
//u8g2.setFont(u8g2_font_unifont_t_korean2);
u8g2.setFont(u8g2_font_unifont_t_korean_NanumGothicCoding_16);
u8g2.setFontDirection(0);
u8g2.clearBuffer();
u8g2.setCursor(0, 16);
u8g2.print("Hello!");
u8g2.setCursor(0, 40);
u8g2.print("안녕하세요.");
u8g2.sendBuffer();
} while ( u8g2.nextPage() );
delay(1000);
}


비트맵 그림/사진 출력하기

OLED의 해상도(128×64)에 맞추어 그림이나 로고를 출력해보자. 윈도우 기준으로 설명하며, Mac의 경우 GIMP에서 비슷한 작업을 수행할 수 있다.


사진 or 로고 그림파일 준비

사진 픽셀수 조정

우선 oled에 출력하려는 작은 사진이나 로고 파일(.jpg or .png 등)을 준비한 뒤, 사용하는 oled의 해상도(예를들어 128×64) 고려하여 사진의 픽셀 수를 줄여야 한다. (※주의할 점: 화면상에 보이는 크기를 축소하는 것이 아니라 실제 픽셀수를 조정해야 함!)


  • 윈도우에서 그림판을 연다. (그림판3D 아님!) : 시작> Windows 보조프로그램> 그림판


  • 그림판 하단에 불러온 그림의 실제 픽셀수가 나타납니다. (픽셀수 오른쪽의 % 수치는 화면상에서 보이는 확대/축소 비율이므로, 여기서는 신경쓰지 않는다.)


  • Ctrl-A를 눌러 전체 그림을 선택하면 그림 겉테두리에 점선이 표시되는데, 이때 (파란색 동그라미 표시된) 사진 오른쪽 상단 모서리의 포인트를 마우스로 클릭하여 픽셀사이즈를 원본 그림의 비율에 맞추어 128x64 이하로 조정한다. 예시에서는 1000x1000px, 즉 1:1의 비율 그림이므로 64x64로 조정하였다. 캔버스 크기를 나타내는 1000x1000px 왼쪽에, 축소되는 그림의 픽셀수가 나타나므로, 이를 확인하면서 픽셀수를 64x64로 조정하면 된다.


  • 64x64px이 표시되어는 부분은, 마우스로 크기를 조정한 뒤에 클릭하고 있는 마우스 버튼에서 손을 떼는 순간 사라진다. (신경쓰지 않아도 됨)

  • 중요! 위 그림처럼 축소된 작은 그림(전체 캔버스가 아님!)의 테두리에 점선이 남아 있는 상태에서 Ctrl-c를 눌러, 축소된 그림만 클립보드에 복사한다.

  • 메뉴에서 파일> 새로 만들기>를 클릭한다.

    이때, 변경내용을 저장하시겠습니까? 팝업이 뜨면 저장 안 함 클릭 (저장을 해도 관계없으나, 원본파일이 사라짐)


  • 메뉴에서 파일> 속성> 을 클릭한 뒤


  • 이미지 속성에서 단위를 픽셀로 지정하고, 너비와 높이를 oled의 전체 픽셀 사이즈(128x64)로 조정한다.


  • 그림판에 128x64 크기의 캔버스가 나타난다. (화면상에 나타나는 크기가 너무 작아 확대/축소 비율을 100%로 조정함)


  • 위 상태에서 Ctrl-v를 클릭하여, 클립보드에 복사한 그림을 붙여넣기 한다.


  • 붙여넣은 그림을 마우스로 클릭하여 위치를 조정한다. 추가로 그림판의 텍스트 기능을 사용하여 글씨를 넣어보았다.


단색 1-bit 비트맵 bmp 파일로 저장하기
  • 이제 작업한 파일을 1-bit 비트맵 bmp 파일로 저장한다. 파일> 다른 이름으로 저장> BMP 그림 을 클릭한 뒤,

    )


  • 저장할 경로와 파일이름을 지정한 뒤, 파일 형식을 *단색 비트맵(.bmp; *dlb)**으로 지정하여 저장한다. (사진 품질 저하에 대한 경고를 확인하면 최종 저장 된다.)



※ Mac에서는 GIMP를 이용하여 단색 비트맵 파일로 저장할 수 있다.

링크 참고 - Creating monochrome bitmap files for LCD / GLIB using GIMP)


단색 bmp 파일을 hex파일로 변경하기

프로그램 설치

이제 아래와 같은 bitmap converter 프로그램을 사용하여, 단색 bmp 파일을 hex 파일로 변경한다. (여기서는 윈도우 기준으로 설명)


bmp → hex
  • LCD Assistant를 실행한 후,

    File> Load image> 를 클릭하여 위에서 제작한 단색 bmp 파일을 연다.


  • Byte orientation을 Horizontal로 변경한다. Size, Pixel/byte, Table name은 자동으로 지정되나, 만일 자동으로 설정되지 않는 경우, 아래와 같이 변경한다.
    • Size: OLED 픽셀수
    • Pixel/byte: 8
    • Table name: 스케치내에서 사용할 이름

  • File> Save output> 를 클릭하여 파일을 저장한다. 이때 파일 형식을 별도로 지정하지 않으며, 사용할 파일이름에 .h 또는 .txt 를 덧붙여 구분하여도 된다. 예시에서는 apeach.h 로 지정하였다.


  • 메모장이나 텍스트 에디터 등을 사용하여 apeach.h 파일을 열어보면, 단색 bmp 파일의 hex 코드를 볼 수 있다. 이제 이를 sketch에 반영하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
const unsigned char apeach [] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x10, 0x38, 0x00, 0xF0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x30, 0xC6, 0x01, 0x8C, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x21, 0x01, 0x02, 0x02, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x21, 0x10, 0x84, 0x22, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x42, 0x10, 0x84, 0x61, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x42, 0x00, 0x84, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x42, 0x00, 0x85, 0xF9, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x43, 0xFF, 0x86, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x40, 0x01, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x20, 0x01, 0x55, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x20, 0x01, 0xD6, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x10, 0x00, 0x38, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x61, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
0x00, 0x00, 0x0F, 0xF0, 0x90, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
0x00, 0x00, 0x18, 0x18, 0x90, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
0x00, 0x00, 0x23, 0xC4, 0x90, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
0x00, 0x00, 0x4C, 0x36, 0x90, 0x00, 0x24, 0x03, 0xD9, 0x9C, 0x0E, 0x07, 0xB0, 0xF3, 0x38, 0x00,
0x00, 0x00, 0xD8, 0x1A, 0x90, 0x00, 0x24, 0x07, 0xF9, 0xFE, 0x1F, 0x8F, 0xF1, 0xF3, 0x7C, 0x00,
0x00, 0x00, 0x93, 0xCB, 0xF0, 0x00, 0x28, 0x0E, 0x39, 0xC7, 0x31, 0x9C, 0x73, 0x83, 0x8C, 0x00,
0x00, 0x00, 0xA6, 0x25, 0x30, 0x00, 0x28, 0x0C, 0x19, 0x83, 0x21, 0x98, 0x33, 0x03, 0x0C, 0x00,
0x00, 0x00, 0xA4, 0x35, 0xD0, 0x00, 0x20, 0x0C, 0x19, 0x83, 0x7F, 0x98, 0x33, 0x03, 0x0C, 0x00,
0x00, 0x00, 0xA4, 0x96, 0x10, 0x00, 0x20, 0x0C, 0x19, 0x83, 0x3E, 0x18, 0x33, 0x03, 0x0C, 0x00,
0x00, 0x00, 0x97, 0x94, 0x10, 0xFC, 0x20, 0x0E, 0x39, 0xC7, 0x30, 0x9C, 0x73, 0x83, 0x0C, 0x00,
0x00, 0x00, 0x90, 0x34, 0x10, 0x84, 0x20, 0x07, 0xF9, 0xFE, 0x3F, 0x8F, 0xF1, 0xF3, 0x0C, 0x00,
0x00, 0x00, 0x48, 0x24, 0x10, 0x84, 0x20, 0x03, 0xD9, 0xBC, 0x0F, 0x07, 0xB0, 0xF3, 0x0C, 0x00,
0x00, 0x00, 0x47, 0xCC, 0x11, 0x04, 0x40, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x30, 0x18, 0x09, 0x02, 0x40, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x1C, 0x30, 0x06, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

스케치에 이미지 hex 코드 넣기

sketch

위에서 만든 어피치로고와 함께 학교로고를 추가로 만들고, 2개의 이미지를 OLED에 3초씩 출력하는 코드이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include <Arduino.h>
#include <U8g2lib.h>

#include <SPI.h> // for SPI

// #include "u8g2_font_unifont_t_korean_NanumGothicCoding_16.h" // for using Korean NanumGothicCoding font

// Please UNCOMMENT one of the contructor lines below
// U8g2 Contructor List (Frame Buffer)
// The complete list is available here: https://github.com/olikraus/u8g2/wiki/u8g2setupcpp
// Please update the pin numbers according to your setup. Use U8X8_PIN_NONE if the reset pin is not connected

// for HW_SPI (VSPI)
U8G2_SH1106_128X64_NONAME_F_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 5, /* dc=*/ 14, /* reset=*/ 15);
// for SW_SPI
//U8G2_SH1106_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 26, /* data=*/ 25, /* cs=*/ 5, /* dc=*/ 14, /* reset=*/ 15);
// for SSD1306, I2C, (ESP32: SDA 21, SCL 22)
//U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
// for SH1106, I2C, (ESP32: SDA 21, SCL 22)
//U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

const unsigned char apeach [] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x10, 0x38, 0x00, 0xF0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x30, 0xC6, 0x01, 0x8C, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x21, 0x01, 0x02, 0x02, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x21, 0x10, 0x84, 0x22, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x42, 0x10, 0x84, 0x61, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x42, 0x00, 0x84, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x42, 0x00, 0x85, 0xF9, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x43, 0xFF, 0x86, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x40, 0x01, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x20, 0x01, 0x55, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x20, 0x01, 0xD6, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x10, 0x00, 0x38, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x61, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
0x00, 0x00, 0x0F, 0xF0, 0x90, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
0x00, 0x00, 0x18, 0x18, 0x90, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
0x00, 0x00, 0x23, 0xC4, 0x90, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
0x00, 0x00, 0x4C, 0x36, 0x90, 0x00, 0x24, 0x03, 0xD9, 0x9C, 0x0E, 0x07, 0xB0, 0xF3, 0x38, 0x00,
0x00, 0x00, 0xD8, 0x1A, 0x90, 0x00, 0x24, 0x07, 0xF9, 0xFE, 0x1F, 0x8F, 0xF1, 0xF3, 0x7C, 0x00,
0x00, 0x00, 0x93, 0xCB, 0xF0, 0x00, 0x28, 0x0E, 0x39, 0xC7, 0x31, 0x9C, 0x73, 0x83, 0x8C, 0x00,
0x00, 0x00, 0xA6, 0x25, 0x30, 0x00, 0x28, 0x0C, 0x19, 0x83, 0x21, 0x98, 0x33, 0x03, 0x0C, 0x00,
0x00, 0x00, 0xA4, 0x35, 0xD0, 0x00, 0x20, 0x0C, 0x19, 0x83, 0x7F, 0x98, 0x33, 0x03, 0x0C, 0x00,
0x00, 0x00, 0xA4, 0x96, 0x10, 0x00, 0x20, 0x0C, 0x19, 0x83, 0x3E, 0x18, 0x33, 0x03, 0x0C, 0x00,
0x00, 0x00, 0x97, 0x94, 0x10, 0xFC, 0x20, 0x0E, 0x39, 0xC7, 0x30, 0x9C, 0x73, 0x83, 0x0C, 0x00,
0x00, 0x00, 0x90, 0x34, 0x10, 0x84, 0x20, 0x07, 0xF9, 0xFE, 0x3F, 0x8F, 0xF1, 0xF3, 0x0C, 0x00,
0x00, 0x00, 0x48, 0x24, 0x10, 0x84, 0x20, 0x03, 0xD9, 0xBC, 0x0F, 0x07, 0xB0, 0xF3, 0x0C, 0x00,
0x00, 0x00, 0x47, 0xCC, 0x11, 0x04, 0x40, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x30, 0x18, 0x09, 0x02, 0x40, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x1C, 0x30, 0x06, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

const unsigned char skslogo_1bit_128x64 [] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC9, 0x64, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x66, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x76, 0x28, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x40, 0x06, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xA0, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x80, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x01, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x07, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x1E, 0x00, 0x07, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x3C, 0x00, 0x07, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x3C, 0x00, 0x07, 0xF8, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x7C, 0x00, 0x0F, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0xFC, 0x00, 0x01, 0xF0, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x0F, 0xE0, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xFF, 0xF0, 0x0F, 0xC0, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFF, 0xF8, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xC1, 0xFF, 0xFF, 0xFF, 0xC0, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xFF, 0x8D, 0xB1, 0xF8, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xC1, 0xFF, 0xB5, 0x26, 0xFC, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x9C, 0x73, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0xC3, 0xFF, 0xC4, 0x78, 0xFE, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x05, 0x41, 0xFF, 0x35, 0x26, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFF, 0x85, 0x90, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x3F, 0xFF, 0x3F, 0xFE, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7F, 0xF8, 0x0F, 0xFE, 0x3F, 0xFC, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xE6, 0x7C, 0x03, 0xF8, 0xFF, 0xF8, 0x0F, 0x1F, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF1, 0x7C, 0x00, 0x03, 0xFF, 0xF0, 0x1F, 0xA1, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF3, 0xFE, 0x03, 0xFF, 0xFF, 0xE0, 0x3F, 0x37, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7B, 0xDF, 0x00, 0xFF, 0xFF, 0x80, 0x7F, 0x97, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7B, 0x67, 0x80, 0x3F, 0xFE, 0x00, 0xFA, 0xD7, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3F, 0xE7, 0xC0, 0x07, 0xF0, 0x01, 0xF9, 0xFE, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3E, 0x0F, 0xE0, 0x00, 0x00, 0x03, 0xF8, 0xFE, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1F, 0x5C, 0xF8, 0x00, 0x00, 0x0F, 0xFB, 0x7C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0F, 0x38, 0x7E, 0x00, 0x00, 0x1F, 0xB6, 0xBC, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x7F, 0x80, 0x00, 0xFF, 0x87, 0xB8, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0xCF, 0xF8, 0x07, 0xFB, 0x8F, 0xF0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0xED, 0xD3, 0xFF, 0xFF, 0xE3, 0x27, 0xE0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xFA, 0xAB, 0xFF, 0xFF, 0x38, 0x73, 0xC0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xCE, 0x3F, 0xFE, 0xB9, 0xE7, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x15, 0x30, 0xFE, 0x37, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x0E, 0x31, 0xFE, 0xDE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xCD, 0x30, 0xEF, 0xDC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFB, 0xB0, 0xEF, 0x9F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0xE1, 0xD7, 0x6F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF9, 0xDA, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xBB, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

void setup(void)
{
u8g2.begin();
u8g2.enableUTF8Print();
}

void loop(void)
{
u8g2.firstPage();
do {
u8g2.drawBitmap( 0, 0, 16, 64, apeach);
} while(u8g2.nextPage());
delay(3000);

u8g2.firstPage();
do {
u8g2.drawBitmap( 0, 0, 16, 64, skslogo_1bit_128x64);
} while(u8g2.nextPage());
delay(3000);
}



센서값 출력하기

DS18b20 온도센서

pinmap
OLED ESP32 (HW_SPI로 사용시) (VSPI) DS18b20 4.7kΩ
GND GND
VDD 3.3V
D0 18 (HW_SPI 사용시 GPIO_18로 고정) SCK/CLK/CLOCK
D1 23 (HW_SPI 사용시 GPIO_23으로 고정) DATA/DIN/MOSI
RES 15 RST/RESET
DC 14 Data Command
CS 5 Chip Select
GND GND (Black)
5V VCC (Red) O
13 Signal (Yellow) O

schematic


library

Sketch> Include Library> Manage Libraries>

  • OneWire (by Jim Studt etc.)
  • DallasTemperature (by Miles Burton)

sketch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
#include <Arduino.h>
#include <U8g2lib.h>

// for SPI
#include <SPI.h>

// for using Korean NanumGothicCoding font
// #include "u8g2_font_unifont_t_korean_NanumGothicCoding_16.h"

// Please UNCOMMENT one of the contructor lines below
// U8g2 Contructor List (Frame Buffer)
// The complete list is available here: https://github.com/olikraus/u8g2/wiki/u8g2setupcpp
// Please update the pin numbers according to your setup. Use U8X8_PIN_NONE if the reset pin is not connected

// for HW_SPI (VSPI)
U8G2_SH1106_128X64_NONAME_F_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 5, /* dc=*/ 14, /* reset=*/ 15);
// for SW_SPI
//U8G2_SH1106_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 26, /* data=*/ 25, /* cs=*/ 5, /* dc=*/ 14, /* reset=*/ 15);
// for SSD1306, I2C, (ESP32: SDA 21, SCL 22)
//U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
// for SH1106, I2C, (ESP32: SDA 21, SCL 22)
//U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

#include <OneWire.h>
#include <DallasTemperature.h>

#define TEMP_PIN 13

OneWire oneWire(TEMP_PIN);
DallasTemperature sensors(&oneWire);

unsigned long startTime = 0;

const unsigned char skslogo_1bit_128x64 [] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC9, 0x64, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x66, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x76, 0x28, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x40, 0x06, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xA0, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x80, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x01, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x07, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x1E, 0x00, 0x07, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x3C, 0x00, 0x07, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x3C, 0x00, 0x07, 0xF8, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x7C, 0x00, 0x0F, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0xFC, 0x00, 0x01, 0xF0, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x0F, 0xE0, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xFF, 0xF0, 0x0F, 0xC0, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFF, 0xF8, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xC1, 0xFF, 0xFF, 0xFF, 0xC0, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xFF, 0x8D, 0xB1, 0xF8, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xC1, 0xFF, 0xB5, 0x26, 0xFC, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x9C, 0x73, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0xC3, 0xFF, 0xC4, 0x78, 0xFE, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x05, 0x41, 0xFF, 0x35, 0x26, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFF, 0x85, 0x90, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x3F, 0xFF, 0x3F, 0xFE, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7F, 0xF8, 0x0F, 0xFE, 0x3F, 0xFC, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xE6, 0x7C, 0x03, 0xF8, 0xFF, 0xF8, 0x0F, 0x1F, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF1, 0x7C, 0x00, 0x03, 0xFF, 0xF0, 0x1F, 0xA1, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF3, 0xFE, 0x03, 0xFF, 0xFF, 0xE0, 0x3F, 0x37, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7B, 0xDF, 0x00, 0xFF, 0xFF, 0x80, 0x7F, 0x97, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7B, 0x67, 0x80, 0x3F, 0xFE, 0x00, 0xFA, 0xD7, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3F, 0xE7, 0xC0, 0x07, 0xF0, 0x01, 0xF9, 0xFE, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3E, 0x0F, 0xE0, 0x00, 0x00, 0x03, 0xF8, 0xFE, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1F, 0x5C, 0xF8, 0x00, 0x00, 0x0F, 0xFB, 0x7C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0F, 0x38, 0x7E, 0x00, 0x00, 0x1F, 0xB6, 0xBC, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x7F, 0x80, 0x00, 0xFF, 0x87, 0xB8, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0xCF, 0xF8, 0x07, 0xFB, 0x8F, 0xF0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0xED, 0xD3, 0xFF, 0xFF, 0xE3, 0x27, 0xE0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xFA, 0xAB, 0xFF, 0xFF, 0x38, 0x73, 0xC0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xCE, 0x3F, 0xFE, 0xB9, 0xE7, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x15, 0x30, 0xFE, 0x37, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x0E, 0x31, 0xFE, 0xDE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xCD, 0x30, 0xEF, 0xDC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFB, 0xB0, 0xEF, 0x9F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0xE1, 0xD7, 0x6F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF9, 0xDA, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xBB, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

void setup(void)
{
u8g2.begin();
u8g2.enableUTF8Print();

u8g2.firstPage();
do {
u8g2.drawBitmap( 0, 0, 16, 64, skslogo_1bit_128x64);
} while(u8g2.nextPage());
delay(3000);

u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_ncenB14_tr);
u8g2.drawStr(0, 15, "SKS STEAM!");
u8g2.drawTriangle(27,50, 64,32, 100,50);
} while ( u8g2.nextPage() );
delay(3000);

startTime = millis();

// Start up the DS18b20 library
sensors.begin();
}

void loop(void)
{
unsigned long ttime = millis();

sensors.requestTemperatures();
float temperatureC = sensors.getTempCByIndex(0);
float temperatureF = sensors.getTempFByIndex(0);

u8g2.firstPage();
do {
//u8g2.setFont(u8g2_font_unifont_t_korean1);
u8g2.setFont(u8g2_font_unifont_t_korean2);
//u8g2.setFont(u8g2_font_unifont_t_korean_NanumGothicCoding_16);

// Title
u8g2.setCursor(8, 14);
u8g2.print("[[ 온도측정 ]]");

// actual time measured. (1초 마다 출력되지는 않음)
u8g2.setCursor(0, 31);
u8g2.print("시간: ");
u8g2.setCursor(63, 31);
u8g2.print(getTime(ttime));

// Celcius temperature
u8g2.setFont(u8g2_font_unifont_t_korean2);
u8g2.setCursor(0, 47);
u8g2.print("섭씨: ");
u8g2.setFont(u8g2_font_unifont_tf);
if(temperatureC<100) {
u8g2.setCursor(71, 47);
}
else {
u8g2.setCursor(63, 47);
}
u8g2.print(temperatureC, 2);
u8g2.drawGlyph(111, 47, 0x00b0); // degree
u8g2.drawStr(119, 47, "C");

// Fahrenheit temperature
u8g2.setFont(u8g2_font_unifont_t_korean2);
u8g2.setCursor(0, 63);
u8g2.print("화씨: ");
u8g2.setFont(u8g2_font_unifont_tf);
if(temperatureF<100) {
u8g2.setCursor(71, 63);
}
else {
u8g2.setCursor(63, 63);
}
u8g2.print(temperatureF, 2);
u8g2.drawGlyph(111, 63, 0x00b0); // degree
u8g2.drawStr(119, 63, "F");

} while ( u8g2.nextPage() );
delay(1000);
}

String getTime(unsigned long ttime) {
int sec = ttime / 1000; int min = sec / 60; int hr = min / 60;
String ts = "";

// 시간
if (hr < 10) ts += "0";
ts += hr;
ts += ":";

// 분
if ((min % 60) < 10) ts += "0";
ts += min % 60;
ts += ":";

// 초
if ((sec % 60) < 10) ts += "0";
ts += sec % 60;

return (ts);
}

result



UTF8_HanDraw 라이브러리 한글 출력하기

ESP32 SPIFFS 영역에 폰트 업로드

  • SPIFFS란?

    • **SPIFFS(Serial Peripheral Interface Flash File System)**는 ESP32와 ESP8266의 모듈에 내부 탑재 되어 있는 메모리를 저장공간으로 사용하기 위한 파일 시스템이다.
    • ESP8266과 ESP32에는 보통 4MByte의 메모리가 탑재되어 있으며 이 메모리의 일부를 플래쉬 메모리로 사용하고 나머지를 파일 저장공간으로 사용할 수가 있다.
    • 작은 용량의 SD카드가 내장이 되었다고 생각하면 이해하기 쉽다.
  • 아두이노에서의 SPIFFS의 이용

    • 아두이노 IDE에는 이 메모리의 분리를 설정할 수 있는 메뉴가 있다. 아두이노IDE에서 아래의 항목을 설정하는 것 만으로 스케치를 업로드하면 영역이 분할되어 스케치가 업로드 된다.

      > Partition Scheme> Default 4MB with spiffs (1.2MB APPS / 1.5MB SPIFFS)

    • 기본설정은 위와 같지만 SPIFFS 용량이 부족하다면, **위 메뉴에서 **

      **No OTA(1MB APP/3MB SPIFFS)**와 같은 다른 설정을 선택하여, 코딩이 들어가는 플래쉬 메모리를 1MByte를 사용하고, 나머지 3MByte의 SPIFFS영역에는 코딩에서 필요한 자료(예를 들면 그림파일이나 텍스트 파일등)을 업로드 하고 코딩에서 그 파일을 사용하면 됩니다.

    • 아두이노 우노의 플래쉬메모리가 32KByte인 것을 고려하면 ESP32에 플래쉬 메모리를 1MByte만 할당 하는 것도 적지 않은 할당이지만, ESP32의 고급기능(WIFI, 블루투스)등을 사용하면 이 메모리도 모자라게 되는 경우도 있다.


  • 아두이노 IDE에 SPIFFS 설정하기

    • 아두이노 IDE에서 ESP32의 SPIFFS영역에 파일을 올리기 위해서는 별도의 툴을 설치하여야 한다. 아래의 링크를 클릭하여 ESP32FS-1.0.zip 파일을 다운로드 받은 뒤,

      https://github.com/me-no-dev/arduino-esp32fs-plugin/releases/

    • 압축을 풀어 나오는 ESP32FS폴더를 아두이노 설치 폴더 내의 tools폴더 아래에 복사한다.

      예를들면, c:\Program Files (x86)\Arduino\tools\ESP32FS\tool\esp32fs.jar

      같은 형태로 파일 경로가 만들어져야 한다.

    • 아두이노IDE를 종료하였다가 다시 실행시키면

      > ESP32 Sketch Data Upload 항목이 만들어진다.


  • SPIFFS에 (폰트) 파일 업로드하기
    • 기본적으로 ESP32의 SPIFFS에 파일을 업로드 하기 위해서는, 업로드하려는 스케치(.ino) 파일이 위치한 폴더에 data폴더를 생성한 뒤, 업로드하려는 파일을 복사해 넣으면 된다.
    • 그러므로 이번 과정에서 SPIFFS에 (폰트)파일을 업로드하려면, (폰트) 파일을 업로드하려는 스케치(UTF8_HanDraw.ino)가 저장되어 있는 폴더 안에, (UTF8_HanDraw.zip 파일의 압축을 풀었을때 만들어진) data폴더를 복사해 넣으면 된다.
    • 아두이노 IDE에 스케치를 열고, 메뉴에 추가된 ESP32 Sketch Data Upload를 클릭하면, 스케치 파일은 컴파일 후 APP영역에 저장되고, Data폴더안의 (폰트) 파일은 SPIFFS영역에 분리되어 저장된다.

schematic

OLED (I2C) ESP32 if, Arduino UNO
GND GND GND
VCC 3V3 3V3
SCL 22 A5
SDA 21 A4


sketch

출처: [OLED에 한글을 출력하자 by Andy Kim (andy-power.blogspot.com)](Andy Kim: OLED에 한글을 출력하자. (andy-power.blogspot.com))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <Arduino.h>
#include "Display_SSD1306.h"
#include "HanDraw.h"

#define OLED_RESET -1 // for S/W 리셋
Display_SSD1306 Oled(OLED_RESET);

/************************* Global variables *********************************/
unsigned long startTime = 0;
uint32_t loopcnt = 0;
char fpsbuf[128] = "FPS:";
bool invert = true; // 화면을 역상으로 표시

void setup() {
Serial.begin(115200);
delay(50);

// Oled를 I2C 방식으로 연결하고, 그 주소는 0x3c
Oled.begin(SSD1306_SWITCHCAPVCC, 0x3C, false);

// Callback 함수를 설정해 주면 필요시 호출 하여 사용함.
HanDraw.begin(12,
// 화면 지우는 콜백함수
[](void) { Oled.clearDisplay(); },
// 1개 픽셀을 그리는 콜백 함수
[](int16_t x, int16_t y, uint16_t color) { Oled.drawPixel(x, y, color); },
// 메모리에서 Display 표시 버퍼까지 보내는 함수
[](void) { Oled.display(); }
);

HanDraw.display(); // 사실상 Oled.display() 와 동일....
delay(2000);

HanDraw.clear();
HanDraw.setFontSize(12);
// 특수한 문자 몇개는... 아래와 같이 주면 출력된다. (통용되는 코드가 아니라 변칙 코드임)
// 12px:한글 21℃℉‰μ° 라고 출력
HanDraw.drawString(1, 0, "12px:한글 21\x10\x0f\x11\x12\x13");
HanDraw.setFontSize(14);
// 14:아래첨자 A₁₂₃₄ 라고 출력
HanDraw.drawString(1, 13, "14:아래첨자 A\x0b\x0c\x0d\x0e");
HanDraw.setFontSize(16);
// 16:위첨자 M¹²³⁴ 라고 출력
HanDraw.drawString(1, 28, "16:위첨자 M\x15\x16\x17\x18");
HanDraw.display();
delay(3000);

HanDraw.setFontSize(12);
startTime = millis();
delay(1);
Serial.println("Setup All done");
}

String getTime(unsigned long ttime) {
int sec = ttime / 1000; int min = sec / 60; int hr = min / 60;
String ts = "";
if (hr < 10) ts += "0";
ts += hr; ts += ":";
if ((min % 60) < 10) ts += "0";
ts += min % 60; ts += ":";
if ((sec % 60) < 10) ts += "0";
ts += sec % 60;
return (ts);
}

void loop() {
unsigned long ttime = millis();
dtostrf(loopcnt * 1000.0 / (ttime - startTime), 5, 2, fpsbuf + 4);

HanDraw.clear();
HanDraw.drawString(15, 2, "[[ 화면 정보 ]]");
HanDraw.drawString(2, 14, "--------------------");
HanDraw.drawString(2, 24, "한글 출력 테스트");
HanDraw.drawString(2, 38, fpsbuf);
HanDraw.drawString(2, 51, getTime(ttime));
HanDraw.display();

loopcnt++;
if (loopcnt % 100 == 0) {
Oled.invertDisplay(invert);
invert = !invert;
}
}


OLED에 DS18b20 온도 출력하기

schematic

OLED (I2C) ESP32 DS18b20 4.7kΩ
GND GND BLK
VCC 3V3
SCL 33
SDA 32
5V RED O
GPIO13 YELLOW O

library

Sketch> Include Library> Manage Libraries>

  • OneWire (by Jim Studt etc.)
  • DallasTemperature (by Miles Burton)

sketch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <Arduino.h>

#include <OneWire.h>
#include <DallasTemperature.h>

#define TEMP_PIN 13

OneWire oneWire(TEMP_PIN);
DallasTemperature sensors(&oneWire);

#include "Display_SSD1306.h"
#include "HanDraw.h"

#define OLED_RESET -1 // for S/W 리셋
Display_SSD1306 Oled(OLED_RESET);

/************************* Global variables *********************************/
unsigned long startTime = 0;
uint32_t loopcnt = 0;
char fpsbuf[128] = "FPS:";
char tC[128];
char tF[128];
bool invert = true; // 화면을 역상으로 표시


void setup() {
Serial.begin(115200);
delay(50);

// Oled를 I2C 방식으로 연결하고, 그 주소는 0x3c
Oled.begin(SSD1306_SWITCHCAPVCC, 0x3C, false);

// Callback 함수를 설정해 주면 필요시 호출 하여 사용함.
HanDraw.begin(12,
// 화면 지우는 콜백함수
[](void) { Oled.clearDisplay(); },
// 1개 픽셀을 그리는 콜백 함수
[](int16_t x, int16_t y, uint16_t color) { Oled.drawPixel(x, y, color); },
// 메모리에서 Display 표시 버퍼까지 보내는 함수
[](void) { Oled.display(); }
);

startTime = millis();
delay(1);

// Start up the DS18b20 library
sensors.begin();
}

void loop() {
unsigned long ttime = millis();
dtostrf(loopcnt * 1000.0 / (ttime - startTime), 5, 2, fpsbuf + 4);

sensors.requestTemperatures();
float temperatureC = sensors.getTempCByIndex(0);
float temperatureF = sensors.getTempFByIndex(0);
dtostrf(temperatureC, 6, 2, tC);
String tempC = "섭씨온도 * " + (String)tC + "\x10";
dtostrf(temperatureF, 6, 2, tF);
String tempF = "화씨온도 * " + (String)tF + "\x0f";

HanDraw.display();

HanDraw.clear();
HanDraw.setFontSize(12);
HanDraw.drawString(15, 2, "[[ 온도 측정 ]]");
HanDraw.drawString(2, 14, "--------------------");
HanDraw.drawString(2, 24, getTime(ttime));
HanDraw.drawString(2, 38, tempC);
HanDraw.drawString(2, 51, tempF);
HanDraw.display();
}

String getTime(unsigned long ttime) {
int sec = ttime / 1000; int min = sec / 60; int hr = min / 60;
//String ts = "";
String ts = "측정시간 * ";
if (hr < 10) ts += "0";
ts += hr; ts += ":";
if ((min % 60) < 10) ts += "0";
ts += min % 60; ts += ":";
if ((sec % 60) < 10) ts += "0";
ts += sec % 60;
return (ts);
}

ESP32, OLED (한글 출력 하기)

http://stemwith.github.io/2021/09/26/ESP32-OLED/

Author

chemidot

Posted on

2021-09-26

Updated on

2021-11-17

Licensed under

댓글