예열 상태 표시

온도에 대해서 알아본 것과 디스플레이를 함께 적용하여 예열을 하고, 예열 상태를 디스플레이로 보여주도록 구현하는 것이 목표입니다.

먼저 현재 상태가 예열중인지 아닌지를 판단하는 변수가 필요함으로 bool 변수를 코드에 추가합니다.
또한 전원을 On 하였을 경우에 “cremaker” 문자가 표시되도록 하면 다음과 같은 코드가 됩니다.

 1#include "ssd1306.h" // 라이브러리 포함
 2
 3bool isPressedBtn = false; // 버튼이 눌러졌는지 확인하는 bool 변수
 4
 5void setup()
 6{
 7    // put your setup code here, to run once:
 8    pinMode(8,INPUT_PULLUP);   // A 버튼
 9    pinMode(7,INPUT_PULLUP);   // B 버튼
10    pinMode(11,INPUT_PULLUP);  // C 버튼
11    pinMode(12,INPUT_PULLUP);  // D 버튼
12
13    pinMode(5,OUTPUT);         // 모터 활성화
14    pinMode(6,OUTPUT);         // 모터 방향
15    pinMode(10,OUTPUT);        // 모터 속도
16
17    pinMode(9,OUTPUT);         // 열선
18
19    ssd1306_128x32_i2c_init(); // 32로 변경
20    ssd1306_fillScreen(0x00);  // 화면 초기화
21    ssd1306_setFixedFont(ssd1306xled_font6x8); // 폰트 설정
22    ssd1306_flipHorizontal(1); // x 화면 대칭 회전
23    ssd1306_flipVertical(1);   // y 화면 대칭 회전
24
25    // "cremaker" 문자표시
26    ssd1306_printFixedN (15, 0, "cremaker", STYLE_NORMAL, FONT_SIZE_2X);
27}
28
29void loop()
30{
31    // put your main code here, to run repeatedly:
32
33}

위의 코드를 아래 기능이 작동되도록 코드륵 작성해봅니다.
1. C 버튼을 누르면 예열이 되도록 하고, 디스플레이에 Heating 표시
2. D 버튼을 누르면 예열이 멈추게 하고, 디스플레이에 OFF 표시
3. 온도는 60도를 유지

※예열을 하기 위해 3D 펜의 전원 플러그를 연결합니다. 열을 올리는 부분이 전력을 많이 소비하기 때문입니다.

온도 관련 함수, 코드들은 여기 에서 확인하세요.
버튼이 길게 눌러질 때 디스플레이가 흐려지는 것을 방지하는 코드 를 확인하세요.
Heating과 OFF 문자의 위치는 원하는 위치로 설정합니다. (다만 너무 구석이면 글자가 짤릴 수 있습니다.)

작성후 잘 동작하는지 확인하고, 아래 코드와 비교합니다.
 1#include "ssd1306.h" // 라이브러리 포함
 2
 3bool isPressedBtn = false; // 버튼이 눌러졌는지 확인하는 bool 변수
 4int tempValueA0 = 0; // A0 신호 값 저장용
 5
 6void setup()
 7{
 8    // put your setup code here, to run once:
 9    pinMode(8,INPUT_PULLUP);   // A 버튼
10    pinMode(7,INPUT_PULLUP);   // B 버튼
11    pinMode(11,INPUT_PULLUP);  // C 버튼
12    pinMode(12,INPUT_PULLUP);  // D 버튼
13
14    pinMode(5,OUTPUT);         // 모터 활성화 핀
15    pinMode(6,OUTPUT);         // 모터 방향 핀
16    pinMode(10,OUTPUT);        // 모터 속도 핀
17
18    pinMode(9,OUTPUT);         // 열선
19
20    digitalWrite(5, HIGH);     // 모터 활성화
21
22    ssd1306_128x32_i2c_init(); // 32로 변경
23    ssd1306_fillScreen(0x00);  // 화면 초기화
24    ssd1306_setFixedFont(ssd1306xled_font6x8); // 폰트 설정
25    ssd1306_flipHorizontal(1); // x 화면 대칭 회전
26    ssd1306_flipVertical(1);   // y 화면 대칭 회전
27
28    // "cremaker" 문자표시
29    ssd1306_printFixedN (15, 0, "cremaker", STYLE_NORMAL, FONT_SIZE_2X);
30}
31
32void loop()
33{
34    // put your main code here, to run repeatedly:
35    if(!isPressedBtn) // isPressedBtn이 false면 아래 코드 실행
36    {
37        digitalWrite(9, LOW); // 예열 종료
38        delay(5);
39
40        if(digitalRead(11)==LOW)
41        {
42            isPressedBtn = true;
43
44            ssd1306_fillScreen(0x00);  // 화면 초기화
45            // 예열 중일 경우 Heating 표시
46            ssd1306_printFixedN (0, 0, "Heating", STYLE_NORMAL, FONT_SIZE_2X);
47        }
48    }
49    else // isPressedBtn이 true면 아래 코드 실행
50    {
51        tempValueA0 = analogRead(A0); // 아날로그 신호 값을 tempValueA0 저장
52
53        if(tempValueA0 < 981) // 온도 60도 유지
54        {
55            digitalWrite(9, LOW); // 예열 종료
56            delay(5);
57        }
58        else
59        {
60            digitalWrite(9, HIGH); // 예열 시작
61            delay(5);
62        }
63
64        if(digitalRead(12)==LOW)
65        {
66            isPressedBtn = false;
67
68            ssd1306_fillScreen(0x00);  // 화면 초기화
69            // 예열 중이 아닐 경우 OFF 표시
70            ssd1306_printFixedN (0, 0, "OFF", STYLE_NORMAL, FONT_SIZE_2X);
71        }
72    }
73}