cycles-sleep.ino

Arduino MKR WAN 1300 · Archivo : cycles-sleep.ino · Lenguaje : Arduino · Uso : Émettre par cycles en économisant la batterie

La MKR WAN 1300 está hecha para nodos a pila: este ciclo despierta cada quince minutos, mide, emite una trama corta en SF9 y luego duerme módem y microcontrolador. Sin puerto serie ni LED, la corriente media baja de medio miliamperio.

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). Pack 2x AAA o LiPo, sensor en A1, antena; caja estanca para exterior.

Cableado

Sensor en A1; si el sensor necesita alimentación conmutada, controla su VCC con un pin dedicado en vez de A0.

Funcionamiento

El SX1272 consume ~150 µA en sleep, el SAMD21 en deepSleep ~2 µA salvo el RTC. La alarma RTC despierta el MCU; el ciclo de radio completo dura menos de un segundo.

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

Despierta también con una interrupción (contador de impulsos) para telelectura de agua, o sube el SF de noche cuando baja el ruido de radio.

cycles-sleep.ino

// Cycle sobre : reveil RTC, mesure, emission LoRa, deepSleep.
// Une trame toutes les 15 min sur 2x AAA -> plusieurs mois.
#include <MKRWAN.h>
#include <ArduinoLowPower.h>
#include <RTCZero.h>

LoRaModem modem;
RTCZero rtc;

void setup() {
  // Pas de Serial en production : la LED serie consomme ~5 mA
  if (!modem.begin(EU868)) {
    pinMode(LED_BUILTIN, OUTPUT); // clignotement d'erreur
    while (true) { digitalWrite(LED_BUILTIN, HIGH); delay(100);
                   digitalWrite(LED_BUILTIN, LOW); delay(100); }
  }
  modem.setFrequency(868.5);
  modem.setSpreadingFactor(9); // portee sans sacrifier l'energie
  rtc.begin();
  LowPower.attachInterruptWakeup(RTC_ALARM_WAKEUP, NULL, RISING);
}

void loop() {
  // 1) mesurer
  int brut = analogRead(A1);
  // 2) emettre
  modem.beginPacket();
  modem.print("A="); modem.print(brut);
  modem.endPacket(false);
  // 3) dormir jusqu'a la prochaine alarme
  modem.sleep();            // SX1272 en veille
  rtc.setAlarmEvery(15 * 60);
  rtc.enableAlarm(rtc.MATCH_SS);
  LowPower.deepSleep();
}

← Volver a la ficha