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