suivi-adr.ino
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());
}