]> git.friedersdorff.com Git - max/battery_tester.git/commitdiff
Add battery tester
authorMaximilian Friedersdorff <max@friedersdorff.com>
Tue, 21 Jun 2022 07:39:04 +0000 (08:39 +0100)
committerMaximilian Friedersdorff <max@friedersdorff.com>
Tue, 21 Jun 2022 07:39:04 +0000 (08:39 +0100)
battery_tester.ino [new file with mode: 0644]

diff --git a/battery_tester.ino b/battery_tester.ino
new file mode 100644 (file)
index 0000000..f948ec2
--- /dev/null
@@ -0,0 +1,135 @@
+#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;
+}