From b2382dc972695e05ba93cc20a5ea5954d39336fa Mon Sep 17 00:00:00 2001 From: Maximilian Friedersdorff Date: Tue, 21 Jun 2022 08:39:04 +0100 Subject: [PATCH] Add battery tester --- battery_tester.ino | 135 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 battery_tester.ino diff --git a/battery_tester.ino b/battery_tester.ino new file mode 100644 index 0000000..f948ec2 --- /dev/null +++ b/battery_tester.ino @@ -0,0 +1,135 @@ +#include +#include + +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; +} -- 2.44.0