Files
PlantPal/batteryValidationTest/batteryValidationTest.ino

62 lines
2.3 KiB
C++

// XAIO-ESP32-C6 Battery Monitor with Averaged ADC Readings
// Measures the battery voltage via a resistor divider (two 220 kΩ resistors),
// averages 10 ADC readings, and reports the battery percentage.
// Battery assumed: single-cell LiPo with 3.0V (0%) to 4.2V (100%).
// ----- CONFIGURATION -----
const int analogPin = A0; // ADC pin connected to the resistor divider
const float adcRefVoltage = 3.3; // ADC reference voltage (Volts)
const int adcMaxValue = 4095; // Maximum ADC value (for 12-bit resolution)
const float voltageDividerFactor = 2.0; // Divider factor: battery voltage is divided by 2
// Battery voltage range settings (adjust as necessary)
const float batteryMinVoltage = 3.0; // Voltage corresponding to 0% battery
const float batteryMaxVoltage = 4.2; // Voltage corresponding to 100% battery
const int numSamples = 10; // Number of ADC samples to average
// ----- SETUP -----
void setup() {
Serial.begin(115200);
// If needed, additional ADC calibration or configuration can be added here
}
// ----- MAIN LOOP -----
void loop() {
long totalADC = 0;
// Take numSamples readings
for (int i = 0; i < numSamples; i++) {
totalADC += analogRead(analogPin);
delay(10); // Short delay between samples (adjust as needed)
}
// Calculate the average ADC value
float avgADC = totalADC / (float)numSamples;
// Convert the averaged ADC value to the measured voltage at the divider
float measuredVoltage = (avgADC / adcMaxValue) * adcRefVoltage;
// Calculate the actual battery voltage using the divider factor
float batteryVoltage = measuredVoltage * voltageDividerFactor;
// Map the battery voltage to a battery percentage using a linear mapping
float batteryPercent = ((batteryVoltage - batteryMinVoltage) / (batteryMaxVoltage - batteryMinVoltage)) * 100.0;
if (batteryPercent > 100.0) batteryPercent = 100.0;
if (batteryPercent < 0.0) batteryPercent = 0.0;
// Print the results to the Serial Monitor
Serial.print("Avg ADC Value: ");
Serial.print(avgADC, 2);
Serial.print(" | Divider Voltage: ");
Serial.print(measuredVoltage, 2);
Serial.print(" V | Battery Voltage: ");
Serial.print(batteryVoltage, 2);
Serial.print(" V | Battery Percent: ");
Serial.print(batteryPercent, 1);
Serial.println("%");
// Wait 2 seconds before the next reading
delay(2000);
}