relais-radio.ino
Commande d'un relais 12 V à distance : la MKR WAN 1300 réceptrice lit les consignes ON/OFF arrivant par radio, pilote la broche 6 via un transistor, et renvoie un accusé de réception. Un geste simple — appuyer sur un bouton de l'émetteur — commande un équipement à des kilomètres.
Matériel requis
Une Arduino MKR WAN 1300 (microcontrôleur SAMD21, modem LoRa Semtech SX1272 point à point, pas de pile LoRaWAN embarquée, antenne 868/915 MHz). MKR WAN 1300 réceptrice, module relais 5 V ou relais SSR, transistor NPN + résistance 1 kΩ si relais classique, alim externe relais.
Câblage
BROCHE 6 → résistance 1 kΩ → base NPN ; relais entre 5 V et collecteur, diode de roue libre sur la bobine ; la charge va sur son alimentation propre.
Fonctionnement
La boucle scrute la FIFO radio ; toute trame est normalisée puis comparée à ON/OFF. L'action est idempotente (re-set de la même broche sans risque) et l'ACK confirme l'exécution à l'émetteur.
Exécution
Installez Arduino SAMD Boards et la bibliothèque MKRWAN, sélectionnez la carte, téléversez. Il faut DEUX cartes LoRa (deux MKR WAN 1300, ou une 1300 et une 1310) pour voir les échanges ; réglez le même plan de fréquences dans le code.
Variantes
Ajoutez un code de station dans la trame pour éviter les commandes croisées entre voisins, ou un timeout de sécurité qui coupe le relais sans nouvelle.
relais-radio.ino
// Commande radio d'un relais : recepteur MKR WAN 1300 -> broche 6.
// Trames attendues : "ON" ou "OFF" (emetteur = bouton sur autre carte).
#include <MKRWAN.h>
LoRaModem modem;
const int RELAIS = 6;
bool etat = false;
void setup() {
Serial.begin(115200);
pinMode(RELAIS, OUTPUT);
digitalWrite(RELAIS, LOW);
if (!modem.begin(EU868)) while (true);
modem.setFrequency(868.7); // meme canal que l'emetteur
Serial.println(F("Attente de consigne ON/OFF..."));
}
void loop() {
int n = modem.available();
if (n > 0) {
String cmd = "";
while (modem.available()) cmd += (char)modem.read();
cmd.trim(); cmd.toUpperCase();
if (cmd == "ON" || cmd == "OFF") {
etat = (cmd == "ON");
digitalWrite(RELAIS, etat ? HIGH : LOW);
Serial.println(etat ? F("RELAIS ACTIVE") : F("RELAIS COUPE"));
// Accuse de reception vers l'emetteur (half-duplex)
modem.beginPacket();
modem.print("ACK "); modem.print(cmd);
modem.endPacket(false);
} else {
Serial.println(F("consigne ignoree : ") + cmd);
}
}
}