scan-canaux.ino
Antes de elegir tu canal LoRa, mide el entorno: este programa barre nueve canales EU868 y publica para cada uno el RSSI medio y mínimo. Un canal ruidoso (pasarelas vecinas, interferencias) se detecta al instante por un suelo RSSI elevado.
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). Basta una MKR WAN 1300 sola; la antena colocada capta la actividad radio circundante.
Cableado
Sin cableado; muévete o ejecuta el escáner 24 h para cubrir los ciclos de actividad de los emisores vecinos.
Funcionamiento
readRssi() devuelve el nivel de ruido medido por el SX1272 en el canal actual. Muestrear 20 veces por canal da una estadística estable; el CSV se importa en una hoja de cálculo.
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
Añade un histograma horario para ver los picos de ocupación o dispara un cambio de canal automático si el RSSI medio supera un umbral.
scan-canaux.ino
// Analyseur de spectre approximatif : RSSI moyen par canal EU868.
// Roll-call des canaux 868.0 a 869.5 MHz par pas de 200 kHz.
#include <MKRWAN.h>
LoRaModem modem;
const float FREQS[] = {868.0, 868.1, 868.3, 868.5, 868.7, 868.9, 869.1, 869.3, 869.5};
const int N = 9;
const int MESA = 20; // mesures par canal
void setup() {
Serial.begin(115200);
while (!Serial);
if (!modem.begin(EU868)) while (true);
modem.setSpreadingFactor(7);
Serial.println(F("freq_mhz;rssi_moyen;rssi_min"));
}
void loop() {
for (int c = 0; c < N; c++) {
modem.setFrequency(FREQS[c]);
long somme = 0;
int minirssi = 0;
for (int m = 0; m < MESA; m++) {
delay(20);
int r = modem.readRssi();
somme += r;
if (m == 0 || r < minirssi) minirssi = r;
}
Serial.print(FREQS[c], 1);
Serial.print(';');
Serial.print((float)somme / MESA, 1);
Serial.print(';');
Serial.println(minirssi);
}
Serial.println(F("---"));
delay(10000); // rafraichissement toutes les 10 s
}