How Long Does ESP32 Last on Battery?

How Long Does ESP32 Last on Battery

Hey there, ESP32 enthusiast! Whether you’re building a smart home sensor, a wearable device, or an industrial IoT solution, one question always pops up: “How long will my ESP32 run on a battery?” Well, grab a coffee and let’s dive into the fascinating world of ESP32 power management. I promise you’ll come out with some serious battery-extending superpowers!

The Short Answer (for those in a hurry)

An ESP32’s battery life can range from a few hours to several years, depending on your battery choice, power modes, and overall system design. But don’t run off just yet – the devil’s in the details, and those details could mean the difference between changing batteries weekly or yearly!

Power Modes: The Secret Sauce of Battery Life

The ESP32 is like a superhero with multiple alter egos. Each “identity” (power mode) has its own superpowers (and limitations). Let’s unmask them:

  1. Active Mode
  • Power Consumption: 160-260mA
  • Use Case: Full CPU speed, WiFi/Bluetooth active
  • Battery Killer Alert: Use sparingly!
  1. Modem Sleep Mode
  • Power Consumption: 3-20mA
  • Use Case: CPU running, WiFi/Bluetooth disabled
  • Pro Tip: Great for periodic wake-ups without network activity
  1. Light Sleep Mode
  • Power Consumption: ~0.8mA
  • Use Case: CPU paused, but RTC running
  • Handy Feature: Fast wake-up times
  1. Deep Sleep Mode
  • Power Consumption: As low as 10µA
  • Use Case: Minimal functionality, RTC running
  • Battery Life Extender: Your go-to mode for long-term battery operation

Here’s a practical example to put this into perspective:

import esp32
from machine import deepsleep

def do_reading():
    # Simulate sensor reading and data transmission
    # In reality, this would involve actual sensor code and network transmission
    print("Reading sensor and sending data...")

# Wake up every hour
SLEEP_TIME = 3600000  # 1 hour in milliseconds

do_reading()
print(f"Going to sleep for {SLEEP_TIME/1000} seconds")
deepsleep(SLEEP_TIME)

This simple script wakes up the ESP32, performs a reading, and then goes back to deep sleep for an hour. It’s a basic but powerful pattern for battery-powered sensors.

Battery Types: Choosing Your Power Source Wisely

Not all batteries are created equal. Let’s break down the contenders:

  1. Lithium-Ion (Li-ion) / Lithium Polymer (LiPo)
  • Capacity: 2000-10000mAh
  • Voltage: 3.7V (perfect for ESP32)
  • Pros: High energy density, rechargeable
  • Cons: Requires protection circuit, limited lifespan
  1. Alkaline AA
  • Capacity: 2000-3000mAh
  • Voltage: Need 3 in series for 4.5V
  • Pros: Widely available, low cost
  • Cons: Bulky, not rechargeable
  1. CR2032 Coin Cell
  • Capacity: ~225mAh
  • Voltage: 3V (may need a boost converter)
  • Pros: Compact, long shelf life
  • Cons: Low capacity, not suitable for high-current applications
  1. 18650 Lithium-ion
  • Capacity: 2600-3500mAh
  • Voltage: 3.7V
  • Pros: High capacity, rechargeable
  • Cons: Larger size compared to LiPo
  1. LiFePO4
  • Capacity: 1000-2500mAh
  • Voltage: 3.2V (might need voltage regulation)
  • Pros: Long cycle life, safe chemistry
  • Cons: Lower energy density than Li-ion

For a data-driven comparison, let’s look at how long each battery type could power an ESP32 in different scenarios:

Battery TypeCapacityActive ModeModem SleepDeep Sleep
LiPo2000mAh~10 hours~4 days~2 years
3xAA Alkaline2500mAh~12 hours~5 days~2.5 years
CR2032225mAh~1 hour~10 hours~3 months
186503000mAh~15 hours~6 days~3 years
LiFePO41500mAh~7 hours~3 days~1.5 years

Note: These are theoretical maximums. Real-world performance will vary based on temperature, self-discharge, and other factors.

Hardware Considerations: Every Milliamp Counts

Your ESP32 might be a power-sipping champ, but what about its entourage? External components can be secret power drains. Here’s how to keep them in check:

  1. Choose Low-Power Sensors: Opt for sensors with sleep modes or low quiescent current.
  2. Power Gating: Use MOSFETs to completely cut power to peripherals when not in use.
  3. Voltage Regulators: Linear regulators are simple but inefficient. Consider switching regulators for better efficiency.
  4. Reduce LED Usage: Those tiny lights can be major power hogs. Use them sparingly.

Here’s a quick comparison of power consumption for common sensors:

Sensor TypeActive CurrentSleep Current
BME280 (I2C)0.25mA0.1µA
DHT22 (Digital)1.5mA50µA
TSL2561 (I2C)0.6mA15µA
ADXL345 (SPI)0.1mA0.1µA

Software Optimization: Code Efficiency = Battery Efficiency

Your code can make or break your battery life. Here are some tips to keep your ESP32 running lean and mean:

  1. Minimize Active Time: Get in, do your work, get out. The less time spent in active mode, the better.
  2. Use RTC Memory: Store small amounts of data in RTC memory to persist through deep sleep without using power-hungry flash memory.
  3. Optimize WiFi Connections: Use static IP addresses and disable WiFi power-saving features for faster connections.
  4. Batch Data Transmissions: Instead of sending data frequently, batch it and send less often.

Here’s a code snippet demonstrating some of these principles:

import machine
import network
import esp32
import time

def connect_wifi():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.config(pm=0xa11140)  # Disable power-saving mode
    wlan.connect('YOUR_SSID', 'YOUR_PASSWORD')
    while not wlan.isconnected():
        pass
    print('WiFi connected')

def read_sensor():
    # Simulate reading from a sensor
    return esp32.raw_temperature()

def send_data(data):
    # Simulate sending data
    print(f"Sending data: {data}")
    time.sleep(1)  # Simulate network delay

def main():
    rtc = machine.RTC()

    if machine.reset_cause() == machine.DEEPSLEEP_RESET:
        print('Woke from a deep sleep')
        readings = rtc.memory()  # Retrieve data from RTC memory
    else:
        print('Power on or hard reset')
        readings = bytearray(4)  # 4 bytes to store temperature readings

    temp = read_sensor()
    readings[rtc.memory()[0]] = temp
    rtc.memory()[0] = (rtc.memory()[0] + 1) % 4

    if rtc.memory()[0] == 0:  # We have 4 readings, time to send
        connect_wifi()
        send_data(readings)
        rtc.memory(bytearray(4))  # Reset our storage

    print('Going to sleep for 15 minutes')
    machine.deepsleep(900000)  # Sleep for 15 minutes (900000 milliseconds)

if __name__ == '__main__':
    main()

This script demonstrates several power-saving techniques:

  • Using RTC memory to store data between deep sleep cycles
  • Batching data before transmission
  • Minimizing time spent with WiFi active

Real-World Example: The Everlasting Plant Monitor

Let’s put all this knowledge into practice with a real-world example: a plant monitoring system that measures soil moisture, temperature, and light levels once an hour and transmits data once a day.

Hardware:

  • ESP32-WROOM-32D
  • Capacitive soil moisture sensor
  • BME280 temperature/humidity sensor
  • TSL2561 light sensor
  • 2000mAh LiPo battery

Power Consumption Breakdown:

  1. Deep sleep: 10µA * 3599 seconds = 0.01mAs
  2. Active sensing: 80mA * 1 second = 80mAs
  3. WiFi transmission (once per day): 250mA * 5 seconds = 1250mAs / 24 = 52.08mAs per hour

Total per hour: 132.09mAs = 0.0367mAh

Theoretical Battery Life: 2000mAh / 0.0367mAh ≈ 54,495 hours ≈ 6.2 years

Of course, real-world factors like temperature variations, battery self-discharge, and potential retransmissions will reduce this. But even accounting for these, we’re looking at a system that could potentially run for 2-3 years on a single charge!

Troubleshooting and Debugging

Even with careful planning, you might encounter power-related issues. Here are some common problems and solutions:

  1. Unexpected Power Drain
  • Use a multimeter to measure current in different states
  • Check for stuck WiFi or Bluetooth states
  • Verify all peripherals are properly entering sleep modes
  1. Inconsistent Wake-up Behavior
  • Ensure proper use of pull-up/pull-down resistors on GPIO pins
  • Verify RTC is properly configured
  • Check for potential power supply instability
  1. Shorter Than Expected Battery Life
  • Log power consumption over time to identify unexpected peaks
  • Verify deep sleep is engaging properly
  • Check for unnecessary background processes or WiFi scans

Remember, measuring power consumption accurately can be tricky. Consider using specialized tools like the INA219 current sensor for precise measurements.

Wrapping Up: Your ESP32 Battery Life Cheat Sheet

  1. Use deep sleep mode whenever possible
  2. Choose your battery wisely based on your project’s needs
  3. Optimize both hardware and software for power efficiency
  4. Batch operations and data transmissions
  5. Measure, don’t guess – use real data to optimize

Now it’s your turn! What’s the longest you’ve managed to run an ESP32 on a battery? Have you discovered any clever power-saving tricks? Share your experiences in the comments below – let’s learn from each other and push the boundaries of what’s possible with these amazing little chips!

Want to see the difference between ESP32 and ESP8266? Check out our article on The differences between ESP32 and ESP8266 for information.

Happy (low-power) hacking!

Posted by Mohamed Amine Belkacem

Mechatronics Engineering Student with experience in Computer Engineering

No comments yet

Leave a Reply

Your email address will not be published. Required fields are marked *