Не так давно 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, поэтому исследование протокола ограничено рамками хобби и полностью исключает какое-либо коммерческое использование.

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


  1. serafims
    22.01.2016 10:38
    +1

    А что за программа анализа осциллограмм? Валяется у меня датчик от иной метеостанции, тоже пробовал его разгадать (правда, подключая лог. анализатор напрямую с МК передающей части, минуя радиоканал.), да что-то не вышло.


    1. emax73
      22.01.2016 21:19

      Сырые тайминги с осциллографа анализировать неудобно, поэтому специально для декодирования этого протокола, писалась утилита, которая берет данные .csv формате, рисует осциллограмму, отделяет синхроимпульсы от данных и выводит принятые пакеты в двоичном виде. На втором этапе декодирование протокола было переписано на STM32F4 Discovery, а утилита на C# свою часть работы выполнила. В качестве 433 MHz приемника использовался китайский модуль от Canton Electronics (-112dBm, 9600 bod)


      1. iDoka
        22.01.2016 22:21

        433,92 МГц, Амплитудная модуляция?


        1. emax73
          22.01.2016 22:26

          да


  1. Kichnap
    22.01.2016 10:53

    Здорово. Этак можно изобрести модуль для работы с различными популярными датчиками и выводить показатели даже на смартфон?


    1. emax73
      22.01.2016 21:25

      Многие энтузиасты описывают протоколы своих сенсоров. Есть Open Source программы, работающие с большим количеством разных сенсоров, например, pilight. В случае взаимодействия со смартфоном нужен мост, 433 MHz <-> BlueTouch / Wi-Fi, поскольку европейские сенсоры работают в открытом диапазоне 433.92 MHz.


      1. Kichnap
        22.01.2016 21:36

        Интересно. Я так понимаю готового решения нет? Нужно собирать что-то на Arduino с приемником на 433 МГц и передатчиком Bluetooth.


  1. iDoka
    22.01.2016 14:56

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

    Планируется ли выкладка проекта на сишарп для разбора файла осциллограм?


    1. emax73
      22.01.2016 21:40

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

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