2 #include <LightChrono.h>
5 const float APPARENT_SHUNT_RESISTANCE = 0.453;
6 const float VOLTAGE_REFERENCE = 2.489;
11 const int digits[] = {2, 3, 4, 5};
12 const int segments[] = {6, 7, 8, 9, 10, 11, 12, 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};
28 void writeDigit(char d, char val) {
62 for (int i = 0; i < 7; ++i) {
64 digitalWrite(segments[i], HIGH);
66 digitalWrite(segments[i], LOW);
69 digitalWrite(digits[d], LOW);
71 digitalWrite(digits[d], HIGH);
74 void showNumber(float number) {
76 writeDigit(0, (n/1000U) % 10);
77 writeDigit(1, (n/100U) % 10);
78 writeDigit(2, (n/10U) % 10);
79 writeDigit(3, n % 10);
84 // put your setup code here, to run once:
86 analogReference(EXTERNAL);
88 for (int i = 0; i < 4; ++i) {
89 pinMode(digits[i], OUTPUT);
90 digitalWrite(digits[i], HIGH);
92 for (int i = 0; i < 8; ++i) {
93 pinMode(segments[i], OUTPUT);
94 digitalWrite(segments[i], LOW);
101 float battery_voltage;
102 float amps_in_period;
103 float watts_in_period;
107 if (timer.hasPassed(1000)) {
108 unsigned long passed = timer.elapsed();
110 battery_voltage = readVoltage(A0);
112 if (battery_voltage < 0.8) {
116 shunt_voltage = readVoltage(A1);
117 shunt_current = shunt_voltage/APPARENT_SHUNT_RESISTANCE;
120 amps_in_period = shunt_current * passed/1000;
121 watts_in_period = amps_in_period * battery_voltage;
123 ampseconds += amps_in_period;
124 wattseconds += watts_in_period;
125 mamphours = ampseconds/3.6;
126 mwatthours = wattseconds/3.6;
129 showNumber(mamphours);
132 float readVoltage(int pin) {
135 for (int i = 0; i < 4; ++i) {
136 val = val + analogRead(pin);
140 return (val / 4) * VOLTAGE_REFERENCE/1023.0;