]> git.friedersdorff.com Git - max/battery_tester.git/blob - battery_tester.ino
Add battery tester
[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     unsigned long passed = timer.elapsed();
108     timer.restart();
109
110     shunt_voltage = readVoltage(A1);
111     shunt_current = shunt_voltage/APPARENT_SHUNT_RESISTANCE;
112
113     battery_voltage = readVoltage(A0);
114
115     amps_in_period = shunt_current * passed/1000;
116     watts_in_period = amps_in_period * battery_voltage;
117     
118     ampseconds += amps_in_period;
119     wattseconds += watts_in_period;
120     mamphours = ampseconds/3.6;
121     mwatthours = wattseconds/3.6;
122   }
123   showNumber(mamphours);
124 }
125
126 float readVoltage(int pin) {
127   
128   int val = 0;
129   for (int i = 0; i < 4; ++i) {
130     val = val + analogRead(pin);
131     delay(0.5);
132   }
133
134   return (val / 4) * VOLTAGE_REFERENCE/1023.0;
135 }