본문 바로가기
아두이노/자동 화분 급수기

#2 기획 및 검토 - SSD1306 OLED 모듈(I2C)

by songbum 2023. 8. 13.

지난 번 테스트에서 사용한 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);

흰색이라고 하는데, 디스플레이 하드웨어의 한계인지 푸르스름한 색상이다.

 

 

이 외에도 도형을 그리거나 그림을 애니메이션 시키는 것도 가능하다고 하는데, 이번 프로젝트에서는 사용할 일이 없는 것들이라 따로 학습하지는 않았다.