noeud-batterie.ino

Arduino MKR WAN 1310 · Fichier : noeud-batterie.ino · Langage : Arduino · Usage : Nœud sur pile : réveil RTC, uplink, deepSleep

Le déploiement réel sur pile : la session LoRaWAN survivant au deepSleep, la MKR WAN 1310 se contente d'un uplink toutes les trente minutes sans re-join. Sur deux AA NiMH, le budget tient plusieurs mois, à condition de couper le port série et les LED.

Matériel requis

Une Arduino MKR WAN 1310 (microcontrôleur SAMD21, modem LoRa piloté par un ESP32 embarqué qui expose aussi le Wi-Fi, antenne LoRa et antenne Wi-Fi). MKR WAN 1310, batterie LiPo ou 2× AA, capteur sur A1, antenne extérieure si possible.

Câblage

Capteur sur A1 ; en production, alimentez le capteur via une broche coupable d'énergie plutôt qu'en permanence.

Fonctionnement

La pile MKRWiSOLAR conserve la session en flash : isSessionRestored() évite le join (coûteux en airtime). deepSleep SAMD + alarme RTC donnent un éveil propre, puis un seul sendBuffer.

Exécution

Installez Arduino SAMD Boards et la bibliothèque MKRWAN 2.x (MKRWAN1310), sélectionnez la carte, téléversez. La 1310 se pilote par commandes AT via l'ESP32 interne ; pour LoRa, prévoyez une seconde carte LoRa en face.

Variantes

Ajoutez un sendBuffer confirmé hebdomadaire pour vérifier la liaison, ou un watchdog matériel si le site est sans supervision.

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();
}

← Retour à la fiche