relais-radio.ino
Control remoto de un relé: la MKR WAN 1300 receptora lee las consignas ON/OFF por radio, pilota el pin 6 mediante un transistor y devuelve un acuse. Pulsar el botón del emisor manda sobre un equipo a kilómetros.
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). MKR WAN 1300 receptora, módulo relé de 5 V o SSR, transistor NPN + resistencia de 1 kΩ, alimentación externa del relé.
Cableado
PIN 6 → resistencia 1 kΩ → base NPN; relé entre 5 V y colector, diodo de rueda libre en la bobina; la carga va a su propia alimentación.
Funcionamiento
El bucle sondea la FIFO de radio; cada trama se normaliza y se compara con ON/OFF. La acción es idempotente y el ACK confirma la ejecución al emisor.
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 código de estación en la trama para evitar mandos cruzados entre vecinos, o un timeout de seguridad que corte el relé sin novedades.
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);
}
}
}