scan-canaux.ino

Arduino MKR WAN 1300 · Archivo : scan-canaux.ino · Lenguaje : Arduino · Uso : Mesurer l'occupation radio des canaux LoRa

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
}

← Volver a la ficha