meteo-lora.ino
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"));
}