아두이노프로세싱 프로그래밍

아두이노 NodeMCU 0.96 모노크롬 OLED에서 문자 및 정수형 숫자 출력

coding art 2017. 6. 8. 17:50
728x90

세간에 속된 말로 믿을 놈이 없다는 우스개 소리가 있다. 이 0.96 모노크롬 OLED 에 출력을 지원하는 라이브러리 설치 작업 과정에서 그러한 느낌을 받았다. 영어 싸이트 및 GITHUB 를 다 뒤져 보았으며 본 블로그에서 가장 시간이 많이 소모되었던 네비게이션 정도의 시간 즉 열흘이 이 간단한 데모를 준비하는데 소모되었다. 블로그 독자들께서는 이 블로그의 취지 중의 하나가 정확하게 구현 및 재현 가능함을 목표로 하기때문에 블로그 내용대로 참고하면 거의 성공할 수 있으리라 믿어 의심치 않는다.

NodeMCU보드에서 디지털 시계로서 AM 또는 PM, 12:37:45 같은 형식으로 시간을 출력하기 위해서는 문자와 정수형 숫자의 출력이 가능해야 한다.

아두이노 우노 보드에서 Adafruit_GFX.h 및 Adafruit_SH1106.h 라이브러리를 사용하여 128x64인 0.96인치 모노크롬 OLED 디스플레이 I2C 인터페이스 사용법에 대해서는 이미 알아보았다. 하지만 이 두 가지 라이브러리는 아두이노와 호환 성이 있는 NodeMCU  보드에서 에러를 유발하며 출력이 되지 않는다.


NodeMCU 보드에 설치된 0.96 OLED에 문자나 그래픽을 출력하기 위해서는 아래와 같이 별도의 라이브러리 즉 ESP8266 Oled Driver SSD1306 display를 따로 설치해야 한다.
 









라이브러리 설치 후 함께 설치된 예제를 살펴 보면 5개 중 청색 박스의 3개는 별도의 추가 라이브러리 설치 없이 실행이 가능하다.
아두이노 우노에서 SH1106.h  라이브러리 설치와 아울러 데모 코드를 실행하여 출력된 결과를 보고 필요한 부분을 체크 후 발췌하여 자신의 코딩에 이용하였듯이 유사한 방법을 적용하자.



이 코드는 SSD1306simpledemo.ino 코드에서 시계/타이머를 코딩하기 위해 필요한 최소한의 부분을 추출한 코드이다.

I2C 인터페이스에서 필수적인 Wire.h 라이브러리는 아두이노 편집기 1.6.5 및 그 이전 버전까지는 필요하나 그 이후 버전에는 생략 가능하다.
라이브러리 정의에서 “⚫⚫⚫” 또는 <⚫⚫⚫ > 둘 다 문법 상 가능하다.
SSD1306 display(0x3c, D3, D5) 는 display() 클라스 선언이다. loop() 문에서 display.⚫⚫⚫ 형태의 그래픽 명령을 도입하기 위한 전역적인 클라스 선언문이다.
0.96 OLED 의 I2C 인터페이스를 위한 배선에 있어서 SCL을 D5(GPIO 14), SDA를 D3(GPIO 0)에 배선한다. 전원은 3V3 과 GND 에 배선한다.
setup()문에서 통신속도는 NodeMCU 고유의 115200이 적절하며 0.96 OLED를 구동하기 위해 disply.init()을 실행한다.
display.flipScreenVertically() 명령은 문자의 서있는 윗 방향이 0.96 OLED 의 인터페이스 핀들이 가까이 있는 방향을 뜻한다. 이 명령을 쓰지 않으면 문자가 0.96 OLED 의 인터페이스 핀들로부터 멀어지는 방향으로 출력된다. 혹 배선 작업에 의해 OLED 방향이 바뀌었을 경우 사용하면 좋다.


loop() 문에서 문자 출력을 위한 명령들은 SH1108.h 라이브러리에서와 유사하다. OLED 스크린을 클리어한 다음 문자의 배열 display.setTextAlignment(), 폰트 종류 및 크기 즉 display.setFont()를 설정한다.
display.drawString()에서 문자 출력 위치 좌표 설정 후 문자를 위치시킨다.
시간 출력에 필요한 정수형 변수를 출력하는 경우에는 String() 문법을 사용한다.
출력 내용이 완성되었으면 display.display() 명령을 실행한다. 이 명령은 SH1106.h 라이브러리에서와 동일하다.


NodeMCU_OLED_02


#include <SSD1306.h>

SSD1306  display(0x3c, D3, D5);

void setup() {
  Serial.begin(115200);
  display.init();
  display.flipScreenVertically();
}

void loop() {
    display.clear();
    display.setTextAlignment(TEXT_ALIGN_LEFT);
    display.setFont(ArialMT_Plain_24);
    display.drawString(0, 16, "Hello world");
    int a = 37;
    display.drawString(0,36,String(a));
    display.display();
    delay(10);
}//끝