LoRaWan – Estado de bateria. Gateway y Broker

El dispositivo envía los datos del sensor de bateria como un entero en dos bytes con valores entre [0,4096]. La conversión del valor a voltaje se realiza a partir del diagrama de circuito Heltec, donde se muestra que el módulo tiene un divisor de voltaje incorporado.

El divisor de voltaje y su equivalente de la ecuación es:

\frac{R12}{R10+R12} V_{BAT} = \frac{ADC}{4096}(3.3-0.7) V_{BAT} = \Big[ \frac{ADC}{4096}(3.3-0.7) \Big] \frac{R10+R12}{R12} V_{BAT} = 0.00203125*ADC

Decodificador de Trama – ChirpStack/Device-Profile

function Decode(fPort, bytes, variables) {
  
  // usando entero
  var unalectura = (bytes[1] << 8) |(bytes[0]);
  unalectura = unalectura*0.00203125;
  unalectura = +unalectura.toFixed(2);
  var appData = {'Bateria_V': unalectura}

  return appData;
}

En la salida de monitor-Serie se obtiene: Voltaje Batería (V): 2136

que decodificado en applications de chirpstack_ es: Bateria_V: 4.34

que es el valor que se envia por Mqtt.

Configuración en Home-Assistant

La configuración se realiza en el archivo configuration.yaml con la instrucción:

sudo nano /home/homeassistant/.homeassistant/configuration.yaml

al archivo se añade en la sección de sensores las instrucciones de cada lectura.

El tópico a observar se construye tomando los datos de chirpstack para cada dispositivo, observando el número de aplicación y el identificador de dispositivo.

Los valores de los sensores se decodificaron en un diccionario, que se transfirió como un valor tipo texto, por lo que primero se lo convierte en un diccionario antes de seleccionar el valor a usar. La selección del valor se realiza en value_template.

  - platform: mqtt
    name: 'Bateria_S02'
    unit_of_measurement: 'V'
    state_topic: 'application/2/device/c5db5e2b64eefcae/event/up'
    value_template: "{% set valores = value_json.objectJSON |from_json %} {{valores.Bateria_V}}"

Referencia: WiFi_Kit_series/SchematicDiagram/WiFi_LoRa_32(V2)/WIFI_LoRa_32_V2(868-915).PDF. https://github.com/Heltec-Aaron-Lee/WiFi_Kit_series/blob/master/SchematicDiagram/WiFi_LoRa_32(V2)/WIFI_LoRa_32_V2(868-915).PDF

Heltec Wifi LoRa V2 battery management. http://community.heltec.cn/t/heltec-wifi-lora-v2-battery-management/147/36

LoRaWan – Estado de bateria. Archivo.ino

El módulo de desarrollo Heltec Wireless Stick Lite tiene el circuito de sensor y alimentación por baterías. El diagrama de pines muestra que el pin 13 se encuentra conectado como detector de energía, que se incorpora a las instrucciones como PowerDetection. En los nuevos modelos, el detector de energía es el pin 37.

Preparación de trama

El valor del sensor ADC para bateria es de tipo entero, entrega la cuantificación en el rango [0, 4096], por lo que un entero de 2 bytes es suficiente para los datos. El proceso de conversión a voltaje se realiza en el decodificador en Application-Server del Broker ChirpStack.

  uint16_t BateriaV = SensorBateria();
  
  appDataSize = 4 ;
  appData[3] = 0 ;
  appData[2] = 0 ;
  appData[1] = highByte(BateriaV);
  appData[0] = lowByte(BateriaV);

Intrucciones Principales

/* Adaptado a partir de:
 * HelTec Automation(TM) LoRaWAN 1.0.2 OTAA example use OTAA, CLASS A
 * Solo ESP32+LoRa series boards con licencia http://www.heltec.cn/search/);
 * https://github.com/HelTecAutomation/ESP32_LoRaWAN/tree/master/examples/OTAA_Battery_power
*/
#include <ESP32_LoRaWAN.h>
#include "Arduino.h"

/*licencia Heltec ESP32 LoRaWan http://resource.heltec.cn/search */
uint32_t  license[4] = { 0xC254CA22, 0xFB5646A9, 0xA23B184F, 0x8F613844};

/* OTAA parametros*/
uint8_t DevEui[] = { 0xc5, 0xdb, 0x5e, 0x2b, 0x64, 0xee, 0xfc, 0xae };
uint8_t AppEui[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
uint8_t AppKey[] = { 0xf2, 0x1f, 0xff, 0x5c, 0x6f, 0xf2, 0x4c, 0xa0, 0x74, 0x73, 0xf5, 0xef, 0xf7, 0x39, 0x39, 0x10 };

/* ABP parametros*/
uint8_t NwkSKey[] = { 0x15, 0xb1, 0xd0, 0xef, 0xa4, 0x63, 0xdf, 0xbe, 0x3d, 0x11, 0x18, 0x1e, 0x1e, 0xc7, 0xda,0x85 };
uint8_t AppSKey[] = { 0xd7, 0x2c, 0x78, 0x75, 0x8c, 0xdc, 0xca, 0xbf, 0x55, 0xee, 0x4a, 0x77, 0x8d, 0x16, 0xef,0x67 };
uint32_t DevAddr =  ( uint32_t )0x007e6ae1;

/*LoraWan channelsmask, default channels 0-7*/ 
uint16_t userChannelsMask[6]={ 0x00FF,0x0000,0x0000,0x0000,0x0000,0x0000 };

DeviceClass_t  loraWanClass = CLASS_A; /*Soporte de A and C*/
uint32_t appTxDutyCycle = 15000;       /*15000; en [ms]*/
bool overTheAirActivation = true;      /*OTAA or ABP*/
bool loraWanAdr = true;                /*ADR enable*/
bool isTxConfirmed = true;             /*confirmed or unconfirmed messages */
uint8_t appPort = 2;                   /* Application port */

/* reintentos de transmisión, en caso de no recibir ack */
uint8_t confirmedNbTrials = 8;

/* Seleccionado de Arduino IDE tools */
uint8_t debugLevel = LoRaWAN_DEBUG_LEVEL;
LoRaMacRegion_t loraWanRegion = ACTIVE_REGION;

// Mensajes por Puerto Serial
volatile boolean serial_msg = true;

// variables de sensor/actuador
// Sensor de estado de bateria, revisar modelo de módulo
// PowerDetection 13 en Wireless Stick lite, otros 37
#define Vext 21
#define PowerDetection 13

void setup()
{
  Serial.begin(115200);
  while (!Serial);
  SPI.begin(SCK,MISO,MOSI,SS);
  Mcu.init(SS,RST_LoRa,DIO0,DIO1,license);

  //sensor de bateria
  adcAttachPin(PowerDetection);
  analogSetClockDiv(255); // 1338mS
    pinMode(Vext, OUTPUT);
    
  deviceState = DEVICE_STATE_INIT;
}

void loop() {
  
  switch( deviceState )  {
    case DEVICE_STATE_INIT:    {
      LoRaWAN.init(loraWanClass,loraWanRegion);
      break;
    }
    case DEVICE_STATE_JOIN:    {
      LoRaWAN.join();
      break;
    }
    case DEVICE_STATE_SEND:    { 
      prepareTxFrame( appPort );
      LoRaWAN.send(loraWanClass);
      deviceState = DEVICE_STATE_CYCLE;
      break;
    }
    case DEVICE_STATE_CYCLE:    {
      // Schedule next packet transmission
      txDutyCycleTime = appTxDutyCycle + randr( -APP_TX_DUTYCYCLE_RND,
                                                APP_TX_DUTYCYCLE_RND );
      LoRaWAN.cycle(txDutyCycleTime);
      deviceState = DEVICE_STATE_SLEEP;
      break;
    }
    case DEVICE_STATE_SLEEP:    {
      LoRaWAN.sleep(loraWanClass,debugLevel);
      break;
    }
    default:    {
      deviceState = DEVICE_STATE_INIT;
      break;
    }
  }
}

Preparación de trama

// Trama - integra datos
static void prepareTxFrame( uint8_t port ){
  
  uint16_t BateriaV = SensorBateria();
  
  appDataSize = 4 ;
  appData[3] = 0 ;
  appData[2] = 0 ;
  appData[1] = highByte(BateriaV);
  appData[0] = lowByte(BateriaV);
}

Lectura de sensor

uint16_t SensorBateria(){
  
  // lectura ADC Voltaje de bateria 
  digitalWrite(Vext, LOW);
  delay(10);
  uint16_t ADC_voltage = analogRead(PowerDetection);
  digitalWrite(Vext, HIGH);

  Serial.print("Voltaje Batería (V): ");
  Serial.println(ADC_voltage);

  return ADC_voltage;
}

Referencia: Heltec LoRa ESP32, https://github.com/HelTecAutomation/ESP32_LoRaWAN/blob/master/examples/OTAA_Battery_power/OTAA_Battery_power.ino

Heltec LoRa ESP32 Wireless Stick Lite, diagrama de pintes- https://resource.heltec.cn/download/Wireless_Stick_Lite/Wireless_Stick_Lite.pdf

LoRaWan – Estado de bateria y carga con panel solar

Para dispositivos remotos donde es posible solo alimentación de energía mediante baterías es conveniente incluir el estado de la batería entre los datos de sensores.

Los mensajes LoRa son cortos, poco frecuentes y de bajo consumo de energía, por lo que un pequeño panel solar puede ser suficiente para mantener la batería del dispositivo con suficiente carga.

En un esquema básico, usando elementos disponibles, se usa un módulo HELTEC LoRa Wireless Stick Lite que dispone de un conector para alimentación con baterías a 3.7 V, además del circuito sensor de estado. Para recarga se conecta un panel solar de 5 a 6V (~1W) con un módulo TP4056 que contiene un circuito de protección se sobrevoltaje y polaridad inversa.

Esquema del circuito

El módulo TP4056 regula y controla la carga de la batería, pues el voltaje de carga del panel solar varía según la intensidad de luz solar recibida. El módulo tambien controla la salida de la batería hacia el módulo LoRa, previene la descarga de la batería por debajo de niveles que la dañen.

Los módulos de desarrollo para LoRa de Heltec incorporan el circuito y un puerto para conectar la batería de 3.7V. El modelo CubeCell incorpora el circuito de carga y pines de conexión para un panel solar, lo que simplifica aun más el esquema, tener encuenta el modelo a usar para el caso particular a implementar.

Referencias: TP 4056, https://www.componentsinfo.com/tp4056-module-pinout-datasheet-details/

CubeCell Dev-Board Plus, https://heltec.org/project/htcc-ab02/

Power ESP32/ESP8266 with Solar Panels, https://randomnerdtutorials.com/power-esp32-esp8266-solar-panels-battery-level-monitoring/