]> git.friedersdorff.com Git - max/battery_tester.git/blob - battery_tester.ino
Fix bug
[max/battery_tester.git] / battery_tester.ino
1
2 #include <LightChrono.h>
3 #include <Chrono.h>
4
5 const float APPARENT_SHUNT_RESISTANCE = 0.453;
6 const float VOLTAGE_REFERENCE = 2.489;
7
8 float ampseconds = 0;
9 float wattseconds = 0;
10
11 const int digits[] = {2, 3, 4, 5};
12 const int segments[] = {6, 7, 8, 9, 10, 11, 12, 13};
13
14 const bool one[7] = {false, true, true, false, false, false, false};
15 const bool two[7] = {true, true, false, true, true, false, true};
16 const bool three[7] = {true, true, true, true, false, false, true};
17 const bool four[7] = {false, true, true, false, false, true, true};
18 const bool five[7] = {true, false, true, true, false, true, true};
19 const bool six[7] = {true, false, true, true, true, true, true};
20 const bool seven[7] = {true, true, true, false, false, false, false};
21 const bool eight[7] = {true, true, true, true, true, true, true};
22 const bool nine[7] = {true, true, true, true, false, true, true};
23 const bool zero[7] = {true, true, true, true, true, true, false};
24
25 Chrono timer;
26
27
28 void writeDigit(char d, char val) {
29     const bool *segs;
30     switch (val) {
31         case 0:
32             segs = zero;
33             break;
34         case 1:
35             segs = one;
36             break;
37         case 2:
38             segs = two;
39             break;
40         case 3:
41             segs = three;
42             break;
43         case 4:
44             segs = four;
45             break;
46         case 5:
47             segs = five;
48             break;
49         case 6:
50             segs = six;
51             break;
52         case 7:
53             segs = seven;
54             break;
55         case 8:
56             segs = eight;
57             break;
58         case 9:
59             segs = nine;
60             break;
61     }
62     for (int i = 0; i < 7; ++i) {
63         if (segs[i]) {
64             digitalWrite(segments[i], HIGH);      
65         } else {
66             digitalWrite(segments[i], LOW);
67         }
68     }
69     digitalWrite(digits[d], LOW);
70     delay(1);
71     digitalWrite(digits[d], HIGH);
72 }
73
74 void showNumber(float number) {
75     int n = number;
76     writeDigit(0, (n/1000U) % 10);
77     writeDigit(1, (n/100U) % 10);
78     writeDigit(2, (n/10U) % 10);
79     writeDigit(3, n % 10);
80 }
81
82
83 void setup() {
84     // put your setup code here, to run once:
85     Serial.begin(9600);
86     analogReference(EXTERNAL);
87
88     for (int i = 0; i < 4; ++i) {
89         pinMode(digits[i], OUTPUT);
90         digitalWrite(digits[i], HIGH);
91     }
92     for (int i = 0; i < 8; ++i) {
93         pinMode(segments[i], OUTPUT);
94         digitalWrite(segments[i], LOW);
95     }
96 }
97
98 void loop() {
99     float shunt_voltage;
100     float shunt_current;
101     float battery_voltage;
102     float amps_in_period;
103     float watts_in_period;
104     float mamphours;
105     float mwatthours;
106
107     if (timer.hasPassed(1000)) {
108         unsigned long passed = timer.elapsed();
109         timer.restart();
110         battery_voltage = readVoltage(A0);
111
112         if (battery_voltage < 0.8) {
113             delay(200);
114         } else {
115
116             shunt_voltage = readVoltage(A1);
117             shunt_current = shunt_voltage/APPARENT_SHUNT_RESISTANCE;
118
119
120             amps_in_period = shunt_current * passed/1000;
121             watts_in_period = amps_in_period * battery_voltage;
122
123             ampseconds += amps_in_period;
124             wattseconds += watts_in_period;
125             mamphours = ampseconds/3.6;
126             mwatthours = wattseconds/3.6;
127         }
128     }
129     showNumber(mamphours);
130 }
131
132 float readVoltage(int pin) {
133
134     int val = 0;
135     for (int i = 0; i < 4; ++i) {
136         val = val + analogRead(pin);
137         delay(0.5);
138     }
139
140     return (val / 4) * VOLTAGE_REFERENCE/1023.0;
141 }