tick_basse_conso.c
El patrón de sensores a pila: la placa duerme 30 segundos, despierta, parpadea 1 ms y vuelve a dormir. Entre despertares la CPU está en idle y PM apaga los drivers: la base de autonomías de meses con pila de botón.
Hardware
Una placa nRF52833-DK (Nordic, SoC nRF52833 Cortex-M4F, BLE 5) alimentada por USB: 4 LED en P0.13-P0.16 (activos a nivel bajo) y 4 botones en P0.11, P0.12, P0.24, P0.25 (activos a bajo, pull-up interno a activar). La placa a pila (el MDK no tiene cargador: prever regulador o LiPo por pads) e idealmente un microamperímetro.
Cableado
Sin cableado para la prueba. En campo, alimentar por el pad VDD y medir en serie con un PPK2 o nanoamperímetro.
Funcionamiento
k_sleep(K_SECONDS(30)) deja el núcleo en idle profundo (WFI); solo la RTC cuenta el tiempo. El LED se enciende un milisegundo para que la energía por ciclo sea insignificante.
Ejecución
Proyecto Zephyr: west build -b nrf52833dk/nrf52833 y luego west flash (J-Link embarcado); consola serie 115200 en el conector USB UART.
Variantes
Despertar por GPIO (botón, alarma de sensor) en vez de timer, agrupar medidas en un único envío BLE, o apagar dominios de reloj no usados.
tick_basse_conso.c
/* Battement basse consommation : réveil toutes les 30 s.
* Kconfig : CONFIG_PM=y, CONFIG_PM_DEVICE=y pour éteindre les
* pilotes inutilisés ; le CPU dort en idle entre deux réveils.
* À mesurer avec un PPK2 : l'éclair LED doit durer < 1 ms. */
#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>
static const struct gpio_dt_spec led =
GPIO_DT_SPEC_GET(DT_ALIAS(led0), gpios);
int main(void)
{
gpio_pin_configure_dt(&led, GPIO_OUTPUT_INACTIVE);
while (1) {
/* k_sleep = System ON idle : le noyau WFI, seule
l'horloge temps réel reste armée. */
k_sleep(K_SECONDS(30));
/* Signal visuel bref : 1 flash = un cycle de 30 s */
gpio_pin_set_dt(&led, 1);
k_msleep(1);
gpio_pin_set_dt(&led, 0);
/* Ici : lecture capteur + envoi BLE, puis redormir */
}
return 0;
}