From 9f76376a5cc7894cff9ca87bbdd34dab715d8a59 Mon Sep 17 00:00:00 2001 From: Dexif Date: Sun, 22 Feb 2026 11:13:36 +0200 Subject: [PATCH] feat: Update BatteryMonitor for Arduino ESP32 Core 3.x compatibility (#21) Migrating to Arduino ESP32 Core 3.x (ESP-IDF 5.x). The esp_adc_cal_* API was removed in ESP-IDF 5.x - replaced with analogReadMilliVolts() which handles ADC calibration internally. --------- Co-authored-by: Dave Allie --- .../BatteryMonitor/include/BatteryMonitor.h | 6 --- .../BatteryMonitor/src/BatteryMonitor.cpp | 40 +++++++++---------- 2 files changed, 18 insertions(+), 28 deletions(-) diff --git a/libs/hardware/BatteryMonitor/include/BatteryMonitor.h b/libs/hardware/BatteryMonitor/include/BatteryMonitor.h index f5ae338..98741ce 100644 --- a/libs/hardware/BatteryMonitor/include/BatteryMonitor.h +++ b/libs/hardware/BatteryMonitor/include/BatteryMonitor.h @@ -12,18 +12,12 @@ public: // Read the battery voltage in millivolts (accounts for divider) uint16_t readMillivolts() const; - // Read raw millivolts from ADC (doesn't account for divider) - uint16_t readRawMillivolts() const; - // Read the battery voltage in volts (accounts for divider) double readVolts() const; // Percentage (0-100) from a millivolt value static uint16_t percentageFromMillivolts(uint16_t millivolts); - // Calibrate a raw ADC reading and return millivolts - static uint16_t millivoltsFromRawAdc(uint16_t adc_raw); - private: uint8_t _adcPin; float _dividerMultiplier; diff --git a/libs/hardware/BatteryMonitor/src/BatteryMonitor.cpp b/libs/hardware/BatteryMonitor/src/BatteryMonitor.cpp index 3604067..4786c59 100644 --- a/libs/hardware/BatteryMonitor/src/BatteryMonitor.cpp +++ b/libs/hardware/BatteryMonitor/src/BatteryMonitor.cpp @@ -1,9 +1,9 @@ #include "BatteryMonitor.h" -#include +#include +#include +#if ESP_IDF_VERSION_MAJOR < 5 #include - -inline float min(const float a, const float b) { return a < b ? a : b; } -inline float max(const float a, const float b) { return a > b ? a : b; } +#endif BatteryMonitor::BatteryMonitor(uint8_t adcPin, float dividerMultiplier) : _adcPin(adcPin), _dividerMultiplier(dividerMultiplier) @@ -17,15 +17,18 @@ uint16_t BatteryMonitor::readPercentage() const uint16_t BatteryMonitor::readMillivolts() const { - const uint16_t raw = readRawMillivolts(); - const uint32_t mv = millivoltsFromRawAdc(raw); - return static_cast(mv * _dividerMultiplier); -} - -uint16_t BatteryMonitor::readRawMillivolts() const -{ +#if ESP_IDF_VERSION_MAJOR < 5 + // ESP-IDF 4.x doesn't have analogReadMilliVolts, so we need to do the calibration manually const uint16_t raw = analogRead(_adcPin); - return raw; + esp_adc_cal_characteristics_t adc_chars; + esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_12, ADC_WIDTH_BIT_12, 1100, &adc_chars); + const uint16_t mv = esp_adc_cal_raw_to_voltage(raw, &adc_chars); +#else + // ESP-IDF 5.x has analogReadMilliVolts + const uint16_t mv = analogReadMilliVolts(_adcPin); +#endif + + return static_cast(mv * _dividerMultiplier); } double BatteryMonitor::readVolts() const @@ -43,15 +46,8 @@ uint16_t BatteryMonitor::percentageFromMillivolts(uint16_t millivolts) 7501.3202; // Clamp to [0,100] and round - y = max(y, 0.0); - y = min(y, 100.0); + y = std::max(y, 0.0); + y = std::min(y, 100.0); y = round(y); - return static_cast(y); -} - -uint16_t BatteryMonitor::millivoltsFromRawAdc(uint16_t adc_raw) -{ - esp_adc_cal_characteristics_t adc_chars; - esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_12, ADC_WIDTH_BIT_12, 1100, &adc_chars); - return esp_adc_cal_raw_to_voltage(adc_raw, &adc_chars); + return y; }