Так как метеостанция относительно новая, и Google не дает результатов по поиску протокола данного датчика, подсоединяем приемник 433 MHz к осциллографу, осциллограф к компьютеру и начинаем исследовать протокол.
По осциллографу видно, что датчик раз в 50 секунд передает 12 одинаковых пакетов, разделенных более широкими синхроимпульсами, хорошо заметными на осциллограмме:
Период синхроимпульсов ~ 1700 uSec, период следования импульсов данных ~ 700 uSec.
Информация передается скважностью — короткий импульс означает 0, длинный 1.
В разных пакетах скважность меняется (но период импульсов данных постоянный ~ 700 uSec), поэтому для устойчивого декодирования полезно взять 8 первых бит пакета, взять среднюю длительность импульса, и считать, что если в пределах одного пакета импульс короче — это 0, длиннее — 1.
Пакеты данных разделяются 4 более широкими синхроимпульсами. Посылку замыкают 2 синхроимпульса, за которыми следует продолжительный период молчания. Про начало сказать трудно, потому что первые импульсы смазаны АРУ приемника.
Вооружаемся написанной на C# утилитой для анализа осциллограмм, данные с датчика отображаются на оригинальной метеостанции, и ищем закономерности для разных замеров температуры/влажности.
В результате получается следующее расположение данных в идентичных пакетах длиной 40 bit каждый:
В конце пакета, по видимому, передается контрольная сумма, но угадать алгоритм ее вычисления проблематично. Поэтому если принято 3 и более одинаковых пакета из 12, считаем, что принятая информация корректна. По количеству одинаковых пакетов также можно оценить качество приема сигнала — чем больше одинаковых пакетов в посылке, тем лучше.
После того, как с алгоритмом декодирования более-менее разобрались, реализуем его на отладочной плате STM32F429I Discovery. За этим следует период отладки в борьбе за качество приема сигнала.
Если сравнить последнюю фотографию с первой, то можно увидеть, что все получилось, мы действительно получили с датчика корректную температуру/влажность. Протокол обмена честно купленного сенсора больше не является загадкой, и сенсор может найти дополнительное применение в самодельных метеостанциях или системах логирования умного дома.
Исходники декодирования протокола сенсора выложены здесь, на деле все немного сложнее, чем описано в публикации.
Результат этой работы может быть полезен владельцам данного сенсора/метеостанции, которые хотят расширить стандартные возможности, например, поставив в соседнюю комнату метеостанцию собственной разработки, при этом не дублируя наружные датчики. Следует заметить, что сенсор — это наиболее трудоемкая для повторения часть, в основном, из-за герметичного корпуса — проще купить готовый, чем делать самому.
P.S. Датчик температуры/влажности является разработкой фирмы TFA Dostmann, поэтому исследование протокола ограничено рамками хобби и полностью исключает какое-либо коммерческое использование.
Комментарии (9)
Kichnap
22.01.2016 10:53Здорово. Этак можно изобрести модуль для работы с различными популярными датчиками и выводить показатели даже на смартфон?
emax73
22.01.2016 21:25Многие энтузиасты описывают протоколы своих сенсоров. Есть Open Source программы, работающие с большим количеством разных сенсоров, например, pilight. В случае взаимодействия со смартфоном нужен мост, 433 MHz <-> BlueTouch / Wi-Fi, поскольку европейские сенсоры работают в открытом диапазоне 433.92 MHz.
Kichnap
22.01.2016 21:36Интересно. Я так понимаю готового решения нет? Нужно собирать что-то на Arduino с приемником на 433 МГц и передатчиком Bluetooth.
iDoka
22.01.2016 14:56Добавьте, пожалуйста, мейкфайл для сборки проекта — так по си исходнику непонятно в какой среде собиралось, возможно еще файл линковщика нужен.
Планируется ли выкладка проекта на сишарп для разбора файла осциллограм?emax73
22.01.2016 21:40Исходники публиковались в виде библиотеки,
Вначале вызываете функцию tfaInit();
потом каждые 50 uSec функцию tfaTask();
Проект примера STMCube STemWin_HelloWord, на базе которого запускалась библиотека, лишний раз в GitHub копировать не хотелось.
Собиралось в среде Keil, отлаживалось на STM32F429 (плата Discovery).
Добавил на GitHub немного пояснительной информации.
Утилита на С# писалась исключительно под эту задачу, и поскольку она не универсальная-красивая-законченная, ее публикация не планируется.
Если интересует Keil проект для Discovery STM32F429 или C#, пишите в личку, исходниками поделюсь.
Но в случае с C# придется поработать напильником :).
serafims
А что за программа анализа осциллограмм? Валяется у меня датчик от иной метеостанции, тоже пробовал его разгадать (правда, подключая лог. анализатор напрямую с МК передающей части, минуя радиоканал.), да что-то не вышло.
emax73
Сырые тайминги с осциллографа анализировать неудобно, поэтому специально для декодирования этого протокола, писалась утилита, которая берет данные .csv формате, рисует осциллограмму, отделяет синхроимпульсы от данных и выводит принятые пакеты в двоичном виде. На втором этапе декодирование протокола было переписано на STM32F4 Discovery, а утилита на C# свою часть работы выполнила. В качестве 433 MHz приемника использовался китайский модуль от Canton Electronics (-112dBm, 9600 bod)
iDoka
433,92 МГц, Амплитудная модуляция?
emax73
да