온도 설정하기

온도를 측정하고 유지하는 것까지 알았습니다. 이제는 온도를 직접 설정하는 방법에 대해서 알아보겠습니다.
원하는 온도를 세세하게 설정하기엔 복잡함이 있음으로, 미리 재료에 적절한 온도 값을 저장하고, 그 값을 불러내어 목표온도로 설정하는 방식을 구현 해보는 것이 목표입니다.

재료에 맞는 온도 값을 미리 배열로 저장하고 불러오기 위해, 변수와 배열을 선언 합니다.
1int curTemp        = 0; // 계산된 온도
2int targetTemp     = 0; // 설정 온도
3int presetIndex    = 0; // 저장된 설정 온도의 현재 순번
4
5                  // 기본, PCL, PLA
6int presetTemp[3] = { 0,  60,  200 };

배열과 함께 변수가 2개 추가되었습니다. 먼저 현재온도가 아닌 목표온도(설정온도)가 무슨 값을 가지고 있는지 저장하고, 알기 위해 targetTemp 변수를 만들었습니다. 이어서 배열은 길이가 3개 입니다. 각각 0도 60도 200도를 설정할 수 있도록 3개의 항목이 배열에 저장되어 있습니다.
이 배열 현재의 위치를 가르키고 있는 숫자를 인덱스(index)라고 합니다. 인덱스의 뜻은 지표, 색인, 지수등을 뜻합니다. 프로그래밍에서는 배열[인덱스]와 같은 형태로 사용됩니다. 인덱스 변수와 배열은 코드로는 다음과 같습니다.
1targetTemp = presetTemp[presetIndex];

presetTemp의 배열의 presetIndex 의 위치의 값을 설정온도(targetTemp)로 저장하겠다는 표시입니다.
여기에서 버튼을 누를 때마다 presetIndex가 1씩 증가(혹은 감소)하면, targetTemp 의 값도 계속해서 변경되어질 것입니다.

버튼을 누를 때마다 설정온도가 변경되도록 전체 코드를 작성해봅니다. 그리고 아래 코드와 비교해 봅니다.
  1int curTemp = 0;
  2int targetTemp = 0;
  3int presetIndex = 0;
  4
  5                 // 기본, PCL, PLA
  6int presetTemp[3] = { 0,  60,  200 };
  7
  8int temptable[23][2] =
  9{
 10    {1023,0},
 11    {1022,10},
 12    {1020,20},
 13    {1016,30},
 14    {1011,40},
 15    {1009,50},
 16    {1006,60},
 17    {1004,70},
 18    {1000,80},
 19    {990,90},
 20    {983,100},
 21    {976,110},
 22    {972,120},
 23    {964,130},
 24    {955,140},
 25    {942,150},
 26    {929,160},
 27    {910,170},
 28    {895,180},
 29    {864,190},
 30    {839,200},
 31    {800,210},
 32    {744,220}
 33}; // 온도테이블
 34
 35void setup() {
 36    // put your setup code here, to run once:
 37    Serial.begin(9600);
 38
 39    pinMode(11,INPUT_PULLUP);
 40    pinMode(12,INPUT_PULLUP);
 41
 42    pinMode(9,OUTPUT);
 43}
 44
 45// 신호 값을 보정하여 온도 값을 추측해내는 계산 함수
 46int tempCali(int valueA0)
 47{
 48    float ratioTemp;
 49
 50    for(int i = 0; i<23; i++)
 51    {
 52        if(temptable[i][0] <= valueA0)
 53        {
 54            ratioTemp = ((float)valueA0 - temptable[i][0])/(temptable[i-1][0] - temptable[i][0]);
 55
 56            return temptable[i][1] - ratioTemp*(temptable[i][1] - temptable[i-1][1]);
 57        }
 58
 59    }
 60}
 61
 62void loop() {
 63    // put your main code here, to run repeatedly:
 64
 65    curTemp = tempCali(analogRead(A0)); // 온도 보상 함수 호출
 66
 67    Serial.print(", 현재 온도 값 : ");
 68    Serial.print(curTemp);
 69    Serial.print(", 설정 온도 값 : ");
 70    Serial.println(targetTemp);
 71
 72    if(curTemp > targetTemp)
 73    {
 74        digitalWrite(9, LOW); // 예열 종료
 75        delay(5); // 약간의 대기시간 추가
 76    }
 77    else
 78    {
 79        digitalWrite(9, HIGH); // 예열 시작
 80        delay(5); // 약간의 대기시간 추가
 81    }
 82
 83    if(digitalRead(11)==LOW)
 84    {
 85        presetIndex++;
 86        targetTemp = presetTemp[presetIndex];
 87
 88        if(presetIndex>2)
 89        {
 90          presetIndex = 0;
 91        }
 92        delay(100);
 93    }
 94    else if(digitalRead(12)==LOW)
 95    {
 96        presetIndex--;
 97        targetTemp = presetTemp[presetIndex];
 98
 99        if(presetIndex<0)
100        {
101          presetIndex = 2;
102        }
103        delay(100);
104    }
105
106}
107
108| 업로드  시리얼 모니터로 값을 확인해보세요.
109| ?줄의 (float)valueA0는 int 정수형 변수인 valueA0를 float 실수형 값으로 읽겠다는 뜻입니다.  부분이 없으면, 실수 값으로 계산되지 않습니다.