uplink-confirme.ino
Transmisión fiable en LoRaWAN: la MKR WAN 1310 envía dos bytes de sensor al puerto 2 en modo confirmado y espera el acuse MAC del servidor. Si falla, la trama se reintenta en el siguiente ciclo; la estrategia simple que evita colas.
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 (ver ejemplo join-otaa), sensor analógico en A1, servidor LoRaWAN activo.
Cableado
Sensor a A1/GND/3,3 V; nada más, la placa gestiona la radio ella sola.
Funcionamiento
sendBuffer(..., confirmed=1) programa una retransmisión en la ventana RX2 si el servidor no acusa recibo. El contador de trama sube en cada envío, lo que protege contra repeticiones.
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
Guarda la trama en RAM no volátil para reenviarla tras un reinicio o pasa a no confirmado para medidas tolerantes a pérdidas.
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)"));
}