economie-energie.ino
La energía es el as del NB-IoT: este sketch configura PSM y eDRX en el módem SARA-R4 del MKR NB 1500 y luego duerme el SAMD21 entre medidas cada quince minutos. Bien ajustado, aguanta meses con una LiPo pequeña.
Hardware
Una Arduino MKR NB 1500 (microcontrolador SAMD21, módem u-blox LTE-M/NB-IoT, antena externa, alimentación LiPo en J6 o USB). LiPo en el conector de batería, SIM IoT, antena; un operador que soporte PSM/eDRX (Orange, SFR, DT...).
Cableado
Sin cableado; retira LEDs y periféricos sin usar para buscar la corriente de reposo más baja.
Funcionamiento
Los comandos AT+PSMTAU/RATTAU negocian con la red los tiempos de sueño profundo; nb.sleep() aparca el módulo y LowPower.deepSleep() detiene el MCU. La alarma RTC despierta a todos.
Ejecución
Instala el paquete Arduino SAMD Boards y la librería MKRNB, selecciona la placa y carga. Prevé una SIM IoT (LTE-M o NB1) activada y buena recepción: la conexión a la red puede tardar varios minutos.
Variantes
Ajusta el periodo a la criticidad del dato o despierta también con una interrupción externa (puerta, sensor de agua) para actuar como alarma.
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 ...
}