sleep-gsm.ino
Estación a batería por ciclos: el MKR GSM 1400 despierta cada cinco minutos con la alarma RTC del SAMD21, apaga el módem entre lecturas y duerme en deepSleep. El montaje de referencia para meses de autonomía.
Hardware
Una Arduino MKR GSM 1400 (microcontrolador SAMD21, módem celular 2G/GPRS, antena externa, alimentada por batería LiPo en el conector J6 o por USB). LiPo en J2, antena y paciencia: el primer despertar completo del módem tarda unos segundos.
Cableado
Ningún cableado extra; retira LEDs y sensores sin usar para reducir la corriente de reposo.
Funcionamiento
LowPower.attachInterruptWakeup engancha la callback a la alarma RTC; deepSleep detiene CPU y periféricos. gsm.shutdown() corta la alimentación del módem, el mayor consumidor (picos de hasta 2 A).
Ejecución
En el IDE de Arduino, instala el paquete Arduino SAMD Boards, selecciona la placa MKR GSM 1400 y carga. Los ejemplos de red suponen una SIM de datos activa insertada, la antena enroscada y cobertura 2G todavía disponible en tu zona.
Variantes
Despierta también con un sensor (interrupción externa), ajusta el periodo según la criticidad, o mantén el módem en PSM en vez de apagarlo si tu operador lo gestiona.
sleep-gsm.ino
// Sommeil profond entre deux releves : alarmes SAMD + modem eteint.
#include <MKRGSM.h>
#include <ArduinoLowPower.h>
#include <RTCZero.h>
const char PIN_SIM[] = "0000";
const char APN[] = "sl2g";
GSM gsm; GSMGPRS gprs; GSMClient client;
RTCZero rtc;
volatile bool reveille = false;
void onReveil() { reveille = true; }
void setup() {
Serial.begin(9600);
if (gsm.begin(PIN_SIM) != GSM_READY) while (true);
rtc.begin();
LowPower.attachInterruptWakeup(RTC_ALARM_WAKEUP, onReveil, RISING);
}
void loop() {
reveille = false;
mesuresEtEnvoi(); // reveil -> mesurer -> envoyer
gsm.shutdown(); // coupe le modem (gros gain)
LowPower.deepSleep(); // attend l'alarme RTC
rtc.setAlarmEvery(5 * 60); // prochaine mesure dans 5 min
rtc.enableAlarm(rtc.MATCH_SS);
}
void mesuresEtEnvoi() {
Serial.println(F("Reveil : mesure + envoi"));
// apres deepSleep, reattacher le reseau puis poster la mesure
while (gsm.waitNetworkReady(30) != ON_NET);
gprs.attachGPRS(APN, GPRS_AUTOMATIC_BEARER, 1);
// ... client.connect / POST ...
}