예전 글(http://deneb21.tistory.com/508)에서 노키아 5110 LCD를 아두이노로 컨트롤 하는 방법에 대해서 알아보았다. 이번에는 그래픽 라이브러리를 사용해서 간단한 그래픽을 나타내 보려고 한다. 라이브러리는 Adafruit 의 GFX 라이브러리와 PCD8544(5110 LCD 정식 품명) 라이브러리를 이용했으며 다운 받은 라이브러리에 포함된 예제를 핀배열과 백라이트 부분을 살짝 수정해서 그래픽을 표시해 보았다. 5110 LCD에 대한 기본적인 사항은 이 글의 첫 줄에 있는 예전 글을 참고하면 된다.
연결은 예전과 동일하다. 만약 라이브러리 파일의 예제 그대로 연결하고 싶다면 아래의 연결을 따르지 않아도 된다. 물론 아래의 소스도 수정이 되어야 할 것이다.
소스는 setup() 에서 여러가지 도형 및 문자를 출력하는 function을 순차적으로 실행하고 있다. 각 function 들을 자세히 보면 어떻게 도형과 문자 그리고 애니메이션을 만드는지 알 수 있을 것이다. 복잡한 부분은 라이브러리와 되어 있어서 자세히 살펴보면 별로 어려운 부분은 없다. 대부분의 기능들이 예를 들어 display.clearDisplay(); 같이 간단하게 제어가 가능하게 되어있다.
조금 전 포스팅한 OLED 디스플레이와 DHT11 센서를 이용한 온습도계를 개선해 보았다. 글자가 너무 작아서 잘 안보이길래 텍스트 크기를 크게 했으며 (벌써 노안인가? ㅠㅠ) 기상청에서 퍼온 불쾌지수 구하는 공식을 활용하여 온도, 습도, 불쾌지수가 표시되게 하였다. 불쾌지수는 온도와 습도로 구할 수 있다. 불쾌지수 (Discomfort Index) 가 80을 넘으면 대부분의 사람이 불쾌감을 느끼게 되며 실제로도 80이 넘으면 폭력, 살인 등 강력사건이 늘어난다고 한다.
아두이노와 센서, OLED 디스플레이의 연결은 바로 전 포스팅과 같으며 소스만 수정이 되었다. 그러므로 소스 이외의 사항은 아래의 글을 참고하면 된다.
소스를 보면 display.setTextSize(1) 에서 display.setTextSize(2) 로 텍스트 크기를 1 증가 시켰으며 discomfortindex() 함수를 추가해서 불쾌지수를 표시해 주도록 하였다. 그리고 의미 없는 온도와 습도의 소수점 이하 자리를 잘라 버렸다.
지난 글에서 0.96 인치 디스플레이 모듈에 텍스트를 표시하는 방법을 알아 보았다. 내친김에 DHT11 온습도 센서와 연결해서 온습도계를 만들어 보았다. 아두이노와 OLED 디스플레이의 연결은 기존 글에서와 같으며 거기에 DHT11 센서를 추가하고 아두이노 IDE의 시리얼 모니터에 출력하던 온도, 습도 데이터를 OLED 디스플레이에 출력하는 것으로 전환 하였다.
예전 글 "[아두이노] 0.96인치 OLED LCD 모듈의 사용 (Adafruit SSD1306 호환)" 에서 이 디스플레이 모듈에 대해서 Adafruit 의 조금은 긴 예제를 실행해 보았다. 이 모듈은 간단한 애니메이션, 그림도 표현이 가능하나 나 같은 경우 딱히 그런 용도로 쓸 것 같지는 않다. 거의 텍스트 표시 용도로 사용될 것인데 예전 글에서 실행했던 예제는 너무 길고 좀 정신이 없었다. 그래서 그 예제 소스 중에서 텍스트 표시 하는 부분만 간추리고 소스에 주석을 달아서 사용법을 정리해 보려고 한다.
연결방법과 라이브러리 설치는 예전 글에서와 같다. 그래도 살짝 다시 정리를 해 보면...
모듈은 위와 같이 생겼다. 100원짜리 정도의 크기이며 모노크롬 화면으로서 128x64 의 해상도를 가진다. 7개의 핀을 아두이노와 연결해서 사용한다.
아두이노의 내용을 디스플레이 하는데는 예전에 알아보았던 16x2 LCD 모듈이나 7 세그먼트 LED를 이용하는 방법외에도 화소수가 훨씬 많은 OLED 모듈을 이용하는 방법도 있습니다. 제가 가진 모듈은 128x64 의 해상도를 가지고 있어서 텍스트는 물론 간단한 그래픽이나 애니메이션 등을 표현할 수 있습니다. 이번에 구입한 모듈은 SPI 통신을 지원하는 OLED 디스플레이 모듈로서 0.96 인치의 손목시계 크기 모듈입니다. 아두이노 프로 미니 등의 작은 아두이노와 결합하면 손목시계나 소형 온습도계, 조금 더 발전한다면 간단한 게임도 구현이 가능할 것 같습니다. 테스트겸 Adafruit 의 라이브러리와 예제소스를 이용하여 OLED 모듈을 돌려보았습니다.
OLED 모듈의 스펙
0.96 인치 OLED
128 x 64 해상도
SPI 통신
3V ~ 5V 동작전압
OLED 모듈의 PIN
GND (Ground)
VDD (3V ~ 5V)
SCK (Serial Clock Input, D0 으로 표시된 모듈도 있음)
SDA (Serial Data Input, D1 으로 표시된 모듈도 있음)
RES (Reset Signal Input, RST 로 표시된 모듈도 있음)
DC (Data / Command Control)
CS (Chip Select)
OLED 모듈의 모습입니다. 백원짜리 동전과 크기가 비슷합니다. 7개의 연결핀이 있습니다. 핀에는 각각의 용도가 쓰여 있습니다.
뒷면 입니다. 7개의 암핀을 꼽을 수 있도록 되어 있고 보드와 OLED 를 연결하는 갈색의 케이블이 보입니다.
위의 사진과 같이 아두이노와 연결했습니다. 연결은 다음과 같이 하였습니다.
0.96" OLED Display Module
아두이노 우노
GND
GND
VDD
3.3V (5V에 연결해도 됩니다.)
SCK
D10
SDA
D9
RES
D13
DC
D11
CS
D12
소스
아래의 소스를 구동하기 위해서는 아래의 사이트에서 두 개의 Adafruit라이브러리를 다운로드 받아서 설치해야 합니다.
■ SSD1306 oled driver library for 'monochrome' 128x64 and 128x32 OLEDs
이 부분에서 컴파일 에러가 나고 업로드가 되지 않습니다. 라이브러리가 128x32 해상도로 설정되어 있어서 그렇습니다. 해결방법은...
1. 위에서 설치한 SSD1306 oled driver library 폴더에 들어갑니다.
2. Adafruit_SSD1306.h 파일을 편집기로 엽니다.
3. #define SSD1306_128_32 부분을 주석처리하고 #define SSD1306_128_64 의 주석을 해제 하고 저장합니다. (물론 128x32 해상도의 모듈을 사용한다면 수정하지 않아도 됩니다.)
4. 아두이노 IDE를 닫았다가 다시 실행하고 소스를 다시 업로드 하면 컴파일이 될 것 입니다.
소스를 보면 영어이긴 하지만 자세하게 설명이 달려 있습니다. 텍스트를 표시하는건 display.println("Hello, world!"); 이런 식으로 아주 간단하게 표시가 가능하고 부가적으로 텍스트 크기, 컬러, 표시 위치 등의 설정 등이 가능합니다. 스크롤도 간단하게 가능하네요. 소스와 주석을 참고하면 거의 모든 것을 그릴 수 있을 것 같습니다.