앞 게시판 연재에서 u8g2 라이브러리를 성공적으로 이식 포팅하는데 성공했다.
이젠 아무도 못 말린다.
마음대로 사용하면 된다.
여기서 좀더 수정하면 ESP32에도 포팅 가능하다. 이 부분은 차후 수업시간에 같이 진행해 보기로 하자.
이번에는 u8g2 라이브러리에 My Printf를 이식해 보겠습니다.
동작 아주 잘합니다.
2가지 다 해 볼수 있는데
1. SW I2C IF == 속도가 느립니다.
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, 2, 3 /* reset=*/ );
2. HW I2C IF == 속도가 빠름
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
#define U8G2_I2C_OLED 1
#include "My_Arduino_Printf_Lib_V1_6.h"
void setup(void) {
u8g2.begin();
u8g2.enableUTF8Print(); // enable UTF8 support for the Arduino print() function
}
void loop(void) {
u8g2.clearBuffer(); // clear the internal memory
u8g2.setFont(u8g2_font_ncenB08_tr); // choose a suitable font
u8g2.drawStr(0,10,"Hello World!"); // write something to the internal memory
u8g2.setCursor(8, 20);
u8g2.print("Song");
u8g2.setCursor(2, 40);
My_printf("Cnt = %d",cnt);
u8g2.sendBuffer(); // transfer internal memory to the display
delay(1000);
}
//========================================
참고로 I2C IF는 2가지 방식이 있습니다.
1. HW/ I2C IF
- 이 경우는 한 I2C채널에 여러개의 OLED가 연결된 구조인데 이 경우는 OLED별 I2C 어드레스를 다르게 설정해야 합니다.
보통 D/C 핀이 어드레스 핀 이라고하네요 === 이 경우 data Sheet를 참조하여 찾아내야 합니다.
모듈 뒷면 저항으로 선택할 수 있도록 연결되어 있고 마킹되어 있네요 == 0x78, 0x7a로 마킹되어있습니다.
기본 0x78로 연결되어 있네요...
2. SW I2C IF
이 경우는 가장 간단한 방법입니다.
하나의 I2C 채널에 여러개의 OLED가 연결된게 아니라 여러개의 각각의 GPIO pin으로 연결하여 IF하는겁니다.
U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2_a(U8G2_R0, /* clock=*/ 2, /* data=*/ 3, /* reset=*/ U8X8_PIN_NONE);
U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2_b(U8G2_R0, /* clock=*/ 4, /* data=*/ 5, /* reset=*/ U8X8_PIN_NONE);
요런식으로 초기화하여 사용하는겁니다. 여분의 GPIO핀이 활당 됩니다.
SPI IF 방식도 마찬가지입니다.
SPI IF방식은 어드레스가 없으므로 하드웨어 GPIO 핀으로 할수밖에 없습니다.
이때 프로그램방식은 다음과 같습니다.
U8G2_SH1106_128X64_NONAME_1_4W_SW_SPI u8g2_1(U8G2_R0, 12, 11, 8, 9, 10); U8G2_SH1106_128X64_NONAME_1_4W_SW_SPI u8g2_2(U8G2_R0, 12, 11, 8, 9, 10); U8G2 *u8g2_array[] = {&u8g2_1, &u8g2_2};
우리가 사용하고 SSD1306 OLED 콘트롤러 Data Sheet 첨부합니다.
아래링크 참고요
https://forum.arduino.cc/t/u8g2-with-two-ssd1306-oled-displays/491906/14
