reglage-sp.ino
El alcance LoRa se ajusta con el factor de propagación: este sketch emite el mismo mensaje de SF7 a SF12, treinta segundos por escalón. El receptor debe cambiar de SF con el emisor —o lanzar un receptor por SF— para medir la distancia real de cada escalón.
Hardware
Una Arduino MKR WAN 1300 (microcontrolador SAMD21, módem LoRa Semtech SX1272 para enlaces punto a punto, sin pila LoRaWAN integrada, antena de 868/915 MHz). Al menos dos MKR WAN 1300, antenas de 868 MHz, terreno despejado o un trayecto en coche para la campaña.
Cableado
Sin cableado; anota hora y lugar de los últimos paquetes recibidos para trazar la curva de alcance.
Funcionamiento
setSpreadingFactor fija la robustez (SF12 = 6x el tiempo de emisión del SF7), setBandwidth(125) respeta el plan EU, setCodingRate(5) añade corrección de errores. Cada +1 SF ≈ +20-35 % de alcance.
Ejecución
Instala Arduino SAMD Boards y la librería MKRWAN, selecciona la placa y carga. Hacen falta DOS placas LoRa (dos MKR WAN 1300, o una 1300 y una 1310) para ver los intercambios; fija el mismo plan de frecuencias en el código.
Variantes
Invierte los roles para medir en subida, o fija SF12 en emisión y varía la potencia (setTxPower) para aislar su efecto.
reglage-sp.ino
// Balayage des facteurs detalement : portee vs debit sur MKR WAN 1300.
// Emetteur : diffuse le meme message dans chaque SF, 30 s chacun.
#include <MKRWAN.h>
LoRaModem modem;
const int SFS[] = {7, 8, 9, 10, 11, 12};
int index = 0;
unsigned long dernier = 0;
void setup() {
Serial.begin(115200);
while (!Serial);
if (!modem.begin(EU868)) while (true);
modem.setFrequency(868.3); // canal libre hors trames classiques
appliquer();
}
void loop() {
if (millis() - dernier >= 30000) {
dernier = millis();
index = (index + 1) % 6;
appliquer();
}
modem.beginPacket();
modem.print("SF");
modem.print(SFS[index]);
modem.print(" ");
modem.print(millis() / 1000);
modem.endPacket(false);
delay(2000);
}
void appliquer() {
modem.setSpreadingFactor(SFS[index]);
modem.setBandwidth(125); // kHz, obligation reglementaire EU
modem.setCodingRate(5); // 4/5
Serial.print(F("SF="));
Serial.println(SFS[index]); // SF12 ~ 0.3 kbit/s, portee max
}