디스플레이 화면 변경

디스플레이에 표시되는 문자들을 변경해야 될 경우가 있습니다. 디스플레이를 다룰 때 발생할 수 있는 문제를 피할수 있도록 코드를 구현해보도록 하겠습니다.
먼저 이전에 작성했던 코드들에서 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 버튼이 눌려질 때마다 디스플레이 화면이 바뀌도록 하였습니다.
실제로 적용하면, 아래와 같은 문제가 발생합니다.

../../_images/Remaining_Text.gif

이런 문제를 해결하려면, 글자를 변경하고자 하는 순간에 화면을 초기화 해주어야 합니다. (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}
하지만 이 경우에도 약~간의 문제가 있습니다. 버튼을 길게 누르면 화면이 이상해지는 것을 볼 수있습니다.
../../_images/Blinking.gif

버튼을 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}