The active_sleep sample is intentionally one-way — it demonstrates the target low-power state for production use, not a sleep/wake cycle. Disabling BUCK2 (powering down the RP2040) is the correct thing to do for deployed devices since the RP2040 draws far too much quiescent current to leave on.
For your use case (wake, send, sleep, repeat), the active_sleep sample gives you the peripheral shutdown side — apply those same steps (disable BUCK2, suspend SPI flash, disable accelerometer, suspend UART) but instead of returning from main(), run your send/sleep loop:
/* Peripheral shutdown (same as active_sleep) */
setup_gpio();
setup_accel();
nor_storage_init();
setup_pmic(); /* disables BUCK2 */
setup_uart();
/* Your loop */
while (1) {
/* connect, send data, disconnect/idle */
k_sleep(K_MINUTES(interval));
}
Zephyr automatically handles CPU power management during k_sleep() — no explicit sleep mode entry needed.
For the modem, you have two options depending on your use case and cell provider:
- PSM (Power Saving Mode) — modem stays registered but powers down the radio between TAU updates. No re-attach cost on wake. Good for frequent reporting intervals.
- Full modem shutdown (nrf_modem_lib_shutdown() / nrf_modem_lib_init()) — fully powers down the modem between sends. Lower sleep current but pays the cost of re-attaching each cycle. Better for very long intervals or providers that don’t support PSM well.
The probe becoming unreachable after BUCK2 is disabled is expected — that’s normal operation, not a crash. To reprogram, use the recovery process: hold reset, run probe-rs erase --chip nrf9151_xxAA, release, then reflash. During development, add a button hold check at boot to keep the console alive (https://community.circuitdojo.com/d/771).
I also added some notes in the docs about active_sleep: https://docs.circuitdojo.com/nrf9151-feather/samples.html#active_sleep