Coin Cell and Low-Power Battery Design for Wearables and Sensor Nodes
Plenty of ESP32 tutorials assume a wall outlet or a fat LiPo pouch is available, but a real class of maker projects — door/window sensors, remote temperature loggers, e-ink tags, key finders — needs to run for months or years off a single coin cell that's smaller than a fingernail. That's a completely different design problem from powering a always-on WiFi project, and getting it wrong means a "one year battery life" sensor that's dead in three weeks. This guide covers coin cell selection, the low-power design decisions that actually matter, and how to budget a battery life estimate you can trust before you build.
Coin Cell Chemistry and Capacity
Not all coin cells are interchangeable, and picking the wrong one is one of the most common beginner mistakes in low-power design.
CellChemistryNominal voltageTypical capacityBest for CR2032Lithium (non-rechargeable)3.0V~220-240mAhGeneral low-current sensor nodes; the default choice for most projects CR2025 / CR2016Lithium (non-rechargeable)3.0V~160mAh / ~90mAhThinner enclosures where CR2032's thickness won't fit CR123ALithium (non-rechargeable)3.0V~1500mAhHigher-drain or longer-life projects that still need a compact cylindrical cell LIR2032Rechargeable Li-ion3.6-3.7V (fresh), sags fast~40mAhRarely worth it — far lower capacity than a primary CR2032, only useful if physical recharging access is guaranteed ML2032 / MS2032Rechargeable lithium-manganese (coin-cell "supercap"-adjacent)3.0V~65mAhRTC backup, not primary power — trickle-charged from a main supply, not standaloneFor a standalone sensor node, CR2032 is almost always the right starting point: cheap, widely available, genuinely high capacity for its size, and a stable enough discharge curve to reason about. Avoid rechargeable coin cells as a primary power source — their capacity is a fraction of a primary lithium cell's, which defeats the purpose of a coin-cell design in the first place.
The Real Constraint: Pulse Current, Not Just Average Current
A CR2032's datasheet capacity number is measured under a light, continuous drain — but the internal resistance of a coin cell (typically 10-30Ω, rising as the cell ages) means it cannot supply a large current pulse without its voltage sagging badly. An ESP32 transmitting over WiFi can draw 200-500mA in short bursts; a coin cell asked to supply that directly will sag well below the 3.0V it needs to keep the regulator (and the chip) alive, causing brownouts and resets — even though the cell has plenty of total remaining capacity. This is the single most common failure mode in coin-cell ESP32 projects, and it's a power delivery problem, not a capacity problem.
The practical fix is a buffer capacitor: a 100-470µF low-ESR capacitor (tantalum or a good low-ESR ceramic/electrolytic) placed directly across the battery terminals absorbs the current spike during a radio transmit burst, letting the coin cell recharge the capacitor slowly between bursts rather than trying to supply the peak current directly. This one component is often the difference between a coin-cell project that resets constantly and one that runs reliably for its entire calculated life.
Choosing a Radio for Coin-Cell Budgets
WiFi is rarely the right radio for a genuinely long-life coin-cell project — its connection/association overhead alone can burn more energy per wake cycle than an entire BLE advertisement.
- BLE advertising-only beacons (no connection, just periodic advertising packets) are the cheapest radio option in energy terms and well suited to sensor tags that only need to broadcast a reading.
- BLE with occasional connections costs more per wake but is still far cheaper than WiFi for intermittent data.
- ESP-NOW (on ESP32) skips WiFi association entirely and can send a short packet in a few milliseconds of radio-on time — a good middle ground when you want ESP32's ecosystem without full WiFi overhead.
- Full WiFi should generally be reserved for mains-powered or larger-battery projects; it's difficult to make WiFi-based reporting last more than a few weeks on a single CR2032 without extreme (multi-hour) reporting intervals.
- If you specifically need multi-month range at low power over WiFi's typical distance, look at low-power sub-GHz options (a small LoRa radio) instead — a topic covered in depth in this site's wireless protocol comparison guide.
Sleep Current Is the Number That Determines Battery Life
For any project spending 99%+ of its life asleep, deep sleep quiescent current — not active/transmit current — is what actually determines whether a coin cell lasts weeks or years.
- A raw ESP32 in deep sleep typically draws somewhere in the 10-150µA range depending on variant and configuration — but the regulator, any always-on peripheral, and pull-up resistors on the board often draw far more than the chip itself.
- Regulator quiescent current dominates at this scale. A generic LDO regulator can easily draw tens of microamps of its own quiescent current, which is comparable to or larger than the MCU's own sleep draw. Choose a regulator specifically rated for low quiescent current (sub-1µA parts exist) — this single part choice can be the difference between a 6-month and 3-year coin cell life.
- Remove or gate every "always on" peripheral. Status LEDs, pull-up resistors on unused I/O, and sensor breakout boards with their own onboard regulator or pull-ups all add continuous microamp-to-milliamp drains that add up fast at coin-cell scale. Power sensors through a GPIO-controlled MOSFET or load switch so they're fully off between readings, not just idle.
- Measure, don't assume. A USB power meter reads milliamps at best resolution and is useless for verifying microamp sleep current — use a bench multimeter's µA range, or better, a dedicated low-power current profiler, to actually confirm sleep draw before committing to a battery-life estimate.
Building a Realistic Battery Life Estimate
A rough but genuinely useful calculation: average current draw (mA) = (sleep current × sleep time + active current × active time) / total cycle time. Multiply the coin cell's usable capacity (not its full rated capacity — derate to roughly 70-80% for a realistic cutoff voltage and self-discharge over the product's lifetime) by 1000 to get µAh, then divide by your average current draw in µA to get hours of life.
Worked example: an ESP32 sensor node with 8µA sleep current, waking once per hour for a 3-second BLE advertisement burst at 15mA average during that burst. Active energy per cycle is trivial compared to a full hour of sleep at 8µA, so average current is dominated by sleep draw — in this case, well under 10µA average, which against a derated ~180mAh usable CR2032 capacity projects multiple years of service. The same project reporting over WiFi every hour, drawing 150mA for 2 seconds per cycle, has a meaningfully higher average current and a dramatically shorter real-world life — often measured in weeks rather than years — which is exactly why radio choice matters as much as sleep current.
Practical Checklist
- Add a 100-470µF low-ESR buffer capacitor across the battery terminals before doing anything else — this fixes most brownout-under-load symptoms.
- Choose a low-quiescent-current LDO or buck regulator (check the datasheet for Iq specifically, not just output current rating).
- Power peripherals through a switched load rather than leaving them continuously connected to the rail.
- Use BLE advertising, ESP-NOW, or a low-power sub-GHz radio instead of full WiFi wherever the application allows it.
- Measure actual sleep current on a bench meter before finalizing a battery-life claim — datasheet numbers are best-case, board-level parasitics are not optional to account for.
- Derate rated coin cell capacity by 20-30% for a realistic end-of-life estimate rather than using the datasheet's top-line mAh figure directly.
None of this is exotic — it's a handful of component and firmware choices applied consistently. But skipping any one of them (a leaky regulator, an always-on pull-up, a WiFi radio where BLE would do) can turn a "years on a coin cell" design into one that needs a battery change before the project's even interesting anymore.