meteo-lora.ino

Arduino MKR WAN 1300 · Fichier : meteo-lora.ino · Langage : Arduino · Usage : Envoyer température et humidité par LoRa toutes les 10 min

Station météo autonome complète : le BME280 branché sur I2C fournit température, humidité et pression, la MKR WAN 1300 les diffuse en LoRa toutes les dix minutes. La trame compacte T;H;P tient en 20 octets, idéale pour un récepteur unique multi-stations.

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, capteur BME280 I2C (adresse 0x76), batterie LiPo pour l'autonomie, seconde carte LoRa réceptrice.

Câblage

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

Fonctionnement

Le croquis vérifie la présence du BME280 au démarrage, lit les trois grandeurs, les formate en une ligne point-virgule, et publie sans ACK pour économiser l'airtime et la batterie.

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 l'ID de station en tête de trame pour mutualiser un récepteur, ou passez en binaire (5 octets) pour diviser l'airtime par quatre.

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

← Retour à la fiche