classe-c.ino
Pour un actionneur sur secteur, la class C divise la latence descendante : la MKR WAN 1310 écoute RX2 en continu et applique une consigne serveur en quelques secondes. Le courant de veille passe à ~20 mA — réservé aux installations alimentées, jamais sur pile.
Matériel requis
Une Arduino MKR WAN 1310 (microcontrôleur SAMD21, modem LoRa piloté par un ESP32 embarqué qui expose aussi le Wi-Fi, antenne LoRa et antenne Wi-Fi). MKR WAN 1310 alimentée sur secteur/USB, relais ou actionneur sur la broche 6, serveur LoRaWAN.
Câblage
Relais via transistor comme l'exemple P2P ; alim stable obligatoire (la radio écoute en permanence).
Fonctionnement
MODEL_TYPE_C configure la pile pour réécouter RX2 dès qu'elle est libre. parseIncoming() livre les downlinks au fil de l'eau ; la latence dépend du serveur, pas de la prochaine trame montante.
Exécution
Installez Arduino SAMD Boards et la bibliothèque MKRWAN 2.x (MKRWAN1310), sélectionnez la carte, téléversez. La 1310 se pilote par commandes AT via l'ESP32 interne ; pour LoRa, prévoyez une seconde carte LoRa en face.
Variantes
Un compromis class A + périodes d'uplink courtes si l'énergie est limitée, ou verrouillez un canal RX2 unique côté serveur pour fiabiliser l'écoute.
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"));
}
}
}