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

초보자를 위한 아두이노 NodeMCU 0.96 모노크롬 OLED 시계/타이머 코딩

coding art 2017. 6. 8. 19:31
728x90















___________________Up to here. advertization area___


아두이노 NodeMCU 보드에서 0.96 인치 모노크롬 OLED에 문자와 정수형 숫자를 출력할 수 있도록 라이브러리가 준비되었다.
0.96 모노크롬 OLED 디스플레이와 같은 하드웨어는 Third Party에서 제공하는 센서와 마찬가지로 특화된 라이브러리를 제공받아 설치해야 한다.
NodeMCU에서의 I2C 배선은 그림과 같e다. SCL 은 D5, SDA는 D3 전원은 3V3과 GND 에 연결하였다. 이 I2C 배선은 0.96 OLED 디스플레이를 지원하는 SSD1306.h 라이브러리와 매칭되어 있음에 유의하자.

NodeMCU에서의 시계/탕;머 코딩도 아두이노 우노에서와 그다지 다를 것이 없이 보드에 전원을 공급하자마자 시간을 millisecond 즉 천분의 일초 단위로 체크하는 millis() 명령을 사용하면 편리하다.
ESC
I2C 인터페이스를 지원하도록 Wire.h 라이브러리와 OLED 디스플레이를 지원하는 SSD1306.h 라이브러리를 설치한다.



일단 시계를 실행시키게 되면 경과 시간을 밀리세컨드 단위로 아두이노 내부에서 클럭 주파수를 이용하여 지속적으로 셈을 하게 된다. 5일 정도까지 카운팅이 가능하므로 이 값을 정수로 표현하면 대단히 큰 수가 된다.

따라서 아두이노 코딩 문법을 참고하여 가장 큰 정수를 사용하려면 unsigned long int 변수를 사용할 필요가 있다.

아울러 아두이노 자체는 시간을 카운트하는 타이머 기능은 가능하나 현재 시간을 알아낼 수 있는 기능이 없으므로 시계 프로그램을 실행 시에 일반 시계 사용 때와 마찬가지로 사용자가 현재의 시간을 시간 분 단위로 입력을 해 줄 필요가 있다. 컴파일 업로딩에 어느 정도 시간이 소요되므로 초 단위까지

맞출 필요는 없을 듯하다.

setup() 문에서는 통신 속도를 115200 으로 설정하고 OLED 구동을 위해서 display.iniy() 명령을 실행한다.


millis()  명령을 사용하여 시간 분 초 가 계산 준비 되면 OLED 디스플레이에 출력 처리를 해야 한다.

모든 준비가 끝났으면 버퍼의 내용을 OLED 화면에 출력한다.


NodeMCU_OLED_Clock_01


#include <Wire.h>
#include <SSD1306.h>
 unsigned long currentHr = 18;
 unsigned long currentMin = 22;
 SSD1306  display(0x3c, D3, D5);
 
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);
}//끝