I2C 인터페이스를 사용하는 128X64 해상도의 초소형 모노크롬 OLED 디스플레이 사용법을 알아보자. 이 정도의 해상도이면 거의 스마치 워치급으로서 아래에 언급된 sh1106_128x64_i2c 코드를 실행하여 그래픽 출력 기능을 시험해 보기 바란다.
제품에 따라서는 동일한 디스플레이 사이즈 규격이지만 SPI 인터페이스를 적용한 사례도 있으나 여기서는 보드의 핵심 구동 칩이 SH1106인 OLED 디스플레이로서 I2C 인터페이스에 의한 배선 사례를 대상으로 살펴본다. 참고로 OLED 디스플레이 보드의 핵심 구동 칩으로 SH1306을 사용하며 SPI 인터페이스를 사용하는 제품과는 혼동을 피하기로 하자.
아두이노 우노 디지탈 I/O 핀들이 배치된 곳에 있는 SDA, SCL I2C 배선은 아날로그 채널 A4, A5로 교체도 가능하다.
전원은 5V 와 3V3 어느 것을 사용해도 무방하다.
I2C 인터페이스는 Wire.h 라이브러리를 사용하는 반면에 SPI.h는 배제하기로 한다.
OLED 디스플레이를 테스트하기 위해서 Adafruit 사의 라이브러리 두 개를 사용하기로 하자. Adafruit_GFX.h 는 OLED 출력에 필요한 모든 문자들의 폰트를 제공하는 라이브러리이며 Adafruit_SH1106.h 라이브러리는 SH1106 구동칩을 지원하며 내부에서 Adafruit_GFX.h를 불러다 쓰기 때문에 이 두 라이브러리 설치는 필수적이다.
참고로 Adafruit_SH1106.h 라이브러리 내용을 보면 SH1306을 대상으로 작성된 라이브러리를 SH1106 용으로 전환하였으며 특히 SH1306에서 지원했던 scroll 기능이 SH1106에서는 지원되지 않는다는 점을 지적하고 있다. scroll 기능이 지원되지 않으므로 OLED 화면이 가득 차면 화면 Clear 작업을 하고 새로 출력하도록 코딩을 해야 한다.
Adafruit_SH1106 의 display 클래스 명령인 display.begin()의 0x3C는 OLED 디스플레이 디바이스의 I2C 인터페이스를 위한 16진 주소를 뜻한다.
//하여 밀어버린 display.display() 명령은 OLED의 이미지 버퍼의 내용을 디스플레이하는 명령으로서 현 위치에서 명령을 실행할 경우 Adafruit 사의 로고가 뜨므로 일단 밀어둔 상태이다. 항상 출력 내용물이 확정되면 이미지 버퍼에 저장된 내용을 볼 수 있도록 이 명령을 주기적으로 사용해야한다.
구입한 OLED가 제대로 잘 동작하는지 여부를 확인하기 위해서는 Adafruit 사 라이브러리에 포함되어 있는 예제 sh1106_128x64_i2c를 실행시켜 볼 필요가 있다.
프로그램이 상당히 길므로 사용자는 필요한 부분만 가져다 쓰면 된다.
display 클래스 명령 몇 가지만 더 알아보자.
display.Clear()는 출력된 이미지를 지운다.
display.setTextSize()는 폰트 크기를 설정한다.
display.setTextColor()는 모노크롬의 경우 WHITE 값을 사용한다.
display.setCursor()는 출력물의 그래픽의 시작점을 정의한다.
display.println((int) i)는 정수를 출력한다.
OLED의 이미지 버퍼에 이런 출력 과정이 끝난 후 display.display() 명령을 통해 OLED 화면에 이미지를 보여 주게 되며 다음 출력으로 넘어가기 전에 display.clearDisplay() 명령을 실행하도록 한다.
OLED를 실용적으로 사용하기 위해서 UINT_8 t 문자 출력 루틴을 시험해 보자. testdrawchar() 루틴을 호출하면 된다. 이 루틴은 텍스트의 폰트 사이즈, 컬러, 출력 위치를 설정한 후 for loop를 통해 정수형 변수 i를 0∼167까지 display.write(i) 하면 OLED 한 페이지를 문자로 가득 메우는 화면을 보여준다. 여기서는 i 의 범위를 59∼79까지 한정하여 좀 큰 폰트 사이즈 2로 하여 123⚫⚫⚫MNO 까지 시험 출력하였다.
for loop 문에서 정수형 변수 i 값이 21로 나누어 떨어지면 텍스트 폰트 사이즈가 1 일 때에display.println() 명령을 실행하고 줄 바꿈을 하게 된다. 다시 돌아와서 i 값이 줄 바꿈하여 그 값이 ‘\n’이면 UINT_8t 문자를 출력한다.
이와 같이 하여 한 페이지 분량의 문자 출력이 이루어지면 display.display() 명령 실행에 의해서 OLED 디스플레이 상에서 출력된 글자를 볼 수 있게 된다.
다음에 첨부된 Adafruit 사의 라이브러리를 다운받아 이용하기 바란다. 위에 언급된 예제 코드들이 잘 작동하면 OzLED 라이브러리도 다운 받아 사용해도 무방하다. 처음부터 OzLED를 사용할 경우 출력결과를 볼 수 없으므로 OLED 의 작동 여부를 알 수 없으니 주의 바란다. OzLED 라이브러리는 필요 시 인터넷에서 검색하여 다운 받기 바란다.
Adafruit-GFX-Library-master.zip
oled_02
//#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>
#define OLED_RESET 4
//Adafruit_SH1106 display(OLED_RESET);
Adafruit_SH1106 display(OLED_RESET);
void setup() {
Serial.begin(9600);
display.begin(SH1106_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
// text display tests
testdrawchar();
display.display();
delay(2000);
display.clearDisplay();
}
void testdrawchar(void) {
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
// for (uint8_t i=0; i < 168; i++) {
for (uint8_t i=59; i < 80; i++) {
if (i == '\n') continue;
display.write(i);
if ((i > 0) && (i % 21 == 0))
display.println();
}
display.display();
}
void loop() {
}//끝
'아두이노프로세싱 프로그래밍' 카테고리의 다른 글
아두이노 NodeMCU 0.96 모노크롬 OLED에서 문자 및 정수형 숫자 출력 (0) | 2017.06.08 |
---|---|
초보자를 위한 아두이노 우노 0.96 모노크롬 OLED 시계/타이머 코딩 (0) | 2017.06.05 |
아두이노 0.96인치 Monochrome OLED Display 128X64 (0) | 2017.06.02 |
초보자를 위한 라즈베리 파이3 DHT11 온습도 ThingSpeak 그래픽 처리 파이선 코딩(업데이트) (0) | 2017.05.29 |
라즈베리 파이3 Adafruit DHT11 온습도 센서 측정 파이선3 코딩 (0) | 2017.05.26 |