CAFE

한국직업능력교육원

[스크랩] [Arduino 실습 47] Arduino I2C OLED U8G2 LIBRAY 포팅하기-2

작성자송명규|작성시간26.06.10|조회수20 목록 댓글 0

앞 게시판 연재에서 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

 

다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼