온도 설정하기
온도를 측정하고 유지하는 것까지 알았습니다. 이제는 온도를 직접 설정하는 방법에 대해서 알아보겠습니다.
원하는 온도를 세세하게 설정하기엔 복잡함이 있음으로, 미리 재료에 적절한 온도 값을 저장하고, 그 값을 불러내어 목표온도로 설정하는 방식을 구현 해보는 것이 목표입니다.
재료에 맞는 온도 값을 미리 배열로 저장하고 불러오기 위해, 변수와 배열을 선언 합니다.
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 실수형 값으로 읽겠다는 뜻입니다. 이 부분이 없으면, 실수 값으로 계산되지 않습니다.