지난 번 테스트에서 사용한 16X2 텍스트 LCD 모듈은 큰 크기에도 불구하고 한 화면에 표시할 수 있는 글자수가 적었다. 그래서 좀 더 작으면서도 한번에 많은 글자를 표시할 수 있는 디스플레이를 찾아봤는데, oled 방식으로 그래픽까지 표현 가능한 제품이 있어 구입해봤다.
SSD1306 라는 제품인데, 디스플레이의 해상도가 가로 128에 세로 32 픽셀이고 글자 크기를 조절할 수 있어 원하는 내용을 충분히 표시할 수 있을 거 같다. 인터넷을 찾아보니 Adafruit_SSD1306 라는 라이브러리를 많이 사용하는 거 같고, 아두이노 IDE 의 Library Manager 에서 검색해 쉽게 설치할 수 있었다.
이런 종류의 디스플레이 제품들은 인터페이스가 SPI 방식 아니면 I2C 방식인 거 같다. 내가 구입한 I2C 방식이 핀 갯수가 4개이고, SPI 방식은 핀 갯수가 6개이다. 찾아보니 SPI 방식은 송신과 수신을 동시에 할 수 있어 빠르지만, I2C 방식은 동시에 할 수 없어 상대적으로 더 느리다고 한다.
VCC 와 GND 는 아두이노 보드의 5V 와 GND 에 연결하고, 나머지 2개(SCL, SDA)는 보드의 아날로그 5과 4 번에 각각 연결했다. 다른 핀에 연결하면 작동이 안 되는데, 핀 번호를 변경할 수 있는 방법을 몰라서 일단 이 디스플레이를 사용할 때는 반드시 5번과 4번에 연결해야 할 거 같다.
gitHub 의 예제 소스를 참고로 아래와 같이 코딩해 업로드했다.
#include <virtuabotixRTC.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C // 0x3D for 128x64, 0x3C for 128x32
virtuabotixRTC myRTC(4,3,2);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
Serial.begin(9600);
//myRTC.setDS1302Time(00, 00, 00, 3, 11, 7, 2023);
while(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS) && millis()<5000) {
}
display.display();
delay(1000);
}
void loop() {
myRTC.updateTime();
int i = myRTC.dayofweek;
String ctime = String(myRTC.year) + "/" + String(myRTC.month) + "/" + String(myRTC.dayofmonth) + " " + myRTC.hours + ":" + myRTC.minutes + ":" + myRTC.seconds;
Serial.println(ctime);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(ctime);
display.display();
delay(1000);
}
실행 결과는 다음과 같다. 가로 픽셀보다 긴 내용이 나오자 자동으로 줄바꿈 처리가 됐다.
위 공백이 없고 아래는 공백이 많아서 글자 위치를 y 축 방향으로 조금 이동시켜 봤다.
display.setCursor(0, 2);
처음에는 글자 크기를 1로 했었는데 너무 작았다.
display.setTextSize(1);
글자 크기를 3으로 하면 또 너무 커서 아래로 짤려서 2로 확정했다.
처음 업로드 때와 리셋 시 아래와 같이 로고가 나오는데, setup() 함수에서 display.display(); 를 주석처리하면 안 나온다.
글자를 반전 시킬 수도 있다. setTextColor() 함수의 첫 번째 파라미터가 글자 색이고, 생략 가능한 두 번째 파라미터가 글자의 바탕색이다. 따라서 아래와 같이 수정하면 반전 글자가 나온다.
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
흰색이라고 하는데, 디스플레이 하드웨어의 한계인지 푸르스름한 색상이다.
이 외에도 도형을 그리거나 그림을 애니메이션 시키는 것도 가능하다고 하는데, 이번 프로젝트에서는 사용할 일이 없는 것들이라 따로 학습하지는 않았다.
'아두이노 > 자동 화분 급수기' 카테고리의 다른 글
#5 제작 - 스케쥴링, unix time(epoch, POSIX) 변환 (0) | 2024.01.29 |
---|---|
#4 제작 - 릴레이 멈춤 현상, RC스너버 (0) | 2024.01.03 |
#3 기획 및 검토 - 솔레노이드 밸브, 릴레이 (0) | 2023.08.23 |
#1 기획 및 검토 - DS1302 RTC 모듈, LCD 모듈(I2C) (0) | 2023.06.23 |