🛠 Sommeil basse consommation et réveil sur interruption
Objectifs
Prolonger l'autonomie d'un nœud sur batterie LiPo 3,7 V (connecteur J4 3 broches, capacité minimale recommandée 200 mAh, chargeur BQ25120 piloté par nicla::enableCharging(mA)). Les seuls points de consommation documentés au niveau carte sont : 460 µA typique en veille, 960 µA pour le sketch blink, 2,5 mA en publicité BLE + interogation capteurs à 1 Hz, 1,15 mA en publicité + une interogation par heure. La stratégie ici : endormir le cœur du Cortex-M4F avec __WFI entre deux mesures, et se réveiller sur une interruption externe. Attention, le sujet est sous-documenté par Arduino : à ce jour, aucune API de deep-sleep dédiée n'est publiée pour cette carte.
Matériel
- Carte Arduino Nicla Sense ME (ABX00050) + batterie LiPo simple cellule sur le connecteur J4
- Bouton ou détecteur relié à une broche numérique pour le réveil (broche-vers-masse, pull-up interne)
- Alimentation réglable ou pile + microampèremètre en série pour mesurer le courant réel
- > st non plus spécifiée : prudence sur les promesses sub-mA.
Code complet
#include "Nicla_System.h"
#include "Arduino_BHY2.h"
volatile bool reveille = false;
const uint8_t BROCHE_REVEIL = 3;
void onReveil { reveille = true; }
void setup {
Serial.begin(115200);
nicla::begin;
nicla::enableCharging(20); // courant de charge doux (defaut matériel : 40 mA)
BHY2.begin;
BHY2.setLDOTimeout(600000); // evite la coupure LDO après 1 min sans activite
pinMode(BROCHE_REVEIL, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(BROCHE_REVEIL), onReveil, FALLING);
}
void loop {
BHY2.update;
delay(1000);
Serial.print("Tension batterie : ");
Serial.println(nicla::getCurrentBatteryVoltage);
Serial.flush;
reveille = false;
__WFI; // le CPU s'arrete, attend une interruption
while (!reveille); // sortie de veille
Serial.println("Reveil par interruption");
}
Vérification attendue
Le sketch imprime la tension de batterie puis se fige ; un appui sur le bouton relié à la broche 3 provoque l'affichage « Reveil par interruption » et la reprise du cycle. En insérant un microampèremètre en série sur l'alimentation, on doit observer une chute du courant pendant la phase d'attente par rapport au cycle actif ; comparer au tableau du datasheet (460 µA en veille) pour situer sa mesure.
Erreurs fréquentes
- Compter sur
delaygéant comme sommeil : le CPU continue de tourner à 64 MHz, le courant ne baisse quasiment pas ;__WFIest indispensable pour couper l'horloge du cœur. - Périphériques laissés éveillés : BLE, LED et capteurs à leur débit maximal consomment plus que le CPU endormi ; éteindre les LEDs (
nicla::leds.setColor(off)) et limiter les débits de capteurs avant de dormir. - Coupure LDO après une minute sans activité ESLOV : comportement de conception qui « éteint » des périphériques pendant une longue veille ; travailler
BHY2.setLDOTimeouten conséquence. - Interrupption fantôme sur broche flottante : toujours activer un pull-up et câbler le bouton vers la masse, sinon le réveil se déclenche en continu.
- >
Autres tutoriels pour cette carte
Exemples de code pour cette carte
led_rgb.inoArduinoimu_bhi260.inoArduinorotation_fusion.inoArduinopression_bmp390.inoArduinonose_electronique.inoArduinoboussole_bmm150.inoArduino