classe-c.ino

Arduino MKR WAN 1310 · Archivo : classe-c.ino · Lenguaje : Arduino · Uso : Écouter en continu (class C) pour réagir vite

Para un accionador a red, la clase C divide la latencia descendente: la MKR WAN 1310 escucha RX2 de forma continua y aplica una consola del servidor en segundos. El consumo de reposo sube a ~20 mA; solo instalaciones alimentadas, nunca a pila.

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 alimentada a red/USB, relé o accionador en el pin 6, servidor LoRaWAN.

Cableado

Relé vía transistor como en el ejemplo P2P; alimentación estable obligatoria (la radio escucha permanentemente).

Funcionamiento

MODEL_TYPE_C configura la pila para reescuchar RX2 en cuanto está libre. parseIncoming() entrega los downlinks al llegar; la latencia depende del servidor, no del próximo uplink.

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

Un compromiso clase A con periodos de uplink cortos si la energía es limitada, o fija un único canal RX2 en el servidor para fiabilizar la escucha.

classe-c.ino

// Class C : la MKR WAN 1310 ecoute RX2 en permanence (sur secteur).
// Ideal actionneur : la consigne serveur est appliquee en secondes.
#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;
const int RELAIS = 6;

void setup() {
  Serial.begin(9600);
  pinMode(RELAIS, OUTPUT);
  lora.setDeviceEui(DEVICE_EUI);
  lora.setAppEui(APP_EUI);
  lora.setAppKey(APP_KEY);
  lora.setRegion(EU_863_870_R1);
  // MODEL_TYPE_C = class C : RX2 quasi permanente entre emissions
  if (lora.join(OTAA, MODEL_TYPE_C, 30000, 8) == 0) while (true);
  Serial.println(F("Class C a l'ecoute sur RX2 869.525 MHz"));
}

void loop() {
  lora.run(); // ecoute RX2 + traitement des downlinks
  if (lora.parseIncoming()) {
    uint8_t *d = lora.getData();
    if (lora.getDataPort() == 10 && lora.getDataSize() >= 1) {
      digitalWrite(RELAIS, d[0] ? HIGH : LOW);
      Serial.println(d[0] ? F("RELAI ON") : F("RELAI OFF"));
    }
  }
}

← Volver a la ficha