noeud-batterie.ino

Arduino MKR WAN 1310 · Archivo : noeud-batterie.ino · Lenguaje : Arduino · Uso : Nœud sur pile : réveil RTC, uplink, deepSleep

Despliegue real a pila: como la sesión LoRaWAN sobrevive al deepSleep, la MKR WAN 1310 solo hace un uplink cada treinta minutos sin re-join. Con dos AA NiMH el presupuesto dura meses, si cortas el puerto serie y los LED.

Hardware

Una Arduino MKR WAN 1310 (microcontrolador SAMD21, módem LoRa pilotado por un ESP32 integrado que también expone Wi-Fi, antena LoRa y antena Wi-Fi). MKR WAN 1310, batería LiPo o 2x AA, sensor en A1, antena exterior si es posible.

Cableado

Sensor en A1; en producción, alimenta el sensor con un pin conmutado en vez de permanentemente.

Funcionamiento

La pila MKRWiSOLAR guarda la sesión en flash: isSessionRestored() evita el join (caro en tiempo de emisión). deepSleep del SAMD + alarma RTC dan un despertar limpio y un solo sendBuffer.

Ejecución

Instala Arduino SAMD Boards y la librería MKRWAN 2.x (MKRWAN1310), selecciona la placa y carga. La 1310 se controla con comandos AT a través de su ESP32 interno; para LoRa, prevé una segunda placa LoRa al otro lado.

Variantes

Añade un sendBuffer confirmado semanal para comprobar el enlace o un watchdog de hardware si la ubicación no tiene supervisión.

noeud-batterie.ino

// Noeud LoRaWAN sur pile : RTC + ArduinoLowPower + session conservee.
#include <MKRWiSOLAR.h>
#include <ArduinoLowPower.h>
#include <RTCZero.h>

const uint8_t DEVICE_EUI[] = {0xDE,0xAD,0xBE,0xEF,0xFE,0xED,0xC0,0xFF};
const uint8_t APP_EUI[]    = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
const uint8_t APP_KEY[16]  = {0}; // a provisionner

LoRaWAN lora;
RTCZero rtc;

void setup() {
  lora.setDeviceEui(DEVICE_EUI);
  lora.setAppEui(APP_EUI);
  lora.setAppKey(APP_KEY);
  lora.setRegion(EU_863_870_R1);
  // Reprise de session : ne join que si aucune session en flash
  if (!lora.isSessionRestored() &&
      lora.join(OTAA, MODEL_TYPE_A, 30000, 8) == 0)
    while (true); // join KO : attendre l'intervention
  rtc.begin();
  LowPower.attachInterruptWakeup(RTC_ALARM_WAKEUP, NULL, RISING);
}

void loop() {
  int brut = analogRead(A1);
  uint8_t t[2] = { (uint8_t)(brut >> 8), (uint8_t)brut };
  lora.sendBuffer(t, 2, 2, 0);
  rtc.setAlarmEvery(30 * 60);
  rtc.enableAlarm(rtc.MATCH_SS);
  LowPower.deepSleep();
}

← Volver a la ficha