Метеостанция на базе WSPR маяка


WA6PZB
http://wa6pzb.blogspot.com/2018/12/wspr-weather-telemetry-beacon.html

wspr
Задачей этого проекта было создание простой метеостанции для передачи данных о температуре и влажности через КВ-радио. Это было необходимо для мониторинга метеоданных на удаленных объектах. Сигнал WSPR маяка позволяет сделать это на расстоянии сотен и даже тысяч километров при очень малой мощности передатчика. Небольшое энерготребление позволяет выполнить его автономно с подзарядкой от солнечных батарей. Это актуально, например, в горах, в заповедниках, на небольших островах и т.п.

В первой версии использовался протокол JT65 и библиотека JTEncode с телеметрией, закодированной в 13-символьном поле сообщения, но позже было решено использовать WSPR Метод телеметрии описан ЗДЕСЬ и ЗДЕСЬ. Ключевым символом для вывода телеметрии было использование позывных, начинающихся с нуля «0» или буквы «Q».

Поскольку нужно просто отправить температуру и влажность, был использован упрощенный метод кодирования.

Обычный кадр WSPR содержит позывной, локатор и мощность маяка:

<позывной> <grid> <dbm>

Пример: WA6PZB DM03 13

Кадр телеметрии будет выглядеть так:

<0A0hhh> <Rttt> <dbm>

Пример: 0A0CEF RR20 13

В пакете телеметрии поле позывного было зафиксировано сочетанием 0A0 (вы можете изменить последнюю цифру для нескольких каналов, если необходимо), затем используйте следующие три символа позывного для влажности, а поле сетки (grid) для температуры. Значения данных будут иметь только 3 значащие цифры и будут умножены на 10, чтобы удалить десятичную точку.

Влажность кодируется буквами от A до Z (A=1,B=2,C=3...,Z=0)
КодABCDEFGHIZ
Значение1234567890

Вот несколько примеров:

35,6%= 10 раз = 356 = полный позывной CEF становится → 0A0CEF
50,0% = 10 раз = 500 = полный позывной EZZ становится → 0A0EZZ
80,3% = 10 раз = 803 = полный позывной HZC становится → 0A0HZC

Температура (в градусах Цельсия) кодируется первыми двумя цифрами с использованием чисел сетки и последней цифрой в виде букв от A до R (A=1, B=2,C=3..., R=0) в качестве второй буквы сетки с первой буквой, закрепленной за «R», поскольку она не нужно.
КодABCDEFGHIR
Значение1234567890

Вот несколько примеров:

19,4°C = умножить на 10 = 194 = D19 полная сетка становится → RD19
20,0°C = умножить на 10 = 200 = R20 полная сетка становится → RR20
23,5°C = умножить на 10 = 235 = E23 полная сетка становится → RE23

Последние две цифры пакета телеметрии не меняются и повторяют мощность пердатчика.

Полный отчет о погоде будет состоять из двух передач WSPR.
Первое представляет собой обычное сообщение (для идентификации), за которым следует кадр телеметрии:

0200 7.040165 WA6PZB DM03 13 ← Идентификация
0204 7.040165 0A0CEF RR20 13 ← Канал телеметрии 0

Эти данные можно впоследствии извлечь из каталога журнала приложения WSJT-X в файл WSPR_ALL.txt

Как упоминалось выше, у вас может быть несколько каналов телеметрии, и если вы выполняете идентификацию каждые 10 минут, вы можете разместить еще несколько каналов. Например:

0200 7.040165 WA6PZB DM03 13
0204 7.040165 0A0CEF RR20 13 ← Канал 0
0206 7.040165 0A1EZZ RD19 13 ← Канал 1
0208 7.040165 0A2HZC RD19 13 ← Канал 2

Более наглядно пакет телеметрии можно представить так:

wspr-meteo-cod.jpg

Аппаратное обеспечение

Маяк состоит из модулей, подключенных к ARDUINO UNO/NANO:

  • GPS-приемник.
  • Датчик температуры и влажности Si7021.
  • Синтезатор частоты Si5351.

WSPR_Block

Микросхема Si5351 генерирует мощность примерно от 10 мВт до 20 мВт, и при подключении к фильтру нижних частот (ФНЧ), подобно ЭТОМУ, он будет производить чистый сигнал, который можно услышать с приличной антенной за тысячи километров.

Для повышения мощности до 100...200 мВт можно поставить усилитель между синтезатором и ФНЧ.

Первоначально был испытан датчик температуры и влажности DHT11, но библиотеки конфликтовали с библиотекой Si5351. Датчик Si7021 более точен и хорошо работает с Si5351 и находится на той же шине I2C, поскольку адреса по умолчанию разные.

Схема подключения модулей к Arduino Nano/UNO:

wspr_meteo-1.jpg

Описание программного обеспечения

В этом проекте используется несколько библиотек. Мы используем TinyGPS, которая упрощает работу со строками GPS и, конечно же, JTEncode для генерации сообщений WSPR.

В основном цикле мы читаем время с GPS приемника, ждем начало часа, а также каждые 10, 20, 30, 40 и 50 минут и отправляем первый идентификационный кадр WSPR, за которым следует кадр телеметрии. Код далеко не оптимален, но рабочий. Нужно внести некоторые незначительные корректировки времени для начала первого кадра и между кадрами, чтобы время, потраченное на проверку времени и получение показаний датчика, давало время опережения, чтобы закончить с точностью до секунды (нам нужно быть в пределах ±2 секунды).

По умолчанию передача ведется в радиолюбительском диапазоне 40 м. Но при желании вы можете установить другой диапазон.

Код версии 1.0 находится на Github → https://github.com/wa6pzb/Firmware-WSPR_Telemetry_Beacon.
Или здесь → WSPR_telemetry_beacon_v1.0.ino.

В скетч включено как можно больше комментариев, чтобы помочь всем, кто работает с ним.
Скетч был запущен а Arduino IDE 1.8.0 вместе с необходимыми библиотеками. Только не забудьте заменить позывной и локатор на свои.


Дополнение от RA3TOX

Как всегда, я использовал модуль ARDUINO только для отладки проекта. Окончательный вариант выполнен на микроконтроллере ATMega328Р. В перспективе хочу доработать программу и внести переключатель для выбора других диапазонов.

Схема на микроконтроллере ATMega328
Схема на ATMega328

Для повышения выходной мощности маяка, можно добавить простой усилитель мощности. Пример такого усилителя, выполненного на транзисторе BC337 показан на рисунке ниже. На выходе имеется двухкаскадный фильтр нижних частот на диапазон 30 м (10 МГц). Две катушки фильтра индуктивностью 0,5 мкГн выполнены в виде бухточек. Они содержат по 10 витков и намотаны на оправке диаметром 5 мм.

Рассчитать фильтр Баттерворта на другие диапазоны можно с помощью моего калькулятора.

PA - BPF
Усилитель мощности и полосовой фильтр на диапазон 30 м

В качестве усилителя мощности можно применить микросхему 74AC244, в которой 8 буферных элементов включены параллельно. Такой усилитель при напряжении питания 5 вольт обеспечивает выходную мощность около 200 мВт (23 дБм). Широкополосный трансформатор TR1 необходим для приведения низкого выходного импеданса микросхемы к 50 ом. Он намотан на ферритовом кольце Н400...600 диаметром около 10 мм (не критично). Обмотка содержит 10 витков и выполняется тремя (можно двумя) сложенными вместе и скурченными проводами ПЭЛ-0,3. Будьте внимательны при соединении обмоток!

PA - 74AC244 PA - 74AC244
Усилитель мощности на микросхеме 74AC244

Для прошивки микроконтроллера необходим hex-файл, который образуется при компиляции программы в среде Arduino IDE. Как получить hex-файл можно прочитать в этой статье.

Если у вас есть затруднения для подготовки такого файла - напишите мне (ra3tox на mail ru), я скомпилирую его для вашего позывного и локатора.

Fuse для программирования ATMega328 в программе AVRDUDE показаны на рисунке.

Fuse for ATMega328

Следует отметить, что автор проекта не учёл передачу отрицательных температур. Для устранения этого недостатка надо немного доработать программу. Думаю, что можно принебречь десятичным знаком температуры и вместо него передавать сответствующий символ (например P="+" и M="-").

Пример приема двух пакетов моего маяка (H=30,5%, T=23,9°C):

wspr-ra3tox


Сентябрь 2023
Перевод RA3TOX