Changed to running average to improve accuracy

This commit is contained in:
Erwin Repolust 2023-03-08 03:24:16 +01:00
parent 2713573b9b
commit 81e70925c4

View File

@ -126,6 +126,8 @@ class UsermodBattery : public Usermod
if (pinManager.allocatePin(batteryPin, false, PinOwner::UM_Battery)) { if (pinManager.allocatePin(batteryPin, false, PinOwner::UM_Battery)) {
DEBUG_PRINTLN(F("Battery pin allocation succeeded.")); DEBUG_PRINTLN(F("Battery pin allocation succeeded."));
success = true; success = true;
//initialize voltage again with analog read as that will give us faster precision
voltage = (analogReadMilliVolts(batteryPin) / 1000.0f + calibration / 2.0f) * 2.0f;
} }
if (!success) { if (!success) {
@ -178,9 +180,9 @@ class UsermodBattery : public Usermod
#ifdef ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP32
// use calibrated millivolts analogread on esp32 (150 mV ~ 2450 mV) // use calibrated millivolts analogread on esp32 (150 mV ~ 2450 mV)
rawValue = analogReadMilliVolts(batteryPin); rawValue = analogReadMilliVolts(batteryPin) / 1000.0f + calibration / 2.0f;
// calculate the voltage // calculate the voltage with a 1/20th weighted running average
voltage = (rawValue / 1000.0f) + calibration; voltage = ((voltage / 2.0f) * 19.0f + rawValue) / 20.0f;
// usually a voltage divider (50%) is used on ESP32, so we need to multiply by 2 // usually a voltage divider (50%) is used on ESP32, so we need to multiply by 2
voltage *= 2.0f; voltage *= 2.0f;
#else #else
@ -191,8 +193,8 @@ class UsermodBattery : public Usermod
voltage = ((rawValue / getAdcPrecision()) * maxBatteryVoltage) + calibration; voltage = ((rawValue / getAdcPrecision()) * maxBatteryVoltage) + calibration;
#endif #endif
// check if voltage is within specified voltage range, allow 10% over/under voltage // check if voltage is within specified voltage range, allow 10% over/under voltage
voltage = ((voltage < minBatteryVoltage * 0.85f) || (voltage > maxBatteryVoltage * 1.1f)) ? -1.0f : voltage; //voltage = ((voltage < minBatteryVoltage * 0.85f) || (voltage > maxBatteryVoltage * 1.1f)) ? -1.0f : voltage;
// translate battery voltage into percentage // translate battery voltage into percentage
/* /*
the standard "map" function doesn't work the standard "map" function doesn't work