🛠 Uplinks confirmés robustes et duty cycle

Arduino MKR WAN 1310 · avance · Schéma : IMG-mkr-wan-1310-avance-1-mkrwan1310-uplink-confirme-robuste.svg — File d'attente de messages sur une MKR WAN 1310, horloge de duty cycle 2 minutes, flèches ACK/retour vers la passerelle et réémissions.

Objectifs

Fiabiliser les envois LoRaWAN de la MKR WAN 1310 : uplinks confirmés avec ACK, respect du plancher firmware d'une émission par 2 minutes (duty cycle EU, non modifiable), file d'attente en RAM, backoff en cas d'échec, et contournement du bug de compteur de trames qui bloque l'émission après ~255 envois (issue MKRWAN #141).

Matériel

Code complet

// Uplink confirme robuste avec file d'attente — MKR WAN 1310
#include <MKRWAN.h>

LoRaModem modem;
String appEui = "0000000000000000";
String appKey = "00000000000000000000000000000000";

const int TAILLE_FILE = 8;
String file[TAILLE_FILE];
int tete = 0, queue = 0, nbFile = 0;
unsigned long dernierEnvoi = 0;
unsigned long totalEnvois = 0;

void setup {
  Serial.begin(115200);
  while (!Serial);
  if (!modem.begin(EU868)) { Serial.println("Module KO"); while (1); }
  // Le bug #141 (blocage après ~255 trames) se contourne en re-joignant
  // periodiquement : rebegin + joinOTAA tous les 200 envois.
  if (!modem.joinOTAA(appEui, appKey)) { Serial.println("Join KO"); while (1); }
  modem.minPollInterval(60);
}

void loop {
  // Production : ici un capteur ou un bouton empile des messages
  if (millis % 60000 < 100 && nbFile < TAILLE_FILE) {
    file[queue] = "T=" + String(analogRead(A0));
    queue = (queue + 1) % TAILLE_FILE; nbFile++;
  }
  // Consommation : 1 message / 2 min maximum (plancher firmware EU)
  if (nbFile > 0 && millis - dernierEnvoi >= 125000UL) {
    modem.beginPacket;
    modem.print(file[tete]);
    int err = modem.endPacket(true);   // true = uplink_confirme (attend ACK)
    if (err > 0) {
      tete = (tete + 1) % TAILLE_FILE; nbFile--;
      totalEnvois++;
      Serial.println("ACK recu");
    } else {
      Serial.println("Sans ACK : on garde en file, backoff 2 min");
    }
    dernierEnvoi = millis;
    if (totalEnvois > 0 && totalEnvois % 200 == 0) {
      modem.begin(EU868);              // réinitialise le compteur de trames
      modem.joinOTAA(appEui, appKey);
    }
  }
}

Vérification attendue

Chaque message confirmé disparaît de la file et apparaît « confirmé » dans le live data TTN ; un message sans ACK reste en file et repart au cycle suivant. Après plusieurs heures, l'émission ne se bloque plus grâce à la rejonction périodique.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels