🛠 Sommeil profond du SAMD21 pour nœud sur batterie
Objetivos
Dormir el SAMD21 (sueño profundo) y despertarlo mediante RTC para un nodo alimentado por batería. Atención: la 1300 no tiene cargador Li-Po (a diferencia de la 1310) — la alimentación por batería es externa. >
Material
- 1 Arduino MKR WAN 1300
- Alimentación externa 3,3/5 V (Li-Po + regulador, sin cargador integrado)
- Biblioteca RTCZero
- Multímetro en modo microamperímetro para validar
Código completo
#include <RTCZero.h>
RTCZero rtc;
const uint8_t LED = 6;
volatile bool reveille = false;
void onAlarme { reveille = true; }
void setup {
pinMode(LED, OUTPUT);
rtc.begin;
rtc.setAlarmTime(0, 0, 0); // hh:mm:ss
rtc.enableAlarm(rtc.MATCH_SS); // toutes les minutes
rtc.attachInterrupt(onAlarme);
}
void loop {
// 1) Reveil : faire le travail radio (uplink LoRaWAN, cf. tutos precedents)
digitalWrite(LED, HIGH); // placeholder : acquisition + send
digitalWrite(LED, LOW);
// 2) Sommeil profond : STOP + WFI, le RTC reste seul actif
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
__DSB; // evite la course reveil/sommeil
__WFI;
}
Verificación esperada
La alarma RTC despierta la placa cada minuto (breve destello del LED); entre dos alarmas, el multímetro en serie con la alimentación cae claramente por debajo del nivel de funcionamiento normal. El módulo LoRa también debe volver a modo de sueño AT entre dos envíos.
Errores frecuentes
- Olvidar __DSB: la placa puede perder la alarma que llega justo antes del WFI.
- El módulo de radio permanece activo: sin comando de sueño del módulo, la ganancia es mínima.
- Confiar en la batería sin cargador: la 1300 no tiene circuito de carga, prever un módulo externo.
- USB conectado: el host mantiene la placa despierta, medir con batería.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
emission-p2p.inoArduinoreception-p2p.inoArduinoreglage-sp.inoArduinometeo-lora.inoArduinotrame-crc.inoArduinorelais-radio.inoArduino