22 января 2016 в 09:39

Реверс-инжиниринг протокола датчика метеостанции TFA Spring из песочницы

Не так давно TFA выпустила довольно симпатичную метеостанцию TFA Spring с сенсором температуры-влажности 30.3206.02. При желании использовать сенсор в собственных разработках, например, в самодельных часах/метеостанции, может помочь эта статья.

image


Так как метеостанция относительно новая, и Google не дает результатов по поиску протокола данного датчика, подсоединяем приемник 433 MHz к осциллографу, осциллограф к компьютеру и начинаем исследовать протокол.

По осциллографу видно, что датчик раз в 50 секунд передает 12 одинаковых пакетов, разделенных более широкими синхроимпульсами, хорошо заметными на осциллограмме:

image

image

Период синхроимпульсов ~ 1700 uSec, период следования импульсов данных ~ 700 uSec.
Информация передается скважностью — короткий импульс означает 0, длинный 1.

image

В разных пакетах скважность меняется (но период импульсов данных постоянный ~ 700 uSec), поэтому для устойчивого декодирования полезно взять 8 первых бит пакета, взять среднюю длительность импульса, и считать, что если в пределах одного пакета импульс короче — это 0, длиннее — 1.

Пакеты данных разделяются 4 более широкими синхроимпульсами. Посылку замыкают 2 синхроимпульса, за которыми следует продолжительный период молчания. Про начало сказать трудно, потому что первые импульсы смазаны АРУ приемника.

Вооружаемся написанной на C# утилитой для анализа осциллограмм, данные с датчика отображаются на оригинальной метеостанции, и ищем закономерности для разных замеров температуры/влажности.

В результате получается следующее расположение данных в идентичных пакетах длиной 40 bit каждый:

image

В конце пакета, по видимому, передается контрольная сумма, но угадать алгоритм ее вычисления проблематично. Поэтому если принято 3 и более одинаковых пакета из 12, считаем, что принятая информация корректна. По количеству одинаковых пакетов также можно оценить качество приема сигнала — чем больше одинаковых пакетов в посылке, тем лучше.

После того, как с алгоритмом декодирования более-менее разобрались, реализуем его на отладочной плате STM32F429I Discovery. За этим следует период отладки в борьбе за качество приема сигнала.

image

Если сравнить последнюю фотографию с первой, то можно увидеть, что все получилось, мы действительно получили с датчика корректную температуру/влажность. Протокол обмена честно купленного сенсора больше не является загадкой, и сенсор может найти дополнительное применение в самодельных метеостанциях или системах логирования умного дома.

Исходники декодирования протокола сенсора выложены здесь, на деле все немного сложнее, чем описано в публикации.

Результат этой работы может быть полезен владельцам данного сенсора/метеостанции, которые хотят расширить стандартные возможности, например, поставив в соседнюю комнату метеостанцию собственной разработки, при этом не дублируя наружные датчики. Следует заметить, что сенсор — это наиболее трудоемкая для повторения часть, в основном, из-за герметичного корпуса — проще купить готовый, чем делать самому.

P.S. Датчик температуры/влажности является разработкой фирмы TFA Dostmann, поэтому исследование протокола ограничено рамками хобби и полностью исключает какое-либо коммерческое использование.
@emax73
карма
7,0
рейтинг 0,0
Самое читаемое Разработка

Комментарии (9)

  • +1
    А что за программа анализа осциллограмм? Валяется у меня датчик от иной метеостанции, тоже пробовал его разгадать (правда, подключая лог. анализатор напрямую с МК передающей части, минуя радиоканал.), да что-то не вышло.
    • 0
      Сырые тайминги с осциллографа анализировать неудобно, поэтому специально для декодирования этого протокола, писалась утилита, которая берет данные .csv формате, рисует осциллограмму, отделяет синхроимпульсы от данных и выводит принятые пакеты в двоичном виде. На втором этапе декодирование протокола было переписано на STM32F4 Discovery, а утилита на C# свою часть работы выполнила. В качестве 433 MHz приемника использовался китайский модуль от Canton Electronics (-112dBm, 9600 bod)
      • 0
        433,92 МГц, Амплитудная модуляция?
        • 0
          да
  • 0
    Здорово. Этак можно изобрести модуль для работы с различными популярными датчиками и выводить показатели даже на смартфон?
    • 0
      Многие энтузиасты описывают протоколы своих сенсоров. Есть Open Source программы, работающие с большим количеством разных сенсоров, например, pilight. В случае взаимодействия со смартфоном нужен мост, 433 MHz <-> BlueTouch / Wi-Fi, поскольку европейские сенсоры работают в открытом диапазоне 433.92 MHz.
      • 0
        Интересно. Я так понимаю готового решения нет? Нужно собирать что-то на Arduino с приемником на 433 МГц и передатчиком Bluetooth.
  • 0
    Добавьте, пожалуйста, мейкфайл для сборки проекта — так по си исходнику непонятно в какой среде собиралось, возможно еще файл линковщика нужен.

    Планируется ли выкладка проекта на сишарп для разбора файла осциллограм?
    • 0
      Исходники публиковались в виде библиотеки,
      Вначале вызываете функцию tfaInit();
      потом каждые 50 uSec функцию tfaTask();
      Проект примера STMCube STemWin_HelloWord, на базе которого запускалась библиотека, лишний раз в GitHub копировать не хотелось.
      Собиралось в среде Keil, отлаживалось на STM32F429 (плата Discovery).
      Добавил на GitHub немного пояснительной информации.

      Утилита на С# писалась исключительно под эту задачу, и поскольку она не универсальная-красивая-законченная, ее публикация не планируется.
      Если интересует Keil проект для Discovery STM32F429 или C#, пишите в личку, исходниками поделюсь.
      Но в случае с C# придется поработать напильником :).

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.