← all lessons
ESP32 Deep Dive · #15 of 20

Deep Sleep: Wake Sources, State, RTC Memory

Power Optimization

Why it matters

Deep sleep reduces power consumption to microamps. This is essential for battery-powered devices that need to run for months.

The idea

What Is Deep Sleep?

In deep sleep:
        <h3>Wake Sources</h3>
        ESP32 can wake from:
        <ul>
          <li><strong>Timer</strong> — RTC timer (most common)</li>
          <li><strong>GPIO</strong> — External interrupt (button, sensor)</li>
          <li><strong>Touch</strong> — Touch pad interrupt</li>
          <li><strong>ULP</strong> — Ultra Low Power coprocessor</li>
        </ul>

        <h3>RTC Memory</h3>
        RTC memory persists through deep sleep:
        <ul>
          <li><strong>RTC_SLOW_MEM</strong> — ~8KB, slow access</li>
          <li><strong>RTC_FAST_MEM</strong> — ~8KB, fast access</li>
          <li>Use for: state, sensor data, configuration</li>
          <li>Regular RAM is <strong>lost</strong> on wake</li>
        </ul>

        <h3>Typical Workflow</h3>
        <ol>
          <li>Save state to RTC memory</li>
          <li>Configure wake source (timer, GPIO)</li>
          <li>Enter deep sleep</li>
          <li>Wake up → restore state from RTC memory</li>
          <li>Do work → repeat</li>
        </ol>

Demo

Deep sleep is a power mode, not a visual demo. Review this before implementing power optimization.

Key takeaways

Going deeper

ESP32 has multiple sleep modes: light sleep (keeps RAM, faster wake), deep sleep (loses RAM, slowest wake), hibernation (lowest power, slowest wake). For periodic sensor readings, deep sleep with timer wake is ideal. For event-driven applications, GPIO wake is better.

Math details

Power budget example:
  Active mode: 80mA × 2s = 160mAs per reading
  Deep sleep: 10µA × 298s = 2.98mAs per cycle
  Total per 5min cycle: ~163mAs

For 2000mAh battery:
  Cycles = (2000mAh × 3600s/h) / 163mAs ≈ 44,000 cycles
  Lifetime ≈ 44,000 × 5min ≈ 153 days

Wake time:
  Deep sleep → active: ~200ms (RTC timer wake)
  Light sleep → active: ~5ms (faster but uses more power)

Implementation

LLM Prompt: Deep Sleep Implementation