sleep-gsm.ino

Arduino MKR GSM 1400 · Archivo : sleep-gsm.ino · Lenguaje : Arduino · Uso : Réduire la consommation entre deux envois avec les alarmes SAMD

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 ...
}

← Volver a la ficha