Метеостанция на базе WSPR маяка
WA6PZB
http://wa6pzb.blogspot.com/2018/12/wspr-weather-telemetry-beacon.html
Задачей этого проекта было создание простой метеостанции для передачи данных о температуре и влажности через КВ-радио. Это было необходимо для мониторинга метеоданных на удаленных объектах. Сигнал 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)
Код A B C D E F G H I Z Значение 1 2 3 4 5 6 7 8 9 0 Вот несколько примеров:
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», поскольку она не нужно.
Код A B C D E F G H I R Значение 1 2 3 4 5 6 7 8 9 0 Вот несколько примеров:
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Более наглядно пакет телеметрии можно представить так:
Аппаратное обеспечение
Маяк состоит из модулей, подключенных к ARDUINO UNO/NANO:
Микросхема Si5351 генерирует мощность примерно от 10 мВт до 20 мВт, и при подключении к фильтру нижних частот (ФНЧ), подобно ЭТОМУ, он будет производить чистый сигнал, который можно услышать с приличной антенной за тысячи километров.
- GPS-приемник.
- Датчик температуры и влажности Si7021.
- Синтезатор частоты Si5351.
Для повышения мощности до 100...200 мВт можно поставить усилитель между синтезатором и ФНЧ.
Первоначально был испытан датчик температуры и влажности DHT11, но библиотеки конфликтовали с библиотекой Si5351. Датчик Si7021 более точен и хорошо работает с Si5351 и находится на той же шине I2C, поскольку адреса по умолчанию разные.
Схема подключения модулей к Arduino Nano/UNO:
Описание программного обеспечения
В этом проекте используется несколько библиотек. Мы используем 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
Для повышения выходной мощности маяка, можно добавить простой усилитель мощности. Пример такого усилителя, выполненного на транзисторе BC337 показан на рисунке ниже. На выходе имеется двухкаскадный фильтр нижних частот на диапазон 30 м (10 МГц). Две катушки фильтра индуктивностью 0,5 мкГн выполнены в виде бухточек. Они содержат по 10 витков и намотаны на оправке диаметром 5 мм.
Рассчитать фильтр Баттерворта на другие диапазоны можно с помощью моего калькулятора.
В качестве усилителя мощности можно применить микросхему 74AC244, в которой 8 буферных элементов включены параллельно. Такой усилитель при напряжении питания 5 вольт обеспечивает выходную мощность около 200 мВт (23 дБм). Широкополосный трансформатор TR1 необходим для приведения низкого выходного импеданса микросхемы к 50 ом. Он намотан на ферритовом кольце Н400...600 диаметром около 10 мм (не критично). Обмотка содержит 10 витков и выполняется тремя (можно двумя) сложенными вместе и скурченными проводами ПЭЛ-0,3. Будьте внимательны при соединении обмоток!
Усилитель мощности и полосовой фильтр на диапазон 30 м
Усилитель мощности на микросхеме 74AC244Для прошивки микроконтроллера необходим hex-файл, который образуется при компиляции программы в среде Arduino IDE. Как получить hex-файл можно прочитать в этой статье.
Если у вас есть затруднения для подготовки такого файла - напишите мне (ra3tox на mail ru), я скомпилирую его для вашего позывного и локатора.
Fuse для программирования ATMega328 в программе AVRDUDE показаны на рисунке.
Следует отметить, что автор проекта не учёл передачу отрицательных температур. Для устранения этого недостатка надо немного доработать программу. Думаю, что можно принебречь десятичным знаком температуры и вместо него передавать сответствующий символ (например P="+" и M="-").
Пример приема двух пакетов моего маяка (H=30,5%, T=23,9°C):
Сентябрь 2023
Перевод RA3TOX