아두이노

아두이노로 SSD1306 GLCD 사용하기

CreatoMaestro 2024. 1. 4. 21:52
반응형

이번 글에서는 아두이노로 SSD1306을 사용한 GLCD를 컨트롤하는 방법을 알아볼 것입니다.

먼저 GLCD와 SSD1306에 대해 간단하게 알아보고, 아두이노로 어떻게 컨트롤하고 있는지 알아보도록 하겠습니다.

 

GLCD

GLCD(그래픽 LCD)는 픽셀 하나하나 컨트롤하여 화면을 띄우는 LCD입니다.

픽셀을 컨트롤하여 화면을 띄우기 때문에 자유로운 화면 구성이 가능합니다.

SSD1306

SSD1306은 GLCD를 컨트롤하기 위한 IC입니다.

I2C통신을 이용하여 데이터를 받습니다.

SSD1306을 개발한 Adafruit에서 만든 아두이노 라이브러리를 이용하면

쉽게 SSD1306을 컨트롤 할 수 있습니다.

 

아두이노로 GLCD 컨트롤하기

이제 아두이노로 GLCD를 컨트롤하는 방법을 알아보도록 하겠습니다.

 먼저 Adafruit에서 만든 SSD1306 라이브러리를 설치하도록 하겠습니다.

 

SSD1306 라이브러리 설치
SSD1306 라이브러리

라이브러리 매니저 페이지에 들어가서 SSD1306을 검색해줍니다.

나온 결과 중에 Adafruit SSD1306을 설치해줍니다.

이 라이브러리를 사용하고 싶으면 다음 파일을 include해주면 됩니다.

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

 

지금부터는 점(픽셀) 하나를 찍는 코드를 작성해보겠습니다.

여기서는 I2C 통신을 사용하는 128*32크기의 GLCD를 사용합니다.

 

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

#define width 128
#define height 32

Adafruit_SSD1306 display(width, height,&Wire,-1);

void setup() {
  // put your setup code here, to run once:
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.drawPixel(10, 10, SSD1306_WHITE);
  display.display();
}

void loop() {
  // put your main code here, to run repeatedly:

}

 

지금부터 코드를 하나하나 뜯어보도록 하겠습니다.

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

 

처음으로 필요한 라이브러리들을 include 시켜줍니다.

Wire.h는 I2C 통신을 위한 라이브러리이고,

그 밑의 두 라이브러리는 GLCD 컨트롤을 위한 라이브러리입니다.

#define width 128
#define height 32

 

이 코드에서는 GLCD의 크기를 지정해줍니다.

단위는 픽셀입니다.

가로로 128개의 픽셀, 세로로 32개의 픽셀이 있으므로 똑같이 설정해주었습니다.

Adafruit_SSD1306 display(width, height,&Wire,-1);

 

이 코드는 SSD1306 컨트롤을 위한 클래스의 객체를 생성하는 코드입니다.

display라는 객체를 이용해 GLCD를컨트롤합니다.

객체를 생성할 때 width, height 정보와 Wire 객체의 주소, 리셋을 어떻게 사용할 것인지 결정합니다.

-1은 아두이노의 리셋을 사용할 것임을 의미합니다.

 

void setup() {
  // put your setup code here, to run once:
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.drawPixel(10, 10, SSD1306_WHITE);
  display.display();
}

void loop() {
  // put your main code here, to run repeatedly:

}

 

Setup 안에 필요한 코드를 작성했습니다.

우선 display.begin 메서드로 LCD를 초기화시켜 줍니다.

SSD1306_SWITCHCAPVCC는 3.3V를 사용할 것임을 의미합니다.

0X3C는 GLCD의 I2C 주소를 의미합니다.

 

이후 clearDisplay 메서드를 이용해 GLCD의 화면을 깨끗하게 만듭니다.

그 다음 drawPixel을 이용해 점을 하나 찍습니다.

어느 위치에 찍을지 결정해주고, (x와 y 정보) 이후 색을 지정해줍니다.

여기서는 SSD1306_WHITE를 사용하도록 하겠습니다.

 

이후 display 메서드를 이용해 GLCD에 화면을 띄웁니다.

 

업로드를 하면 화면에 점 하나까 뜨는 것을 확인할 수 있습니다.

회로는 SCL와 A5, SDA와 A4를 연결하면 됩니다.

GLCD에 선 그리기

이제 GLCD에 선을 그려보겠습니다.

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

#define width 128
#define height 32

Adafruit_SSD1306 display(width, height,&Wire,-1);

void setup() {
  // put your setup code here, to run once:
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
}

void loop() {
  // put your main code here, to run repeatedly:
  for(int i = 0; i < 128; i += 5) {
    display.drawLine(i, 0, i, height, SSD1306_WHITE);
    display.display();
    delay(500);
  }
  display.clearDisplay();
  display.display();
  delay(500);
}

 

설정하는 부분은 점을 찍는 코드와 동일합니다. 

여기서는 loop안에 있는 코드에 대해서 살펴보도록 하겠습니다.

for(int i = 0; i < 128; i += 5) {
    display.drawLine(i, 0, i, height, SSD1306_WHITE);
    display.display();
    delay(500);
  }

 

이 코드는 0.5초마다 한번씩 줄을 하나 그리는 코드입니다. 

(i,0)에서 (i,32)까지 선을 그리도록 설정했습니다.

이는 drawLine 메서드를 사용함으로써 가능합니다.

매개변수로 x1, y1, x2, y2를 적어주고, 마지막에 색을 지정해주면 됩니다.

이후 display 메서드를 이용해 화면에 띄우고, 0.5초 대기합니다.

 

i의 최대값을 128로 설정하여 화면 바깥으로 나가는 일이 없도록 했습니다.

 

  display.clearDisplay();
  display.display();
  delay(500);

 

for문이 다 돌아가면 화면을 다시 초기화 시킵니다.

이후 0.5초 대기하고 다시 for문으로 돌아가 선을 그립니다.

 

코드를 업로드하면 다음과 같이 GLCD에 줄이 그려집니다.

실행 결과
실행 결과

 

반응형