added voltage multiplier to gui and set defaults

This commit is contained in:
Erwin Repolust 2023-03-14 01:44:41 +01:00
parent 8b61b9ebfe
commit ec08432f92
2 changed files with 36 additions and 8 deletions

View File

@ -26,6 +26,15 @@
#endif #endif
#endif #endif
//the default ratio for the voltage divider
#ifndef USERMOD_BATTERY_VOLTAGE_MULTIPLIER
#ifdef ARDUINO_ARCH_ESP32
#define USERMOD_BATTERY_VOLTAGE_MULTIPLIER 2.0f
#else //ESP8266 boards
#define USERMOD_BATTERY_VOLTAGE_MULTIPLIER 4.2f
#endif
#endif
#ifndef USERMOD_BATTERY_MAX_VOLTAGE #ifndef USERMOD_BATTERY_MAX_VOLTAGE
#define USERMOD_BATTERY_MAX_VOLTAGE 4.2f #define USERMOD_BATTERY_MAX_VOLTAGE 4.2f
#endif #endif

View File

@ -31,8 +31,8 @@ class UsermodBattery : public Usermod
float voltage = maxBatteryVoltage; float voltage = maxBatteryVoltage;
// between 0 and 1, to control strength of voltage smoothing filter // between 0 and 1, to control strength of voltage smoothing filter
float alpha = 0.05f; float alpha = 0.05f;
// multiplyer for the voltage divider that is in place between ADC pin and battery, default will be 2 but might be adapted to readout voltages over ~5v ESP32 or ~6.6v ESP8266 // multiplier for the voltage divider that is in place between ADC pin and battery, default will be 2 but might be adapted to readout voltages over ~5v ESP32 or ~6.6v ESP8266
float voltageMultiplyer = 2.0f; float voltageMultiplier = USERMOD_BATTERY_VOLTAGE_MULTIPLIER;
// mapped battery level based on voltage // mapped battery level based on voltage
int8_t batteryLevel = 100; int8_t batteryLevel = 100;
// offset or calibration value to fine tune the calculated voltage // offset or calibration value to fine tune the calculated voltage
@ -130,8 +130,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;
//use calibrated millivolts analogread on esp32 (150 mV ~ 2450 mV default) and divide by 1000 to get from milivolts to volts and multiply by voltage divider and apply calibration value //use calibrated millivolts analogread on esp32 (150 mV ~ 2450 mV default) and divide by 1000 to get from milivolts to volts and multiply by voltage divider ratio and apply calibration value
voltage = (analogReadMilliVolts(batteryPin) / 1000.0f) * voltageMultiplyer + calibration; voltage = (analogReadMilliVolts(batteryPin) / 1000.0f) * voltageMultiplier + calibration;
} }
if (!success) { if (!success) {
@ -142,8 +142,8 @@ class UsermodBattery : public Usermod
} }
#else //ESP8266 boards have only one analog input pin A0 #else //ESP8266 boards have only one analog input pin A0
pinMode(batteryPin, INPUT); pinMode(batteryPin, INPUT);
//use analog read on esp8266 ( 150 mV ~ 3000mV no attenuation options) and divide by ADC precision 1023 and multiply by 3v ADC max voltage and apply calibration value //use analog read on esp8266 ( 150 mV ~ 3000mV no attenuation options) and divide by ADC precision 1023 and multiply by voltage divider ratio and apply calibration value
voltage = (analogRead(batteryPin) / 1023.0f) * 3.3f * voltageMultiplyer + calibration; voltage = (analogRead(batteryPin) / 1023.0f) * voltageMultiplier + calibration;
#endif #endif
nextReadTime = millis() + readingInterval; nextReadTime = millis() + readingInterval;
@ -185,12 +185,12 @@ class UsermodBattery : public Usermod
#ifdef ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP32
// use calibrated millivolts analogread on esp32 (150 mV ~ 2450 mV default) and divide by 1000 to get from milivolts to volts and multiply by voltage divider and apply calibration value // use calibrated millivolts analogread on esp32 (150 mV ~ 2450 mV default) and divide by 1000 to get from milivolts to volts and multiply by voltage divider and apply calibration value
rawValue = (analogReadMilliVolts(batteryPin) / 1000.0f) * voltageMultiplyer + calibration; rawValue = (analogReadMilliVolts(batteryPin) / 1000.0f) * voltageMultiplier + calibration;
// filter with exponential smoothing because ADC in esp32 is fluctuating too much for a good single readout // filter with exponential smoothing because ADC in esp32 is fluctuating too much for a good single readout
voltage = voltage + alpha * (rawValue - voltage); voltage = voltage + alpha * (rawValue - voltage);
#else #else
// use analog read on esp8266 ( 150 mV ~ 3000mV no attenuation options) and divide by ADC precision 1023 and multiply by 3v ADC max voltage and apply calibration value // use analog read on esp8266 ( 150 mV ~ 3000mV no attenuation options) and divide by ADC precision 1023 and multiply by 3v ADC max voltage and apply calibration value
rawValue = (analogRead(batteryPin) / 1023.0f) * 3.0f * voltageMultiplyer + calibration; rawValue = (analogRead(batteryPin) / 1023.0f) * voltageMultiplier + calibration;
// filter with exponential smoothing // filter with exponential smoothing
voltage = voltage + alpha * (rawValue - voltage); voltage = voltage + alpha * (rawValue - voltage);
#endif #endif
@ -367,6 +367,7 @@ class UsermodBattery : public Usermod
battery[F("max-voltage")] = maxBatteryVoltage; battery[F("max-voltage")] = maxBatteryVoltage;
battery[F("capacity")] = totalBatteryCapacity; battery[F("capacity")] = totalBatteryCapacity;
battery[F("calibration")] = calibration; battery[F("calibration")] = calibration;
battery[F("voltage-multiplier")] = voltageMultiplier;
battery[FPSTR(_readInterval)] = readingInterval; battery[FPSTR(_readInterval)] = readingInterval;
JsonObject ao = battery.createNestedObject(F("auto-off")); // auto off section JsonObject ao = battery.createNestedObject(F("auto-off")); // auto off section
@ -443,6 +444,7 @@ class UsermodBattery : public Usermod
setMaxBatteryVoltage(battery[F("max-voltage")] | maxBatteryVoltage); setMaxBatteryVoltage(battery[F("max-voltage")] | maxBatteryVoltage);
setTotalBatteryCapacity(battery[F("capacity")] | totalBatteryCapacity); setTotalBatteryCapacity(battery[F("capacity")] | totalBatteryCapacity);
setCalibration(battery[F("calibration")] | calibration); setCalibration(battery[F("calibration")] | calibration);
setVoltageMultiplier(battery[F("voltage-multiplier")] | voltageMultiplier);
setReadingInterval(battery[FPSTR(_readInterval)] | readingInterval); setReadingInterval(battery[FPSTR(_readInterval)] | readingInterval);
JsonObject ao = battery[F("auto-off")]; JsonObject ao = battery[F("auto-off")];
@ -637,6 +639,23 @@ class UsermodBattery : public Usermod
calibration = offset; calibration = offset;
} }
/*
* Set the voltage multiplier value
* A multiplier that may need adjusting for different voltage divider setups
*/
void setVoltageMultiplier(float multiplier)
{
voltageMultiplier = multiplier;
}
/*
* Get the voltage multiplier value
* A multiplier that may need adjusting for different voltage divider setups
*/
float getVoltageMultiplier()
{
return voltageMultiplier;
}
/* /*
* Get auto-off feature enabled status * Get auto-off feature enabled status