디스플레이 화면 변경
디스플레이에 표시되는 문자들을 변경해야 될 경우가 있습니다. 디스플레이를 다룰 때 발생할 수 있는 문제를 피할수 있도록 코드를 구현해보도록 하겠습니다.
먼저 이전에 작성했던 코드들에서 C 버튼을 누르면 ‘ON’ 이 디스플레이에 표시되고, D 버튼을 누르면 ‘OFF’ 가 디스플레이에 표시되도록 해보겠습니다.
1#include "ssd1306.h" // 라이브러리 포함
2
3void setup()
4{
5 // put your setup code here, to run once:
6 pinMode(11,INPUT_PULLUP); // C 버튼
7 pinMode(12,INPUT_PULLUP); // D 버튼
8
9 ssd1306_128x32_i2c_init(); // 32로 변경
10 ssd1306_fillScreen(0x00); // 화면 초기화
11 ssd1306_setFixedFont(ssd1306xled_font6x8); // 폰트 설정
12 ssd1306_flipHorizontal(1); // x 화면 대칭 회전
13 ssd1306_flipVertical(1); // y 화면 대칭 회전
14}
15
16void loop()
17{
18 // put your main code here, to run repeatedly:
19 if(digitalRead(11)==LOW)
20 {
21 // 화면에 ON 표시
22 ssd1306_printFixedN (0, 0, "ON", STYLE_NORMAL, FONT_SIZE_2X);
23 }
24 else if(digitalRead(12)==LOW)
25 {
26 // 화면에 OFF 표시
27 ssd1306_printFixedN (0, 0, "OFF", STYLE_NORMAL, FONT_SIZE_2X);
28 }
29}
위 처럼 C 버튼과 D 버튼이 눌려질 때마다 디스플레이 화면이 바뀌도록 하였습니다.
실제로 적용하면, 아래와 같은 문제가 발생합니다.
이런 문제를 해결하려면, 글자를 변경하고자 하는 순간에 화면을 초기화 해주어야 합니다. (10줄 함수 참고)
적용하면 다음과 같습니다.
1#include "ssd1306.h" // 라이브러리 포함
2
3void setup()
4
5 // put your setup code here, to run once:
6 pinMode(11,INPUT_PULLUP); // C 버튼
7 pinMode(12,INPUT_PULLUP); // D 버튼
8
9 ssd1306_128x32_i2c_init(); // 32로 변경
10 ssd1306_fillScreen(0x00); // 화면 초기화
11 ssd1306_setFixedFont(ssd1306xled_font6x8); // 폰트 설정
12 ssd1306_flipHorizontal(1); // x 화면 대칭 회전
13 ssd1306_flipVertical(1); // y 화면 대칭 회전
14}
15
16void loop()
17{
18 // put your main code here, to run repeatedly:
19 if(digitalRead(11)==LOW)
20 {
21 ssd1306_fillScreen(0x00); // 화면 초기화
22 // 화면에 ON 표시
23 ssd1306_printFixedN (0, 0, "ON", STYLE_NORMAL, FONT_SIZE_2X);
24 }
25 else if(digitalRead(12)==LOW)
26 {
27 ssd1306_fillScreen(0x00); // 화면 초기화
28 // 화면에 OFF 표시
29 ssd1306_printFixedN (0, 0, "OFF", STYLE_NORMAL, FONT_SIZE_2X);
30 }
31}
하지만 이 경우에도 약~간의 문제가 있습니다. 버튼을 길게 누르면 화면이 이상해지는 것을 볼 수있습니다.
버튼을 1초 누르고 있는 동안에도 여러번의 화면 초기화와 디스플레이에 문자 표시가 반복되면서, 흐릿하게 보이는 증상입니다.
이 증상을 해결하는 방법이 여러가지가 있지만, 레벨2에서는 간단한 방법으로 해결해 보겠습니다.
bool 값을 추가하고 이 값을 이용하는 방법입니다.
처음 버튼을 누를때 이 bool 변수 값이 바뀌고, 손에서 떼기 전까지는 값을 유지 하도록 코드를 작성해보세요. 약간의 난이도가 있을 수 있습니다.
작성하고 업로드 하여 정상적으로 작동하는지 확인하고, 아래 코드와 비교해봅니다.
1#include "ssd1306.h" // 라이브러리 포함
2
3bool isPushed = false; // 버튼 상태 확인용
4
5void setup()
6{
7 // put your setup code here, to run once:
8 pinMode(11,INPUT_PULLUP); // C 버튼
9 pinMode(12,INPUT_PULLUP); // D 버튼
10
11 ssd1306_128x32_i2c_init(); // 32로 변경
12 ssd1306_fillScreen(0x00); // 화면 초기화
13 ssd1306_setFixedFont(ssd1306xled_font6x8); // 폰트 설정
14 ssd1306_flipHorizontal(1); // x 화면 대칭 회전
15 ssd1306_flipVertical(1); // y 화면 대칭 회전
16}
17
18void loop()
19{
20 // put your main code here, to run repeatedly:
21 if(digitalRead(11)==LOW)
22 {
23 if(!isPushed)
24 {
25 ssd1306_fillScreen(0x00); // 화면 초기화
26 // 화면에 ON 표시
27 ssd1306_printFixedN (0, 0, "ON", STYLE_NORMAL, FONT_SIZE_2X);
28
29 isPushed = true;
30 }
31 }
32 else if(digitalRead(12)==LOW)
33 {
34 if(!isPushed)
35 {
36 ssd1306_fillScreen(0x00); // 화면 초기화
37 // 화면에 OFF 표시
38 ssd1306_printFixedN (0, 0, "OFF", STYLE_NORMAL, FONT_SIZE_2X);
39
40 isPushed = true;
41 }
42 }
43 else
44 {
45 isPushed = false;
46 }
47}