sleep-gsm.ino
Station sur batterie fonctionnant par cycles : le MKR GSM 1400 se réveille toutes les cinq minutes grâce à l'alarme RTC du SAMD21, éteint le modem entre deux mesures et dort en deepSleep. Le montage de référence pour des mois d'autonomie.
Matériel requis
Une Arduino MKR GSM 1400 (microcontrôleur SAMD21, modem cellulaire 2G/GPRS, antenne externe, alimentation par batterie LiPo sur le connecteur J6 ou par USB). LiPo sur J2, antenne, et patience : le premier réveil complet du modem prend quelques secondes.
Câblage
Aucun câblage supplémentaire ; retirez LED et capteurs non utilisés pour réduire le courant de fond.
Fonctionnement
LowPower.attachInterruptWakeup branche la callback sur l'alarme RTC ; deepSleep stoppe CPU et périphériques. gsm.shutdown() coupe l'alimentation du modem, principal consommateur (jusqu'à 2 A en pic).
Exécution
Dans l'IDE Arduino, installez le package Arduino SAMD Boards, sélectionnez la carte MKR GSM 1400, puis téléversez. Les exemples réseau supposent une carte SIM data active insérée, broche antenne vissée, et un réseau 2G encore couvert dans votre région.
Variantes
Réveillez-vous aussi sur un capteur (interruption externe), adaptez la période selon la criticité, ou gardez le modem en mode PSM au lieu de l'éteindre si l'opérateur le gère.
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 ...
}