tick_basse_conso.c
Le patron des capteurs sur pile : la carte dort 30 secondes, se réveille, clignote 1 ms, et redort. Entre deux réveils le CPU est en idle et PM éteint les pilotes — la base des autonomies de plusieurs mois sur pile bouton.
Matériel requis
Une carte nRF52833-DK (Nordic, SoC nRF52833 Cortex-M4F, BLE 5) alimentée par USB : 4 LEDs sur P0.13-P0.16 (actives au niveau bas) et 4 boutons sur P0.11, P0.12, P0.24, P0.25 (actifs bas, pull-up interne à activer). La carte sur pile (le MDK n’a pas de chargeur : prévoir un régulateur ou un LiPo via pads) et idéalement un micro-ampèremètre.
Câblage
Aucun câblage pour le test. En réel, alimenter par le pad VDD et mesurer en série avec un PPK2 ou un nano-ampèremètre.
Fonctionnement
k_sleep(K_SECONDS(30)) met le noyau en idle profond (WFI) ; seule la RTC compte le temps. La LED ne s’allume qu’un milliseconde pour que l’énergie par cycle reste négligeable.
Exécution
Projet Zephyr : west build -b nrf52833dk/nrf52833 puis west flash (J-Link embarqué) ; console série 115200 sur le connecteur USB UART.
Variantes
Réveiller sur GPIO (bouton, alarme capteur) plutôt que sur timer, regrouper les mesures pour un envoi BLE unique, ou couper l’horloge lente inutilisée.
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;
}