relais-radio.ino

Arduino MKR WAN 1300 · Archivo : relais-radio.ino · Lenguaje : Arduino · Uso : Allumer un relais à distance par radio

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);
    }
  }
}

← Volver a la ficha