downlink.ino

Arduino MKR WAN 1310 · Fichier : downlink.ino · Langage : Arduino · Usage : Réception et exécution d'une commande descendante

Un nœud LoRaWAN se pilote à distance : cette MKR WAN 1310 écoute le port 8 et change sa propre période d'envoi quand le serveur lui envoie un octet. Le pattern de configuration à distance qui évite de récupérer physiquement un nœud déployé en toiture.

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 LoRaWAN capable d'envoyer un downlink (TTN console, ChirpStack downlink queue).

Câblage

Aucun câblage ; le downlink arrive dans les fenêtres RX1/RX2 après un uplink (class A).

Fonctionnement

parseIncoming() dépile la file de downlinks déchiffrés ; getDataPort/getData/getDataSize exposent la charge utile applicative. La nouvelle période est appliquée immédiatement.

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 port 9 pour un reset usine (effacement des clés), ou encodez plusieurs paramètres dans un buffer à bits de champ.

downlink.ino

// Downlinks port 8 (MKR WAN 1310) : l'octet recu = periode (min).
#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 cote serveur

LoRaWAN lora;
unsigned long periode = 600000, 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);
  if (lora.join(OTAA, MODEL_TYPE_A, 30000, 8) == 0) while (true);
}

void loop() {
  lora.run();
  if (lora.parseIncoming()) { // downlink en attente ?
    uint8_t port = lora.getDataPort();
    uint8_t *buf = lora.getData();
    uint8_t len = lora.getDataSize();
    if (port == 8 && len >= 1) {
      periode = (unsigned long)buf[0] * 60000UL;
      Serial.println("periode : " + String(buf[0]) + " min");
    }
  }
  if (millis() - dernier >= periode) {
    dernier = millis();
    uint8_t t[1] = { (uint8_t)(analogRead(A1) >> 2) };
    lora.sendBuffer(t, 1, 2, 0);
  }
}

← Retour à la fiche