아두이노 코딩-36: 0.96인치 OLED “Steemit” Smart Watch

in #kr6 years ago (edited)

noname01.png

아두이노 시계 코딩은 임베디드 코딩의 모든 가능성을 보여 주는 분야다. 코딩 기술이 업그레이드 될 때마다 또는 언어를 하나씩 더 배우게 됨에 따라 특성에 맞춰서 시계 코딩을 해 보는 것이 좋다. 아직 와이파이 코딩을 시작하기 전이기 때문에 스마트 워치 코딩 단계를 목전에 두고 있다고 볼 수도 있겠다. ㅋ

아두이노 우노를 기준으로 아무런 디바이스를 사용하지 않는 단순한 시계 코딩은 이미 블로그에 포스팅 되었다. 물론 시계에서 치명적일 정도로 중요한 디자인을 포함하지 못한 알고리듬 중심의 시계이긴 하지만 아무리 복잡한 시계를 디자인 한다 해도 크게 변하는 것은 없다.

아두이노 시계 알고리듬에 대해서는 아래의 블로그가 도움이 될 수 있으니 참조 바란다.

초보자를 위한 아두이노 코딩 입문-19: 아두이노 코딩 시계 종류와 시리얼 모니터 시계 코딩
https://steemit.com/kr/@codingart/19

이번 시계 코딩에서는128x64 해상도를 가지는 쥐방울만한 0.96인치 모노크롬 OLED를 사용하여 스팀잇 로고를 코딩하는 방법을 설명하기로 하자,

0.96인치 모노크롬 OLED 128x64 디스플레이의 사용법도 일전에 포스팅한 아래의 블로그를 참조하자.

아두이노 코딩-35: 0.96인치 모노크롬 OLED 128X64 “Steemit ”디스플레이
https://steemit.com/kr/@codingart/35-0-96-oled-128x64-stimit

결국 코딩의 방향은 ‘Steemit“ 디스플레이 코딩의 틀에 기본적인 아두이노 시리얼모니터 시계를 결합 시키는 작업으로 구성된다.

‘Steemit“ 디스플레이 코딩의 틀이라 함은 Adafruit 사에서 제공하는 2종의 라이브러리를 설치하는 작업을 의미한다. 혹 아두이노에서 라이브러리 설치하는 사례에 익숙치 않으면아래의 블로그 사례를 참조하면 도움이 될 것이다.

아두이노 코딩-35: 0.96인치 모노크롬 OLED 128X64 “Steemit ”디스플레이
https://steemit.com/kr/@codingart/35-0-96-oled-128x64-stimit

초보자를 위한 아두이노 코딩 입문-12: Adafruit DTH11 센서를 이용한 온습도 모니터링
https://steemit.com/kr/@codingart/11-adafruit-dth11

나머지 작업은 시계 알고리듬을 카피 페이스트하는 작업이다.
OLED 디스플레이 화면에 텍스트나 정수형 시간의 출력은 그다지 어렵지 않다. 이 범위까지만 해결해도 아담한 아두이노 시계가 탄생한다.

더 나아가 조금 욕심을 부리자면 그래픽 로고를 집어넣는 작업이다. 이 로고 코딩은 bitmap 그림 그리기 작업에 해당하는데 간단한 요령만 살펴보기로 한다.

아래의 그림에서처럼 32x32 배열 어레이에 “0”과 “1”을 사용하여 스팀잇의 로고를 표현하도록 해야 한다.

noname02.png

이 작업이 완성되면 코딩 이 거의 끝난 것과 다음 없다.

아래 그림은 bitmap 데이티를 작성하기 위한 그림판에서 스케치 검토 작업의 흔적이다.

noname03.png

스팀잇 로고 아두이노 시계 코드는 컴파일하여 업로딩 후 PC의 시리얼 모니터를 열고 현재의 시간을 예를 들자면 “1658”로 입력한다. 즉 오후 4시 58분이란 뜻이다. 초 데이터는 중요치 않다.

noname04.png

아두이노와 0.96인치 모노크롬 OLED 가 준비되었으면 재빨리 I2C 배선을 하고 아래의 코드를 카피하여 컴파일 업로딩하기 바란다.

I2C 배선은 다음과 같다.
OLED : 아두이노
GND -> GND
Vcc -> 5V
SDA -> A4
SCL -> A5

I2C 배선에 관해서는 아래의 lcd i2c 배선 사례를 참조하기 바란다. 배선하는 디바이스가 lcd 이든 oled 이든 방법론은 동일하다.

아두이노 코딩-28: 미세먼지 측정기에 I2C lcd를 달아볼까요?
https://steemit.com/kr/@codingart/28-i2c-lcd

//Uno_steemit_clock_01

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>

#define OLED_RESET 4
Adafruit_SH1106 display(OLED_RESET);

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2

#define LOGO16_GLCD_HEIGHT 32
#define LOGO16_GLCD_WIDTH 32
static const unsigned char PROGMEM logo16_glcd_bmp[] =
{
B00000000, B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000, B00000000,
B00000000, B00000001, B00000000, B00000000,
B00000000, B00000111, B00000000, B00000000,
B00000011, B00001111, B00000111, B00000000,
B00000111, B00011111, B00000111, B00000000,
B00001111, B00011111, B00001111, B00000000,
B00001111, B00111111, B00001111, B00000000,
B00000111, B10001111, B10001111, B10000000,
B00000111, B10000111, B10000011, B10000000,
B00000111, B00000011, B11000011, B10000000,
B00000011, B10000001, B11100001, B11000000,
B00000011, B10000001, B11100001, B11100000,
B00000001, B11000001, B11100000, B11100000,
B00000001, B11100000, B11110000, B11110000,
B00000000, B11100000, B11111000, B11110000,
B00000000, B11100000, B11111000, B11100000,
B00000000, B11000000, B11111000, B11000000,
B00000001, B10000000, B11110000, B10000000,
B00000001, B00000001, B11100001, B00000000,
B00000000, B00000001, B11000000, B00000000,
B00000000, B00000011, B10000000, B00000000,
B00000000, B00000011, B00000000, B00000000,
B00000000, B00000010, B00000000, B00000000,
B00000000, B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000, B00000000 };

#if (SH1106_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SH1106.h!");
#endif

unsigned long currentHr = 0;
unsigned long currentMin = 0;

void setup() {
Serial.begin(9600);
display.begin(SH1106_SWITCHCAPVCC, 0x3C);
Serial.println("Clock setting data with 0000 in HR & Min");
while( Serial.available() == 0 ) {
}
int hrmin = Serial.parseInt();
currentHr = hrmin/100;
Serial.println(currentHr);
currentMin = hrmin%100;
Serial.println(currentMin);
}

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.clearDisplay();
display.drawBitmap(0, 0,  logo16_glcd_bmp, 32, 32, 1);
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(40,10);
display.println("Steemit");
display.setCursor(95,30);
if( hr <12 ) {
  display.println("AM");
}
else if( hr <24 ) {
  display.println("PM");
}
else {
  hr = hr -24;
  display.println("AM");
}
display.setTextSize(2);
display.setCursor(35,50);
if( minute >= 60 ) {
  hr = hr + 1;
  minute = minute - 60;
}
display.print((unsigned long)hr);
display.print(":");
display.print((unsigned long)minute);
display.print(":");
display.print((unsigned long)sec);    
display.display();
delay(500);

}//loop 끝

Sort:  

잘보고갑니다 ㅎㅎ 보팅하고 팔로우하고갈게요

항상 좋은글 감사합니다 ㅎㅎ
제꺼도 놀러와주세요!!

당연히 그래야죠!

pairplay 가 kr-dev 컨텐츠를 응원합니다! :)

Coin Marketplace

STEEM 0.30
TRX 0.12
JST 0.032
BTC 60609.50
ETH 3014.13
USDT 1.00
SBD 3.90