classe-c.ino
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"));
}
}
}