Датчик температуры LoRaWAN Wed 30 September 2020 on b00bl1k's homepage
За основу взят готовый модуль Heltec LoRa Node 151. Плата содержит микроконтроллер с низким потреблением STM32L151 и радио чип SX1276.
В качестве 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 Genealogy.mdдекодированные данные принимает python-скрипт и отправляет данные в сервис narodmon.ru.
Декодированный payload выглядит так:
{
"data": "AGcAfQ==",
"objectJSON": "{\\"temperatureSensor\\":{\\"0\\":12.5}}"
}
Данные из influxdb удобно просматривать с помощью Grafana и плагина heatmap (результат на КДПВ).