economie-energie.ino

Arduino MKR NB 1500 · Archivo : economie-energie.ino · Lenguaje : Arduino · Uso : Prolonger la batterie grâce aux modes PSM/eDRX du modem

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

← Volver a la ficha