🛠 Sommeil basse consommation et réveil sur interruption
Objetivos
Prolongar la autonomía de un nodo con batería LiPo de 3,7 V (conector J4 de 3 pines, capacidad mínima recomendada 200 mAh, cargador BQ25120 controlado por nicla::enableCharging(mA)). Los únicos puntos de consumo documentados a nivel de placa son: 460 µA típicos en reposo, 960 µA para el sketch blink, 2,5 mA en publicidad BLE + consulta de sensores a 1 Hz, 1,15 mA en publicidad + una consulta por hora. La estrategia aquí es: dormir el núcleo del Cortex-M4F con __WFI entre dos mediciones, y despertar mediante una interrupción externa. Atención, el tema está poco documentado por Arduino: hasta la fecha, no se ha publicado ninguna API de deep-sleep dedicada para esta placa.
Material
- Placa Arduino Nicla Sense ME (ABX00050) + batería LiPo de celda simple en el conector J4
- Botón o detector conectado a un pin digital para el despertar (pin a masa, pull-up interno)
- Fuente de alimentación regulable o pila + microamperímetro en serie para medir la corriente real
- > ifra de reposo de 460 µA: prudencia con las promesas sub-mA.
Código completo
#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 materiel : 40 mA)
BHY2.begin;
BHY2.setLDOTimeout(600000); // evite la coupure LDO apres 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");
}
Verificación esperada
El sketch imprime la tensión de la batería y luego se detiene; una pulsación en el botón conectado al pin 3 provoca la visualización de « Despertar por interrupción » y la reanudación del ciclo. Al insertar un microamperímetro en serie en la alimentación, se debe observar una caída de la corriente durante la fase de espera en comparación con el ciclo activo; comparar con la tabla de la hoja de datos (460 µA en reposo) para situar su medición.
Errores frecuentes
- Confiar en un
delaygigante como sueño: la CPU sigue funcionando a 64 MHz, la corriente apenas baja;__WFIes indispensable para cortar el reloj del núcleo. - Periféricos dejados despiertos: BLE, LED y sensores a su caudal máximo consumen más que la CPU dormida; apagar los LEDs (
nicla::leds.setColor(off)) y limitar los caudales de los sensores antes de dormir. - Corte del LDO tras un minuto sin actividad ESLOV: comportamiento de diseño que « apaga » periféricos durante una larga espera; trabajar
BHY2.setLDOTimeouten consecuencia. - Interrupción fantasma en un pin flotante: siempre activar un pull-up y cablear el botón hacia masa, de lo contrario el despertar se dispara continuamente.
- >
Otros tutoriales para esta placa
Ejemplos de código para esta placa
led_rgb.inoArduinoimu_bhi260.inoArduinorotation_fusion.inoArduinopression_bmp390.inoArduinonose_electronique.inoArduinoboussole_bmm150.inoArduino