미세먼지 표시기 만들 때 사용했던 0.96인치 OLED 디스플레이에 대한 사용법 테스트

(https://code-for-fun.tistory.com/9)


준비물

1) 아두이노 나노

2) 0.96인치 OLED


순서

1) 회로도 작성 및 연결

2) 테스트 예제 작성

3) 테스트


1. 회로도 작성 및 연결

OLED - 아두이노 나노

SCL   - A5

SDA  - A4

VCC  - 5V

GND - GND


2. 테스트 예제 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
//#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h> // 이 헤더 안에 Adafruit_GFX.h, Wire.h 등이 들어있음. 이거 하나만 include 해도 OK
 
#define SCREEN_WIDTH 128 // OLED 디스플레이 가로 픽셀 수
#define SCREEN_HEIGHT 64 // OLED 디스플레이 세로 픽셀 수
 
// 아두이노에 연결할 리셋 핀번호. -1이면 리셋기능 안 씀 설정이지만 디스플레이에 따라서 마이크로컨트롤러의 리셋과 연결
#define OLED_RESET -1 
 
// 디스플레이 객체 생성. 다른 생성자도 있으나 아래것이 제일 무난해 보임.
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
 
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
 
  // begin(): 이미지버퍼를 위한 램 할당 및 디스플레이 초기화. 디스플레이 사용을 위해 필수적.
  // SSD1306_SWITCHCAPVCC: 3.3V에서 디스플레이용 전압을 만드는 설정이라고 함. 다만 사용한 OLED 제품은 3.3V~5V지원. 
  //                       실제로 5V로 사용했으나 문제없었음.
  // 0x3C: I2C주소. 기본값은 128x32용 0x3C, 나머지는 0x3D로 되어있음. 
  //       하지만 사용한 OLED 제품은 128x64지만 0x3C를 써야했음. 
  //       I2C주소 스캔 프로그램을 돌려서 확실하게 하는 편이 좋다고 생각됨.
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 initialize failed"));
    
    // 디스플레이 초기화 실패 시
    return;
  }
}
 
void loop() {
  // put your main code here, to run repeatedly:
  
  // OLED에 표시
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println(F("1"));
  display.println(F("2"));
  display.println(F("3"));
  display.println(F("4"));
  display.println(F("5"));
  display.println(F("6"));
  display.println(F("7"));
  display.println(F("8"));  // 8까지만 보임.
  display.println(F("9"));
  display.println(F("10"));
  display.println(F("11"));
  display.println(F("12"));
  display.display();
 
  delay(3000);
 
  display.clearDisplay();
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println(F("12345678")); // 8은 다음줄로 줄바꿈 됨.
  display.display();
 
  delay(3000);
  
  display.clearDisplay();       // 화면 지우기
  display.setTextSize(1);       // 글자 크기 설정. 1은 너무 작음. 세로는 8픽셀.
  display.setTextColor(WHITE);  // 글자 색 설정
  display.setCursor(0,0);       // 커서 위치 설정(열,행)
  display.println(F("TEST1"));  // 램에 println. 줄바꿈 됨.
  display.setTextSize(2);       // 세로는 16픽셀.
  display.println(F("TEST2"));
  display.setTextSize(3);       // 글자 크기 3은 너무 큼. 7자 정도가 한계. 세로는 24픽셀.
  display.println(F("TEST3"));
  display.display();            // 화면에 표시. 현재 램의 내용을 디스플레이에 표시
 
  delay(2000);
 
  // 오른쪽으로 화면 스크롤 시작. 0x00~0x0F는 현재 화면의 시작부터 끝까지 전체를 스크롤 시킨다는 것
  display.startscrollright(0x000x0F);
  delay(2000);  // 스크롤 되는 동안 프로그램은 대기. 화면은 별개로 스크롤 됨. 즉 이 delay는 스크롤 되는 시간.
  display.startscrollright(0x000x0F); // 현재 화면의 스크롤이므로 위에 스크롤 된 것에서 이어서 스크롤 됨. 
                                        // 화면 넘어가면 반대쪽으로 이어짐.
  delay(1000);
 
  display.startscrollright(0x000x00); // TextSize=1만큼만 스크롤. 세로 4픽셀만 가로로 스크롤.
  delay(2000);
 
  display.startscrollright(0x000x02); // 0~2. 3/8만큼만 스크롤. 세로 12픽셀만 가로로 스크롤.
  delay(2000);
 
  display.startscrollright(0x000x05); // 0~5. 6/8만큼만 스크롤. 세로 48픽셀만 가로로 스크롤.
  delay(2000);
  
  display.stopscroll(); // 스크롤 멈춤
  delay(1000);
 
  testdrawbitmap();    // 16x16짜리 별모양 그리기
 
  display.invertDisplay(true); // 디스플레이 반전
  delay(1000);
  display.invertDisplay(false);
  delay(1000);
 
  delay(1000*60);
}
 
void testdrawbitmap(void) {
  display.clearDisplay();
 
  display.drawBitmap(
    (display.width()  - LOGO_WIDTH ) / 2// 시작 x위치
    (display.height() - LOGO_HEIGHT) / 2// 시작 y위치
    logo_bmp,   // bitmap. byte array with monochrome bitmap
    LOGO_WIDTH, // Width of bitmap in pixels
    LOGO_HEIGHT,// Hieght of bitmap in pixels
    1);         // color. 16-bit 5-6-5 Color to draw with. 색깔인데 어차피 단색 OLED라서...
  display.display();
  delay(1000);
}
cs


3. 테스트

잘 됩니다.


마무리

1) Adafruit_SSD1306 display(디스플레이 가로 픽셀 수, 디스플레이 세로 픽셀 수, &Wire, -1) 로 사용하면 무난하게 가능함

2) display.begin(SSD1306_SWITCHCAPVCC, I2C주소) 에서 I2C주소는 스캔해서 정확하게 넣어주면 OK

3) 글자 크기, 스크롤 방법 등은 예제 참조.

4) Adafruit 라이브러리 살펴보면 많은 참고가 되겠으나 복잡해서... 일단 간단하게 사용하기에는 위의 내용만으로도 충분할 듯.

+ Recent posts