meteo-lora.ino

Arduino MKR WAN 1300 · Archivo : meteo-lora.ino · Lenguaje : Arduino · Uso : Envoyer température et humidité par LoRa toutes les 10 min

Estación meteorológica autónoma completa: el BME280 por I2C da temperatura, humedad y presión, y la MKR WAN 1300 las difunde por LoRa cada diez minutos. La trama compacta T;H;P cabe en 20 bytes, ideal para un receptor con varias estaciones.

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, sensor BME280 I2C (dirección 0x76), batería LiPo para autonomía, segunda placa LoRa receptora.

Cableado

BME280 VCC→3,3 V, GND→GND, SDA→pin SDA, SCL→pin SCL del conector I2C de la MKR WAN.

Funcionamiento

El sketch comprueba el BME280 al arrancar, lee las tres magnitudes, las formatea en una línea con punto y coma y publica sin ACK para ahorrar tiempo de emisión y batería.

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 el ID de estación al inicio de la trama para compartir un receptor, o pasa a binario (5 bytes) para dividir el tiempo de emisión por cuatro.

meteo-lora.ino

// Station meteo LoRa P2P : BME280 (I2C) -> MKR WAN 1300 -> recepteur.
#include <MKRWAN.h>
#include <Adafruit_BME280.h>

LoRaModem modem;
Adafruit_BME280 bme;

unsigned long dernier = 0;

void setup() {
  Serial.begin(115200);
  if (!modem.begin(EU868)) while (true);
  modem.setFrequency(868.5);
  if (!bme.begin(0x76)) {
    Serial.println(F("BME280 absent (0x76)"));
    while (true);
  }
}

void loop() {
  if (millis() - dernier < 600000) return; // 10 min
  dernier = millis();
  float t = bme.readTemperature();
  float h = bme.readHumidity();
  float p = bme.readPressure() / 100.0;
  // Trame compacte : T;H;P avec 1 decimale
  String trame = String(t, 1) + ";" + String(h, 1) + ";" + String(p, 1);
  modem.beginPacket();
  modem.print(trame);
  if (modem.endPacket(false) > 0)
    Serial.println("publie : " + trame);
  else
    Serial.println(F("emission KO"));
}

← Volver a la ficha