mirror of
https://github.com/open-x4-epaper/community-sdk.git
synced 2026-04-29 10:24:18 -07:00
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 <dave@daveallie.com>
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#include "BatteryMonitor.h"
|
||||
#include <esp32-hal-adc.h>
|
||||
#include <esp_idf_version.h>
|
||||
#include <Arduino.h>
|
||||
#if ESP_IDF_VERSION_MAJOR < 5
|
||||
#include <esp_adc_cal.h>
|
||||
|
||||
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<uint32_t>(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<uint16_t>(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<int>(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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user