모터 작동

이제 드디어 마지막 단계입니다.

모터를 작동시키려면, 먼저 예열이 되어 있어야 합니다. 또한 설정온도(60도)에 도달했는지도 확인해야 합니다.
예열 상태와 온도를 확인하고, 조건에 따라 모터를 작동되도록 구현해보는 것이 목표입니다.

다음과 같은 기능을 수행하는 코드를 작성해봅니다.

1. 예열 상태가 OFF 일 경우에는 A,B 버튼을 눌러도 모터 작동하지 않음
2. 예열 상태에서 온도가 60도 근처일 경우 A,B 버튼을 누르면 작동하도록 동작
※ 60도 근처일 때 신호 값은 979< 신호값 <983 사이로 설정
3. bool 변수를 사용하여 온도가 60도 근처일 경우를 판단하도록 작성
4. 온도가 60도 근처에 도달 할 경우, 디스플레이에 OK 표시
5. 예열을 하지 않거나, 온도가 60도 근처가 아닐 경우 디스플레이에 OFF 표시
6. A,B 버튼에 따라 모터는 서로 다른 방향으로 회전하도록 동작
7. 모터의 회전속도는 시계, 반시계 모두 255으로 설정

작성후 잘 동작하는지 확인하고, 아래 코드와 비교합니다.
  1#include "ssd1306.h" // 라이브러리 포함
  2
  3bool isPressedBtn = false; // 버튼이 눌러졌는지 확인하는 bool 변수
  4bool is60Deg = false; // 온도 도달 상태 확인용
  5int tempValueA0 = 0; // A0 신호 값 저장용
  6
  7void setup()
  8{
  9    // put your setup code here, to run once:
 10    pinMode(8,INPUT_PULLUP);   // A 버튼
 11    pinMode(7,INPUT_PULLUP);   // B 버튼
 12    pinMode(11,INPUT_PULLUP);  // C 버튼
 13    pinMode(12,INPUT_PULLUP);  // D 버튼
 14
 15    pinMode(5,OUTPUT);         // 모터 활성화 핀
 16    pinMode(6,OUTPUT);         // 모터 방향 핀
 17    pinMode(10,OUTPUT);        // 모터 속도 핀
 18
 19    pinMode(9,OUTPUT);         // 열선
 20
 21    digitalWrite(5, HIGH);     // 모터 활성화
 22
 23    ssd1306_128x32_i2c_init(); // 32로 변경
 24    ssd1306_fillScreen(0x00);  // 화면 초기화
 25    ssd1306_setFixedFont(ssd1306xled_font6x8); // 폰트 설정
 26    ssd1306_flipHorizontal(1); // x 화면 대칭 회전
 27    ssd1306_flipVertical(1);   // y 화면 대칭 회전
 28
 29    // "cremaker" 문자표시
 30    ssd1306_printFixedN (15, 0, "cremaker", STYLE_NORMAL, FONT_SIZE_2X);
 31}
 32
 33void loop()
 34{
 35    // put your main code here, to run repeatedly:
 36    if(!isPressedBtn) // isPressedBtn이 false면 아래 코드 실행
 37    {
 38        digitalWrite(9, LOW); // 예열 종료
 39        delay(5);
 40
 41        if(digitalRead(11)==LOW)
 42        {
 43            isPressedBtn = true;
 44
 45            ssd1306_fillScreen(0x00);  // 화면 초기화
 46            // 예열 중일 경우 Heating 표시
 47            ssd1306_printFixedN (0, 0, "Heating", STYLE_NORMAL, FONT_SIZE_2X);
 48        }
 49    }
 50    else // isPressedBtn이 true면 아래 코드 실행
 51    {
 52        tempValueA0 = analogRead(A0); // 아날로그 신호 값을 tempValueA0 저장
 53
 54        if(tempValueA0 < 981) // 온도 60도 유지
 55        {
 56            digitalWrite(9, LOW); // 예열 종료
 57            delay(5);
 58        }
 59        else
 60        {
 61            digitalWrite(9, HIGH); // 예열 시작
 62            delay(5); // 약간의 대기시간 추가
 63        }
 64
 65        if(tempValueA0>979 && tempValueA0<983) // 온도가 60도에 도달했는지 확인
 66        {
 67            if(is60Deg == false)
 68            {
 69                ssd1306_fillScreen(0x00);  // 화면 초기화
 70                // 예열 중일 경우 Heating 표시
 71                ssd1306_printFixedN (0, 0, "OK", STYLE_NORMAL, FONT_SIZE_2X);
 72
 73                is60Deg = true;
 74            }
 75        }
 76        else
 77        {
 78            if(is60Deg == true)
 79            {
 80                is60Deg = false;
 81
 82                ssd1306_fillScreen(0x00);  // 화면 초기화
 83                // 60도 근처가 아닐시 OFF 표시
 84                ssd1306_printFixedN (0, 0, "OFF", STYLE_NORMAL, FONT_SIZE_2X);
 85            }
 86        }
 87
 88        if(is60Deg) // 온도가 도달된 상태라면, 모터가 움직일 수 있음
 89        {
 90            if(digitalRead(8)==LOW) // A 버튼 눌렸을 경우
 91            {
 92                digitalWrite(6,LOW);
 93                analogWrite(10,255); //모터 속도 255 설정
 94            }
 95            else if(digitalRead(7)==LOW) // B 버튼 눌렸을 경우
 96            {
 97                digitalWrite(6,HIGH);
 98                analogWrite(10,0); //모터 속도 255 설정
 99            }
100            else
101            {
102                digitalWrite(6,LOW);
103                analogWrite(10,0); //모터 속도 0 설정
104            }
105        }
106
107        if(digitalRead(12)==LOW)
108        {
109            isPressedBtn = false;
110
111            ssd1306_fillScreen(0x00);  // 화면 초기화
112            // 예열 중이 아닐 경우 OFF 표시
113            ssd1306_printFixedN (0, 0, "OFF", STYLE_NORMAL, FONT_SIZE_2X);
114        }
115    }
116}