The Battery Life Gap
ESP32 is not a low-power chip. It is a high-performance WiFi chip that can enter a low-power state.
The distinction matters.
When the ESP32 is awake, it draws 80-240mA depending on radio activity. In deep sleep, the datasheet promises 10μA.
But 10μA is the number for the ESP32 chip alone, with no peripherals, no voltage regulator, no sensors, no USB-to-serial chip, no pull-up resistors, and powered directly from a perfectly clean 3.3V supply.
Your actual circuit looks nothing like this.
A typical maker ESP32 circuit draws:
| Component | Sleep Current |
|---|---|
| ESP32 (chip only) | 10μA (datasheet) |
| AMS1117 voltage regulator | 5-10mA |
| CP2102 USB-to-Serial | 2-5mA |
| Onboard LED (pulled high) | 1-3mA |
| Pull-up resistors (GPIO) | 0.5-2mA |
| External sensors (3.3V rail) | 1-20mA |
| Actual total | 10-40mA in "sleep" |
The ESP32 is in deep sleep. Your circuit is not.

Chart via UPEYES — ESP32 power consumption by mode
Three Power Hogs You Are Probably Ignoring
Power Hog 1: The Voltage Regulator
The AMS1117 LDO regulator is the most common 3.3V regulator on ESP32 development boards. It draws 5-10mA constantly, even when the ESP32 is asleep.
Every ESP32 dev board you have ever used has this problem.
The fix: use a board designed for battery power (like FireBeetle ESP32 which has a proper load switch), or replace the regulator with an ultra-low-quiescent-current part like the MCP1700 (4μA quiescent current, 250mA output).
Power Hog 2: The USB-to-Serial Chip
CP2102 and CH340G chips draw 2-5mA constantly as long as USB power is present. Most boards keep USB power connected even when running on battery.
The fix: use a board with a proper power path controller that disconnects USB power when running on battery. Or physically remove the USB-to-Serial chip if you are programming over UART once and then running headless.
Power Hog 3: GPIO Pull-Up Resistors
Every GPIO pin with a pull-up resistor draws current when the pin is pulled low (or vice versa, depending on your circuit). A single pin with a 10kΩ pull-up to 3.3V, driven low, draws 330μA. Ten such pins draw 3.3mA.
The fix: audit every GPIO pin in your sleep mode. Make sure pins in input mode have no pull, or are driven to matching logic levels.
How to Actually Achieve Deep Sleep
With those three hogs fixed, you still need to configure ESP32 deep sleep correctly. The basics:
// Enable deep sleep
esp_sleep_enable_timer_wakeup(SLEEP_INTERVAL_US);
// Enable wake-up sources (optional)
esp_sleep_enable_gpio_switch(true); // Wake on any GPIO change
// Enter deep sleep
esp_deep_sleep_start();
But this is only the beginning. The ESP32 has multiple sleep modes:
| Mode | Current | Wake Time | WiFi |
|---|---|---|---|
| Active | 80-240mA | Instant | On |
| Modem Sleep | 70mA | Instant | On |
| Light Sleep | 20mA | Instant | On |
| Deep Sleep | 10μA* | 150ms+ | Off |
| Hibernation | 2.5μA* | 150ms+ | Off |
*Hibernate mode turns off everything including RTC. Only RTC GPIOs can wake the chip.
For battery-powered sensor applications, the choice is usually between deep sleep (10μA, RTC active, fast wake) and hibernate (2.5μA, minimal RTC, very slow wake).
The wake time matters more than you think. If your sensor reads take 2 seconds to initialize and your ESP32 wakes every 60 seconds, you are spending 3.3% of your time in high-power mode — not counting the circuit's idle consumption.
The Measurement Framework
You cannot fix what you cannot measure.
Before optimizing anything, build a measurement rig:
- Power your ESP32 circuit from a bench power supply set to 3.7V (LiPo voltage)
- Set the supply to measure current
- Record current during: boot, WiFi connect, sensor read, MQTT transmit, deep sleep
- Calculate duty cycle: (active time / total time) × active current + (sleep time / total time) × sleep current
This is your baseline. Without it, you are guessing.
Most makers find that their "deep sleep" circuit is actually spending 30-50% of its time in an active or light-sleep state due to the network reconnecting, sensors drawing power, or firmware not actually entering deep sleep.
FAQ
Q: My ESP32 draws 150μA in deep sleep even after fixing the voltage regulator and USB chip. Where is the rest coming from?
A: Check your GPIO states explicitly. Run this before sleep: for every GPIO pin, set it to INPUT mode with no pull, or drive it to a matching level. Any floating pin with a pull-up or pull-down resistor will leak current. Also check sensors on the 3.3V rail — many sensors draw 1-10mA even in their "sleep" mode. Disconnect them entirely using a GPIO-controlled MOSFET, or use a voltage regulator with an enable pin.
Q: Should I use ESP32 or a lower-power microcontroller like STM32 or nRF52 for battery-powered sensor projects?
A: If your project only needs to wake up periodically, read a sensor, and transmit data — and does not need WiFi — a microcontroller with integrated low-power radio (nRF52, STM32WB, or even an ESP32-C3 in some cases) will outperform ESP32 by orders of magnitude. ESP32's strength is WiFi connectivity, not battery life. For WiFi-based battery sensors, budget for a 2000mAh battery giving you 2-4 months. For sub-year battery life, consider BLE or a dedicated low-power radio.
The Next Step
Before buying a bigger battery, measure what you have.
Put a multimeter or bench supply between your battery and circuit. Record the current during one complete cycle (wake → connect → read → transmit → sleep). Calculate the actual duty cycle.
If your sleep current is above 100μA on a properly configured circuit, something is still leaking. Find it with a binary search: disconnect peripherals one by one until the sleep current drops.
The problem is never the battery size. It is the current you are not measuring.
Product recommendations for battery-powered ESP32 projects:
FireBeetle ESP32 IoT Microcontroller — Designed for battery power with a load switch that completely disconnects peripherals. Replaces the AMS1117 + CP2102 combination with a proper power architecture. (Amazon)
MCP1700 Ultra-Low Quiescent LDO (3-Pack) — If you must use a standard ESP32 dev board, replace the AMS1117 with this. 4μA quiescent current vs 5-10mA. Drops sleep current from 10-40mA to under 1mA. (Amazon)
2000mAh 3.7V LiPo Battery — The right size for most ESP32 deep-sleep sensor projects. Get a board with a proper LiPo charging circuit if you need rechargeability. (Amazon)
I earn from qualifying purchases.
Article #003, 2026-04-18. Content Farm pipeline, Run #003.
Top comments (0)