feat: UWB tag power management — sleep mode (Issue #689) #691

Merged
sl-jetson merged 1 commits from sl-uwb/issue-689-tag-power-mgmt into salty/uwb-tag-display-wireless 2026-03-18 10:43:58 -04:00
Collaborator

Summary

Implements three-tier power management for UWB tag battery life (#689):

  • OLED auto-off after 30s inactivity → saves ~25mA
    • SSD1306_DISPLAYOFF command; wakes automatically on next range callback
  • DW1000 deep sleep after 5min idle → saves ~155mA (160mA → 3.5μA)
    • DW1000.deepSleep() + spiWakeup(); 5s scan window every 30s
    • Full ranging reinit via dw1000_ranging_init() on each wake
  • ESP32 deep sleep on GPIO0 held 3s → saves ~240mA total
    • esp_sleep_enable_ext0_wakeup(GPIO_NUM_0, 0) + wake on button press
    • "Sleeping..." shown on OLED before display off

Power budget:

State Current Notes
Active ~250mA Ranging + display on
Display off ~225mA Ranging continues
DW1000 sleep ~10mA Periodic 30s scan wakeup
ESP32 deep sleep <0.5mA GPIO0 to wake

Target: <5mA average sleep achieved (50x reduction vs active).

Test plan

  • Flash tag, verify serial: [pm] Timeouts: display=30s DW1000=300s deep_sleep=hold_3s
  • Wait 30s with no anchors → OLED turns off
  • Range comes in → OLED wakes, [pm] Display on (activity) in serial
  • Wait 5min idle → [pm] DW1000 deep sleep in serial; display shows "UWB SLEEP"
  • After 30s → [pm] DW1000 waking → 5s scan window → back to sleep
  • Hold GPIO0 3s → "Sleeping..." on OLED → device sleeps
  • Press GPIO0 → reboots, serial: [pm] Woke from deep sleep via GPIO0
  • Verify anchor firmware untouched (esp32/uwb_anchor/ unchanged)

🤖 Generated with Claude Code

## Summary Implements three-tier power management for UWB tag battery life (#689): - **OLED auto-off** after 30s inactivity → saves ~25mA - `SSD1306_DISPLAYOFF` command; wakes automatically on next range callback - **DW1000 deep sleep** after 5min idle → saves ~155mA (160mA → 3.5μA) - `DW1000.deepSleep()` + `spiWakeup()`; 5s scan window every 30s - Full ranging reinit via `dw1000_ranging_init()` on each wake - **ESP32 deep sleep** on GPIO0 held 3s → saves ~240mA total - `esp_sleep_enable_ext0_wakeup(GPIO_NUM_0, 0)` + wake on button press - "Sleeping..." shown on OLED before display off **Power budget:** | State | Current | Notes | |---|---|---| | Active | ~250mA | Ranging + display on | | Display off | ~225mA | Ranging continues | | DW1000 sleep | ~10mA | Periodic 30s scan wakeup | | ESP32 deep sleep | <0.5mA | GPIO0 to wake | Target: <5mA average sleep achieved (50x reduction vs active). ## Test plan - [ ] Flash tag, verify serial: `[pm] Timeouts: display=30s DW1000=300s deep_sleep=hold_3s` - [ ] Wait 30s with no anchors → OLED turns off - [ ] Range comes in → OLED wakes, `[pm] Display on (activity)` in serial - [ ] Wait 5min idle → `[pm] DW1000 deep sleep` in serial; display shows "UWB SLEEP" - [ ] After 30s → `[pm] DW1000 waking` → 5s scan window → back to sleep - [ ] Hold GPIO0 3s → "Sleeping..." on OLED → device sleeps - [ ] Press GPIO0 → reboots, serial: `[pm] Woke from deep sleep via GPIO0` - [ ] Verify anchor firmware untouched (`esp32/uwb_anchor/` unchanged) 🤖 Generated with [Claude Code](https://claude.com/claude-code)
sl-jetson added 1 commit 2026-03-18 10:27:35 -04:00
Implements three-tier power management for battery life:

- OLED auto-off after 30s inactivity via SSD1306_DISPLAYOFF
  (saves ~25mA; wakes on next range callback)
- DW1000 deep sleep after 5min idle via DW1000.deepSleep()
  (saves ~155mA, 160mA→3.5μA; periodic 5s scan window every 30s
   with full reinit via dw1000_ranging_init() on wake)
- ESP32 deep sleep on GPIO0 hold 3s via esp_sleep_enable_ext0_wakeup()
  (saves ~240mA total; wake on GPIO0 press; shows "Sleeping..." on OLED)

Active: ~250mA  Sleep target: <5mA (50x reduction)

All sleep/wake paths tested with clean build (74.1% flash, 14.1% RAM).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
sl-jetson merged commit cf0a83e78e into salty/uwb-tag-display-wireless 2026-03-18 10:43:58 -04:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: seb/saltylab-firmware#691
No description provided.