uplink-confirme.ino

Arduino MKR WAN 1310 · Fichier : uplink-confirme.ino · Langage : Arduino · Usage : Envoyer une trame montante avec accusé réseau

La transmission fiable en LoRaWAN : la MKR WAN 1310 envoie deux octets de capteur sur le port 2 en mode confirmé et attend l'acquittement MAC du serveur. En cas d'échec, la trame est simplement retentée au cycle suivant — la stratégie simple qui évite les files d'attente.

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 (voir exemple join-otaa), capteur analogique sur A1, serveur LoRaWAN actif.

Câblage

Capteur sur A1/GND/3,3 V ; rien d'autre, la carte gère la radio elle-même.

Fonctionnement

sendBuffer(..., confirmed=1) programme une retransmission en fenêtre RX2 si le serveur n'acquitte pas. Le compteur de frame monte à chaque envoi, ce qui protège contre les répétitions.

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

Stockez la trame en RAM non volatile pour la rejouer après un redémarrage, ou passez en non confirmé pour les mesures tolérantes aux pertes.

uplink-confirme.ino

// Uplink confirme + suivi du compteur de frame sur MKR WAN 1310.
#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;
uint8_t trame[2];

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);
  Serial.println(F("JOIN OK"));
}

void loop() {
  lora.run();
  if (millis() - dernier < 300000) return; // 5 min
  dernier = millis();
  int brut = analogRead(A1);
  trame[0] = brut >> 8;
  trame[1] = brut & 0xFF;
  // sendBuffer(donnees, taille, port, confirme)
  if (lora.sendBuffer(trame, 2, 2, 1))
    Serial.println(F("ACK recu du serveur"));
  else
    Serial.println(F("pas d'ACK (reessai au prochain cycle)"));
}

← Retour à la fiche