How to Read Battery State of Charge: Voltage vs Actual Capacity
Understanding battery state of charge voltage SOC is fundamental to building reliable battery-powered electronics. Whether you are designing a drone battery monitor, a solar storage system, an IoT device that reports its own battery level, or simply trying to judge how much life is left in your 18650 power bank — you need to understand the relationship between the voltage your multimeter reads and the actual energy remaining in the cell. This guide explains the SOC-voltage curve for all major lithium chemistries, why voltage alone is an imperfect indicator, and how Indian makers can implement accurate SOC estimation in their projects.
What Is State of Charge and Why Does It Matter?
State of Charge (SOC) is the percentage of energy remaining in a battery relative to its full capacity. An SOC of 100% means the battery is fully charged. An SOC of 0% means the battery has been discharged to its cutoff voltage — but crucially, it does not mean the battery is physically empty or dead. It means it has delivered all the energy that can be extracted safely.
SOC matters because:
- User experience: Telling users “3.85 V” is meaningless; telling them “72%” is immediately useful.
- Cell protection: Knowing the SOC helps prevent both over-discharge (cell damage) and unnecessary charging cycles that accelerate calendar ageing.
- System planning: For solar-charged systems, irrigation controllers, and remote IoT nodes across India — knowing remaining capacity determines when to conserve power or trigger an alert.
- Multi-cell balancing: BMS systems use per-cell SOC to determine balancing priorities.
The challenge is that SOC is not directly measurable — it must be estimated. The two main approaches are voltage-based estimation (OCV lookup) and Coulomb counting (integrating current over time). Real battery management ICs combine both methods for higher accuracy.
The Voltage vs SOC Curve Explained
Every lithium chemistry has a characteristic discharge curve — a graph of cell voltage versus SOC at a given temperature and discharge rate. The shape of this curve is critical to understanding why voltage-based SOC estimation is tricky.
For a standard Li-Ion 18650 cell, the discharge curve has three distinct regions:
- Upper plateau (100%–80% SOC, ~4.20–3.90 V): Voltage drops relatively quickly from 4.20 V. This region is easy to estimate from voltage.
- Middle flat region (80%–20% SOC, ~3.90–3.50 V): This is the longest portion of the discharge. Voltage changes very slowly — only about 400 mV over 60% of capacity. This is the hardest region for voltage-based SOC estimation because a 50 mV ADC error translates to a 20–30% SOC error.
- Lower drop-off (20%–0% SOC, ~3.50–3.00 V): Voltage drops steeply again. SOC estimation improves here because small voltage changes correspond to large SOC changes.
The flat middle region is what makes lithium-ion cells so useful for portable devices (stable output voltage throughout most of the discharge) but simultaneously makes voltage-based SOC estimation inaccurate in daily use.
SOC Reference Tables for Common Chemistries
The following tables show the Open Circuit Voltage (OCV) — voltage measured after a 30-minute rest with no load — at each SOC level. These are at room temperature (25°C). Cold temperatures shift the curve down by 0.2–0.3 V.
Standard Li-Ion / 18650 (3.6–3.7 V nominal)
| SOC % | OCV (Rested) | Under Light Load (~0.2C) |
|---|---|---|
| 100% | 4.20 V | 4.15–4.18 V |
| 90% | 4.08 V | 4.03–4.06 V |
| 80% | 3.96 V | 3.90–3.94 V |
| 70% | 3.83 V | 3.78–3.82 V |
| 60% | 3.78 V | 3.73–3.77 V |
| 50% | 3.74 V | 3.69–3.73 V |
| 40% | 3.71 V | 3.66–3.70 V |
| 30% | 3.67 V | 3.62–3.66 V |
| 20% | 3.61 V | 3.55–3.60 V |
| 10% | 3.49 V | 3.40–3.48 V |
| 0% | 3.00 V | <3.00 V |
LiFePO4 (3.2 V nominal)
| SOC % | OCV (Rested) | Notes |
|---|---|---|
| 100% | 3.65 V | Full charge |
| 80–20% | 3.20–3.30 V | Almost flat — voltage useless for SOC here |
| 10% | 3.10 V | Begin conserving power |
| 0% | 2.50 V | Hard cutoff |
Notice how LiFePO4 has an even flatter discharge curve than Li-Ion. For LiFePO4 packs (popular in solar storage and e-bikes in India), Coulomb counting is practically mandatory for any useful SOC indication.
1-8S Lipo Battery Voltage Tester Without Alarm
Quick per-cell voltage check for LiPo packs. While not a SOC calculator, knowing each cell’s voltage relative to the SOC table above lets you quickly assess pack balance and remaining charge at a glance — essential for drone and RC field work.
Why Voltage Alone Misleads You
There are four key reasons voltage-based SOC is less accurate than it first appears:
1. Load-Induced Voltage Sag
When a cell supplies current, internal resistance causes the terminal voltage to sag below the true OCV. A 3.7 V reading on a cell supplying 2A through a 50 mΩ internal resistance will be 100 mV lower than the rested OCV — making the cell appear 10–15% more discharged than it actually is. Always remove the load and wait 30 minutes for OCV to recover before making a voltage-based SOC estimate.
2. Temperature Effects
At 10°C (common in Indian hill stations or cold storage facilities), the Li-Ion discharge curve shifts down by 150–200 mV. A cell reading 3.65 V at 10°C is not at 20% SOC — it may be at 40% SOC. At 40°C (common in Indian summers), the curve shifts slightly upward. Accurate SOC estimation requires temperature compensation.
3. Cell Ageing
As a cell ages and loses capacity, the SOC-voltage relationship changes. A 2-year-old cell with 80% capacity remaining will have a subtly different OCV curve than a new cell. The flat region in the middle shortens as the cell ages.
4. Hysteresis
Lithium-ion cells exhibit voltage hysteresis — the OCV after charging to 50% SOC is slightly higher than the OCV after discharging to the same 50% SOC. This path-dependency adds another source of error to voltage-only SOC estimation.
Coulomb Counting: The More Accurate Method
Coulomb counting (also called Ampere-hour integration) tracks SOC by integrating the current flowing in and out of the cell over time. The principle:
SOC(t) = SOC(t₀) - [1/Q_rated] × ∫I(t) dt Where: SOC(t) = current state of charge Q_rated = rated capacity in Ah I(t) = instantaneous current (positive = discharge, negative = charge) dt = time step (e.g., 1 second = 1/3600 hours)
In practice, you measure current every second using a shunt resistor and current sense amplifier (like the INA219 or INA226 over I2C), then accumulate the charge. This gives SOC accuracy of ±2–5% compared to ±10–20% for voltage-only methods.
The drawback is drift — any current measurement error accumulates over time. Professional BMS systems periodically reset the Coulomb counter when the cell reaches 100% SOC (detected by the charger completing its CV phase) to eliminate accumulated drift.
Practical SOC Implementation for Arduino Projects
Here is a simple but practical SOC indicator using voltage lookup for an Arduino project. This is suitable for projects where the cell is rested (no heavy load) or where ±10% accuracy is acceptable:
// Li-Ion 18650 SOC lookup table (10 points, rested OCV) const float socVoltages[] = {4.20, 4.08, 3.96, 3.83, 3.78, 3.74, 3.71, 3.67, 3.61, 3.49, 3.00}; const int socPercents[] = {100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 0}; const int socTableSize = 11; int voltageToSOC(float voltage) { // Above max voltage if (voltage >= socVoltages[0]) return 100; // Below min voltage if (voltage <= socVoltages[socTableSize-1]) return 0; // Linear interpolation between table points for (int i = 0; i < socTableSize - 1; i++) { if (voltage <= socVoltages[i] && voltage > socVoltages[i+1]) { float ratio = (voltage - socVoltages[i+1]) / (socVoltages[i] - socVoltages[i+1]); return (int)(socPercents[i+1] + ratio * (socPercents[i] - socPercents[i+1])); } } return -1; // Should never reach here } // Usage example: float batteryVoltage = readBatteryVoltage(); // Your ADC reading function int soc = voltageToSOC(batteryVoltage); // Use soc (0-100) for display, alerts, power management
This lookup-and-interpolate approach is simple, uses no floating-point heavy computation, and runs on any Arduino. Add temperature correction by shifting all voltage thresholds by +5 mV per degree above 25°C or -5 mV per degree below 25°C using an NTC thermistor reading.
18650 5V 1A/2A Lithium Battery Charging Module with Digital Display
This all-in-one module includes a built-in SOC indicator that shows battery percentage on its display. Uses voltage-based estimation — useful for most portable projects where ±10% accuracy is sufficient.
Dedicated SOC Monitor Modules
For projects where you need accurate SOC without implementing Coulomb counting yourself, several dedicated modules and ICs are available:
INA219 / INA226 Current Sensor (I2C)
These Texas Instruments ICs measure voltage and current simultaneously over I2C. Combined with your Arduino’s timer for Coulomb counting, they give ±1% current accuracy — far better than a simple shunt + ADC approach. The INA219 is extremely popular and available on breakout boards for under ₹100.
MAX17043 / MAX17044 (Fuel Gauge IC)
These Maxim fuel gauge ICs implement ModelGauge — a patented algorithm that combines OCV lookup and internal state estimation for accurate SOC without needing external shunt resistors or current sensing. They communicate over I2C and report SOC directly in percentage. Ideal for compact IoT devices and wearables.
BMS Modules with SOC Output
Many multi-cell BMS modules now include a separate SOC output — either an LED bar graph indicator or a serial data output. These are the easiest option for off-the-shelf SOC monitoring in maker projects.
2S-6S LiPo XT60 to USB Adapter with Real-Time Voltage Display
Get live pack voltage at a glance from any 2S–6S LiPo pack. Cross-reference the displayed voltage against the SOC tables in this article to quickly estimate remaining charge — no Arduino required for basic field use.
ISDT 608 AC LiPo Battery Charger & Discharger (50W/200W)
Professional dual-mode charger and discharger. Use it to run full charge-discharge cycles on your packs, measure delivered capacity, and verify your SOC estimation algorithm by cross-checking against the charger’s own capacity readout.
Frequently Asked Questions
Why does my phone show 40% battery but the voltage is only 3.65 V?
Your phone uses a fuel gauge IC (like the BQ27xxx series) that performs Coulomb counting and temperature-corrected SOC estimation — not just a simple voltage lookup. Meanwhile, 3.65 V at around 30–35% SOC is consistent with the Li-Ion discharge curve. Smartphone battery percentages are more accurate than voltage-only methods because they account for recent current draw history and cell ageing. Your phone is likely correct; the raw voltage misleads you if you compare it to a basic SOC table measured under different conditions.
Can I use the same SOC table for a LiPo and a Li-Ion 18650 cell?
Yes — standard LiPo and Li-Ion 18650 cells share very similar nominal voltages (3.7 V) and OCV-SOC curves. The table in this article applies to both. The key difference is the physical construction (liquid electrolyte in 18650 vs gel polymer in LiPo) and the discharge rate capability, not the voltage profile. High-voltage LiPo (HV LiPo) cells that charge to 4.35 V use a slightly shifted table — their 100% SOC is 4.35 V and the intermediate values shift proportionally upward.
How long should I wait before reading OCV after removing a load?
For accurate OCV measurements suitable for SOC lookup table comparisons, wait at least 30 minutes at room temperature. In practice, 80–90% of voltage recovery happens within the first 5 minutes, and 95% within 15 minutes. For a quick field estimate, a 5-minute rest gives you a reading within ±50 mV of true OCV — good enough for a rough SOC indication using the table in this article.
How does cold weather affect SOC readings in India’s Himalayan regions?
At 5°C, the OCV curve for Li-Ion shifts down by approximately 150–200 mV. A cell that reads 3.70 V at 5°C may actually have 50–60% SOC, not 30–40% as the room-temperature table suggests. Additionally, cold cells deliver significantly less capacity — a cell rated 2500 mAh at 25°C may only deliver 1800 mAh at 0°C. For Himalayan field use (drone surveys, weather stations, trekking electronics), always add a temperature correction factor and pre-warm lithium cells before use for maximum performance.
What is the most accurate DIY SOC measurement method for an Arduino project?
The most accurate DIY approach combines Coulomb counting with periodic OCV resets. Use an INA219 module to measure current accurately over I2C, integrate current over time for running SOC estimation, and whenever the charger reports a complete full charge (CV phase end detected by current dropping below 0.05C), reset the SOC counter to 100%. This “hybrid” method achieves ±3–5% SOC accuracy — suitable for display, logging, and power management in maker projects.
Build Smarter Battery Projects with Zbotic
From voltage testers and BMS boards to professional ISDT chargers and 18650 holders — Zbotic stocks everything Indian makers need to build, test, and monitor their battery projects reliably.
Add comment