За основу взят готовый модуль Heltec LoRa Node 151. Плата содержит микроконтроллер с низким потреблением STM32L151 и радио чип SX1276.

Тепловая карта в Grafana

В качестве LoRaWAN библиотеки использован проект LoRaMAC-node. Так же был написан модуль для работы с шиной 1-wire через uart и модуль для работы с датчиком DS18B20.

Из особенностей можно отметить, что на плате имеется транзисторный ключ Vext control для управления питанием внешних устройств. Чем собственно и была запитана шина 1-wire.

Микроконтроллер позволяет измерить опорное напряжение АЦП, а поскольку он запитывается почти напрямую с батареи, то это позволяет оценить заряд батареи (на самом деле нет, т.к. график заряда Li-SOCl2 весьма нелинеен).

Измеренное значение температуры модуль передаёт в виде сообщения без подтверждения, а упаковывает данные в формате LPP Cayenne. Получается всего 4 байта, например: 00 67 00 aa, где:

  • 0x00 - Channel
  • 0x67 - Temperature Sensor
  • 0x00 0xaa - Data

Выбор такого формата обсуловлен тем, что многие сервера поддерживают его декодинг “из коробки”.

Данные о напряжении батареи запрашивает сам LoRaWAN сервер. Для этого он с некоторой периодичностью отправляет команду DevStatusReq (см. LoRaWAN™ 1.0.3 Specification), а в ответ прибор отправляет DevStatusAns с полями Battery и Margin. Причем отправляется не напряжение батареи, а уровень заряда от 1 до 254.

Т.к. на приёмной стороне предпологалось использовать дешевый одноканальный (или двух) шлюз, то ADR был выключен и список частот ограничен базовыми 868.9 и 869.1. Скорость передачи - DR0 (SF12 BW125).

Серверная часть - ChirpStack, с настроенной http и influxdb интеграцией. По http декодированные данные принимает python-скрипт и отправляет данные в сервис narodmon.ru.

Декодированный payload выглядит так:

{
  "data": "AGcAfQ==",
  "objectJSON": "{\\"temperatureSensor\\":{\\"0\\":12.5}}"
}

Данные из influxdb удобно просматривать с помощью Grafana и плагина heatmap (результат на КДПВ).