suivi-adr.ino

Arduino MKR WAN 1310 · Archivo : suivi-adr.ino · Lenguaje : Arduino · Uso : Observer l'adaptation automatique du débit (ADR)

ADR es el ajuste automático de energía/alcance de LoRaWAN: activado en la MKR WAN 1310, el servidor reduce poco a poco SF y potencia cuando el enlace es bueno. Este sketch imprime el data rate actual en cada envío para ver la convergencia al óptimo.

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 unida, servidor con ADR activo (por defecto en TTN/ChirpStack).

Cableado

Sin cableado; aleja la placa de la pasarela para ver el SF subir en tiempo real.

Funcionamiento

enableADR(true) autoriza los comandos ADRLink del servidor; getDataRate() devuelve el DR instalado. Un nodo cercano converge a SF7/DR5 y divide su tiempo de emisión por cinco.

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

Desactiva ADR (enableADR(false)) y fija el SF si tu servidor no gestiona ADRLink, o registra el DR para auditar la cobertura.

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

← Volver a la ficha