--- /dev/null
+#include <LightChrono.h>
+#include <Chrono.h>
+
+const float APPARENT_SHUNT_RESISTANCE = 0.453;
+const float VOLTAGE_REFERENCE = 2.489;
+
+float ampseconds = 0;
+float wattseconds = 0;
+
+const int digits[] = {2, 3, 4, 5};
+const int segments[] = {6, 7, 8, 9, 10, 11, 12, 13};
+
+const bool one[7] = {false, true, true, false, false, false, false};
+const bool two[7] = {true, true, false, true, true, false, true};
+const bool three[7] = {true, true, true, true, false, false, true};
+const bool four[7] = {false, true, true, false, false, true, true};
+const bool five[7] = {true, false, true, true, false, true, true};
+const bool six[7] = {true, false, true, true, true, true, true};
+const bool seven[7] = {true, true, true, false, false, false, false};
+const bool eight[7] = {true, true, true, true, true, true, true};
+const bool nine[7] = {true, true, true, true, false, true, true};
+const bool zero[7] = {true, true, true, true, true, true, false};
+
+Chrono timer;
+
+
+void writeDigit(char d, char val) {
+ const bool *segs;
+ switch (val) {
+ case 0:
+ segs = zero;
+ break;
+ case 1:
+ segs = one;
+ break;
+ case 2:
+ segs = two;
+ break;
+ case 3:
+ segs = three;
+ break;
+ case 4:
+ segs = four;
+ break;
+ case 5:
+ segs = five;
+ break;
+ case 6:
+ segs = six;
+ break;
+ case 7:
+ segs = seven;
+ break;
+ case 8:
+ segs = eight;
+ break;
+ case 9:
+ segs = nine;
+ break;
+ }
+ for (int i = 0; i < 7; ++i) {
+ if (segs[i]) {
+ digitalWrite(segments[i], HIGH);
+ } else {
+ digitalWrite(segments[i], LOW);
+ }
+ }
+ digitalWrite(digits[d], LOW);
+ delay(1);
+ digitalWrite(digits[d], HIGH);
+}
+
+void showNumber(float number) {
+ int n = number;
+ writeDigit(0, (n/1000U) % 10);
+ writeDigit(1, (n/100U) % 10);
+ writeDigit(2, (n/10U) % 10);
+ writeDigit(3, n % 10);
+}
+
+
+void setup() {
+ // put your setup code here, to run once:
+ Serial.begin(9600);
+ analogReference(EXTERNAL);
+
+ for (int i = 0; i < 4; ++i) {
+ pinMode(digits[i], OUTPUT);
+ digitalWrite(digits[i], HIGH);
+ }
+ for (int i = 0; i < 8; ++i) {
+ pinMode(segments[i], OUTPUT);
+ digitalWrite(segments[i], LOW);
+ }
+}
+
+void loop() {
+ float shunt_voltage;
+ float shunt_current;
+ float battery_voltage;
+ float amps_in_period;
+ float watts_in_period;
+ float mamphours;
+ float mwatthours;
+
+ if (timer.hasPassed(1000)) {
+ unsigned long passed = timer.elapsed();
+ timer.restart();
+
+ shunt_voltage = readVoltage(A1);
+ shunt_current = shunt_voltage/APPARENT_SHUNT_RESISTANCE;
+
+ battery_voltage = readVoltage(A0);
+
+ amps_in_period = shunt_current * passed/1000;
+ watts_in_period = amps_in_period * battery_voltage;
+
+ ampseconds += amps_in_period;
+ wattseconds += watts_in_period;
+ mamphours = ampseconds/3.6;
+ mwatthours = wattseconds/3.6;
+ }
+ showNumber(mamphours);
+}
+
+float readVoltage(int pin) {
+
+ int val = 0;
+ for (int i = 0; i < 4; ++i) {
+ val = val + analogRead(pin);
+ delay(0.5);
+ }
+
+ return (val / 4) * VOLTAGE_REFERENCE/1023.0;
+}