
WeMos보드는 Atmel 칩이 아닌 와이파이 기능이 지원되는 ESP8266 12E 칩이 사용되고 있다. 아두이노 호환 보드이므로 아두이노 우노에서 실행되었던 코드가 100% 그대로 실행되어야 하겠지만 이 0.96인치 모노크롬 OLED 디스플레이의 경우 별도의 라이브러리 설치가 필요하다.
동일한 하드웨어를 Uno에서 사용하다가 WeMos로 옮기게 되면 라이브러리가 바뀌는 것뿐만 아니라 수반되는 명령어 전체가 완전히 달라지므로 상당 시간 투자해서 학습이 필요하다. 비록 Uno에서는 비트맵 명령까지 사용하여 로고 그래픽까지 사용하였으나 WeMos 에서도 가능은 하겠지만 시간 관계상 필요한 최소한의 문자를 디스플레이 하는 선에서 시계 코딩을 진행하기로 한다. 아울러 WeMos 보드의 디지털 데이터 핀 사용에 있어서 핀 번호를 D+pin number 로 바꾸어주는 것을 잊지 말아야 한다.
아두이노 우노 보드에서 사용했던 Adafruit_GFX.h 및 Adafruit_SH1106.h 라이브러리들은 아두이노와 호환성이 있는 WeMos 보드에서 에러를 유발하며 출력이 되지 않는다는 점에 유의하자. 즉 사용이 불가능하므로 다음에 설명하는 ssd1206 라이브러리로 갈아타야 한다.
WeMos 보드에 설치된 0.96 OLED 디스플레이에 문자나 그래픽을 출력하기 위해서는 아래와 같이 스케치의 라이브러리 매니저에서 ssd1306으로 검색하여 ESP8266 Oled Driver SSD1306 display를 따로 설치해야 한다.

이 설치 결과는 라이브러리 메뉴에서 확인하도록 하자.

오랫동안 이 SSD1306 라이브러리를 사용하지 않다가 갑자기 아두이노 편집기를 사용할 경우 이 라이브러리가 제거되어 있는 경우가 왕왕 있음에 유의하자. 다시 설치하면 된다.
라이브러리 설치 후 함께 설치된 예제를 살펴보면 빨간색 박스친 simpledemo 코드는 별도의 추가 라이브러리 설치 없이 실행이 가능하다.

아두이노 우노에서 SH1106.h 라이브러리 설치와 아울러 데모 코드를 실행하여 출력된 결과를 보고 필요한 부분을 체크 후 발췌하여 자신의 코딩에 이용하였듯이 유사한 방법을 적용하자.

위의 코드는 WeMos 보드에서 SSD1306 시계/타이머를 코딩하기 위해 필요한 헤더 및 setup() 부분 코드를 추출한 내용이다.
아두이노 우노 시계 코딩에서는 아두이노 시계 입력 값을 시리얼모니터에서 부여하였으나 번거로울 수 있으며 한편 9V 전지를 사용하게 되면 무선 와이파이 방식이 아니면 입력이 불가능하므로 일단 가장 쉬운 방법으로 컴파일 업로딩 시간을 감안하여 아예 헤더 부분에서 시간 분 데이터를 설정해 버린는 방법을 사용하자.
이부분에 관해서는 차후 무선 와이를 통해 입력하는 기법으로 해결하도록 한할 예정이다.
현재의 코드는 I2C 인터페이스를 위해 SDA 와 SCL 배선을 위해 디지털 데이터 핀 D14 와 D15를 할당하고 있다.
WeMos 보드에서는 아날로그 핀이 1개인 관계로 A4와 A5 핀이 없으므로 D14와 D15를 클라스 명령 display에서 설정하도록 한다. 이와 비슷한 용법은 softwareSerial()에서 본 적이 있을지도 모르겠다.
SSD1306 display(0x3c, D14, D15) 는 display() 클라스 선언이다. 마지막 부분의 D14,D15 에 유의하도록 한다. 원래 0.96 OLED는 I2C 나 SPI 인터페이스를 사용하는 것으로 되어 있다. 참고로 NodeMCU 에서는 특정 I2C 핀이 지정되어 있는 것은 아니지만 WeMos 에서는 D14, D15를 SDA, SCL 로 지정하고 있는듯하다.
도입된 display.⚫⚫⚫ 형태의 그래픽 명령은 ㅣoop() 문에서 많이 사용된다.
setup()문에서 통신속도는 WeMos 고유의 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() 명령을 실행하여 디스플레이 버퍼의 내용을 디스플레이 화면에 출력한다.
//WeMos_oled_clock_001
#include <Wire.h>
#include <SSD1306.h>
unsigned long currentHr = 20;
unsigned long currentMin = 3;
SSD1306 display(0x3c, D14, D15);//SDA,SCL
void setup() {
Serial.begin(115200);
display.init();
display.flipScreenVertically();
}
void loop() {
unsigned long currentMillis = millis();
unsigned long hr = currentHr + currentMillis/3600000;
currentMillis = currentMillis%3600000;
unsigned long minute = currentMin + currentMillis/60000;
unsigned long second = currentMillis%60000;
unsigned long sec = second/1000;
display.clear();
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_24);
if( hr <12 ) {
display.drawString(0, 15, "AM");
}
else if( hr <24 ) {
display.drawString(0, 15, "PM");
hr = hr - 12;
}
else {
hr = hr -24;
display.drawString(0, 15, "AM");
}
if( minute >= 60 ) {
hr = hr + 1;
minute = minute - 60;
}
display.drawString(0, 36, String(hr));
display.drawString(25, 36,(":"));
display.drawString(30, 36, String(minute));
display.drawString(55, 36,(":"));
display.drawString(60, 36, String(sec));
display.display();
delay(500);
}//끝