-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
-
67
-
68
-
69
-
70
-
71
-
72
-
73
-
74
-
75
-
76
-
77
-
78
-
79
-
80
-
81
-
82
-
83
-
84
-
85
-
86
-
87
-
88
-
89
-
90
-
91
-
92
-
93
-
94
-
95
-
96
-
97
-
98
-
99
-
100
-
101
-
102
-
103
-
104
-
105
-
106
-
107
-
108
-
109
-
110
-
111
-
112
-
113
-
114
-
115
-
116
-
117
-
118
-
119
-
120
-
121
-
122
-
123
-
124
-
125
-
126
-
127
-
128
-
129
-
130
-
131
-
132
-
133
-
134
-
135
-
136
-
137
/*
______ _______ _______ _______ _______ _______ _____ ______
| \ |______ | |______ | | | | |_____/
|_____/ |______ | |______ |_____ | |_____| | \_
______ _ _ _____ ______ _____ __ _ ______ _ _ _______
|_____] | | | | \ | | \ | | ____ \ / ______|
|_____] |_____| __|__ |_____/ __|__ | \_| |_____| \/ |______
Ladue Horton Watkins High School Science Olympiad
*/
/*
TODO
- Numerical precision
*/
#include <curveFitting.h>
#include <detectorBuilding.h>
const bool DEBUG = 0; // Debug mode
const int n = 5; // Number of data points
const int m = 1; // Number of segments
const int deg = 3; // Regression degree
ld data[2 * n] = {
// V T
2.25, 20.4,
3.66, 48.0,
2.95, 32.7,
3.91, 49.4,
4.22, 66.9
}; // Number of data points is (last line number - 30)
ld coeff[m][deg + 1], V[n], T[n];
void setup() {
Serial.begin(9600);
pinMode(LED_R, OUTPUT);
pinMode(LED_G, OUTPUT);
pinMode(LED_B, OUTPUT);
for (int i = 0; i < n; i++) {
V[i] = data[2 * i];
T[i] = data[2 * i + 1];
}
sort(V, n);
sort(T, n);
ld x[n], y[n];
for (int i = 0; i < n; i++) x[i] = log(v2r(V[i])) - 7;
for (int i = 0; i < n; i++) y[i] = 1000 / c2k(T[i]);
if (DEBUG) {
for (int i = 0; i < n; i++) {
Serial.print("{");
Serial.print((double)x[i], 12);
Serial.print(", ");
Serial.print((double)y[i], 12);
Serial.print("},");
Serial.println();
}
}
for (int i = 0; i < m; i++) {
int ret = fitCurve(deg, n/m, x+i*n/m, y+i*n/m, deg + 1, coeff[i]);
if (DEBUG && ret == 0) { // Returned value is 0 if no error
char c = 'A';
Serial.println("Coefficients are:");
for (int j = 0; j <= deg; j++){
Serial.print(c++);
Serial.print(": ");
Serial.print((double)coeff[i][j], 12);
Serial.println();
}
}
}
}
void loop() {
int V_raw = analogRead(THERM); // Read in raw analog value
ld V_out = a2d(V_raw);
int s = 0; // Find correct segment
while (s + 1 < m && V_out < (V[s*n/m-1] + V[s*n/m]) / 2) s++;
ld logR = log(v2r(V_out)) - 7;
ld sum = 0, prod = 1;
for (int i = 0; i <= deg; i++) {
sum += coeff[s][deg - i] * prod;
prod *= logR;
}
ld K = 1000 / sum;
ld C = k2c(K);
ld F = c2f(C);
// LED stuff
if (C <= 30) { // Cold
digitalWrite(LED_R, LOW);
digitalWrite(LED_G, LOW);
digitalWrite(LED_B, HIGH);
}
else if (C <= 50) { // Medium
digitalWrite(LED_R, LOW);
digitalWrite(LED_G, HIGH);
digitalWrite(LED_B, LOW);
}
else if (C <= 75) { // Hot
digitalWrite(LED_R, HIGH);
digitalWrite(LED_G, LOW);
digitalWrite(LED_B, LOW);
}
else { // Something seriously wrong
digitalWrite(LED_R, HIGH);
digitalWrite(LED_G, HIGH);
digitalWrite(LED_B, HIGH);
}
// Output voltage, temperature
Serial.print("Raw analog reading: ");
Serial.print((double)V_raw);
Serial.print(" Voltage (V): ");
Serial.print((double)V_out);
Serial.print(" Temperature (°C): ");
Serial.print((double)C);
//Serial.print(" logR: ");
//Serial.print(logR);
Serial.println();
delay(500);
return;
}