economie-energie.ino
L'atout du NB-IoT est l'énergie : ce croquis configure le PSM et l'eDRX du modem SARA-R4 du MKR NB 1500, puis endort le SAMD21 entre deux mesures de quinze minutes. Bien réglé, l'ensemble tient plusieurs mois sur une petite LiPo.
Matériel requis
Une Arduino MKR NB 1500 (microcontrôleur SAMD21, modem u-blox LTE-M/NB-IoT, antenne externe, alimentation LiPo sur J6 ou USB). LiPo sur le connecteur batterie, SIM IoT, antenne ; opérateur supportant PSM/eDRX (Orange, SFR, DT...).
Câblage
Aucun câblage ; retirez LED et périphériques inutilisés pour viser le courant de repos le plus bas.
Fonctionnement
Les commandes AT+PSMTAU/RATTAU négocient avec le réseau les durées de veille profonde ; nb.sleep() place le module, LowPower.deepSleep() coupe le MCU. L'alarme RTC réveille tout le monde.
Exécution
Installez le package Arduino SAMD Boards et la bibliothèque MKRNB, sélectionnez la carte, téléversez. Prévoyez une carte SIM IoT (LTE-M ou NB1) activée et une bonne réception : l'attachement au réseau peut demander plusieurs minutes.
Variantes
Ajustez la période selon la criticité de la donnée, ou réveillez-vous aussi sur une interruption externe (porte, capteur d'eau) pour un rôle d'alarme.
economie-energie.ino
// Économie d'energie LPWA : PSM + deepSleep SAMD entre deux mesures.
#include <MKRNB.h>
#include <ArduinoLowPower.h>
#include <RTCZero.h>
const char PIN_SIM[] = "0000";
const char APN[] = "iot.1nce.net";
NB nb;
NBClient client;
RTCZero rtc;
void setup() {
Serial.begin(9600);
if (nb.begin(PIN_SIM) != NB_READY) while (true);
while (nb.getStatus() != NETWORK_JOINED) delay(2000);
nb.attachGPRS(APN);
// Demandes PSM au reseau (valeur en secondes, selon operateur)
nb.sendCheckConfig("PSMTAU=11000001"); // TAU 1 h (encodage 3GPP)
nb.sendCheckConfig("RATTAU=11000010"); // eDRX ~40 s
rtc.begin();
LowPower.attachInterruptWakeup(RTC_ALARM_WAKEUP, NULL, RISING);
}
void loop() {
mesure();
nb.sleep(); // modem en mode economique
rtc.setAlarmEvery(15 * 60);
rtc.enableAlarm(rtc.MATCH_SS);
LowPower.deepSleep(); // MCU dort jusqu'a l'alarme
}
void mesure() {
float vbat = 3.3 * analogRead(VBAT) / 1023.0 * 1.5;
Serial.println("VBAT=" + String(vbat, 2));
// ... ouverture client + envoi periodique ...
}