suivi-adr.ino

Arduino MKR WAN 1310 · Fichier : suivi-adr.ino · Langage : Arduino · Usage : Observer l'adaptation automatique du débit (ADR)

L'ADR est le réglage énergie/portée automatique de LoRaWAN : activé sur la MKR WAN 1310, le serveur réduit progressivement SF et puissance quand la liaison est bonne. Ce croquis affiche le data rate courant à chaque envoi pour visualiser la convergence vers l'optimum.

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 jointe, serveur avec ADR actif (défaut sur TTN/ChirpStack).

Câblage

Aucun câblage ; déplacez la carte loin de la passerelle pour voir le SF remonter en temps réel.

Fonctionnement

enableADR(true) autorise les commandes ADRLink du serveur ; getDataRate() renvoie le DR installé. Un nœud proche converge vers SF7/DR5 et divise son airtime par cinq.

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

Désactivez l'ADR (enableADR(false)) et fixez le SF si votre serveur ne gère pas les ADRLink, ou loggez le DR pour auditer la couverture.

suivi-adr.ino

// Suivi ADR : la passerelle pilote SF/TX power, on l'affiche a bord.
#include <MKRWiSOLAR.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;
unsigned long dernier = 0;

void setup() {
  Serial.begin(9600);
  lora.setDeviceEui(DEVICE_EUI);
  lora.setAppEui(APP_EUI);
  lora.setAppKey(APP_KEY);
  lora.setRegion(EU_863_870_R1);
  lora.enableADR(true); // laisse le serveur ajuster data rate + puissance
  if (lora.join(OTAA, MODEL_TYPE_A, 30000, 8) == 0) while (true);
  Serial.println(F("millis;upframes;sf_courant"));
}

void loop() {
  lora.run();
  if (millis() - dernier < 120000) return; // 2 min
  dernier = millis();
  uint8_t t[1] = { (uint8_t)(analogRead(A1) >> 2) };
  lora.sendBuffer(t, 1, 3, 0);
  // Le data rate courant est demande a la pile MAC
  Serial.print(millis());
  Serial.print(';');
  Serial.print(lora.getUpFrameLinkCount());
  Serial.print(';');
  Serial.println(lora.getDataRate());
}

← Retour à la fiche