Какая кодировка используется в этом сигнале?


19

У меня есть дешевый беспроводной термометр для бассейна (AcuRite 617 1 ), и я хотел бы перехватить данные о температуре на приемнике и использовать их с компьютеризированной системой регистрации данных.

Удобно, что внутри приемника есть небольшая отрывная плата, которая подключена к антенне и имеет цифровые выводы «V», «G», «D» и «SH»:

Плата RF211

Вот сегмент записанных данных с вывода «D» во время передачи (это происходит раз в минуту). Перед этим сегментом есть данные с гораздо более высокой скоростью, но я считаю, что это может быть шум - это начало данных 1,36 кГц / 680 Гц.

Захваченный сигнал с контакта "D"

Я немного погуглил и не могу найти кодировку, которая выглядит примерно так, но если бы я догадался, что происходит, вот что я думаю:

  • первые 4 цикла по 680 Гц предназначены для синхронизации часов, но не содержат данных
  • последующие 13 циклов 1,36 кГц (в 2 раза больше начальной частоты), по-видимому, имеют одну из двух форм: они либо падают низко до середины цикла, либо после него - я предполагаю, что одна форма является логической, а другая - другой. это ноль.
  • после этого, кажется, есть странный разрыв, но если вы сбрасываете со счетов часть минимума, которая является частью предыдущего «1», то оставшийся разрыв составляет 735 мкс, что является (корректно по фазе!) продолжением Преамбула 680 Гц.

Я правильно смотрю на это? Есть ли название для этой кодировки?

Некоторые дополнительные заметки на доске объявлений:

  • плата помечена как «RF211» и выглядит замечательно в соответствии с MICRF211 «3V QwikRadio Receiver общего назначения, который работает на частоте 433,92 МГц» 3
  • Лист данных MICRF211 имеет следующий рисунок (с очень небольшим объяснением), который выглядит мучительно как то, что я вижу, за исключением прямоугольной волны с двойной скоростью передачи данных по сравнению с моим захватом:
    профиль данных

2016-02-14 Обновление: я повторно посетил этот проект и, похоже, получаю чистый 64-битный поток между 4-тактной преамбулой и 1-тактным «постамблем», после чего плата дисплея выключает RF-модуль потянув ^ SH низко (верхняя строка):

64 бита данных

Согласно схеме Micrel "33/66% PWM" (которая больше нигде не появляется в Google), это

-_-_-_-_0000011110011000110000000000000000000000100011101000010010101010-_

Так что теперь я должен начать манипулировать температурой, чтобы декодировать биты. Здесь («x») биты, которые, кажется, изменяются без каких-либо видимых изменений на дисплее:

0000011110011000110000000000000000000000100011101000010010101010
------------------------------------------------x----xxxx----xxx

Я предполагаю, что это либо младшие значащие биты, либо уровень заряда батареи (который отображается как «Низкий», когда он значительно падает).

2016-02-15 Обновление: я беру шоу в дороге, чтобы дать новому стеку "Reverse Engineering" обмен трещиной при определении значения: /reverseengineering/12048/what-is-contained -в-это-передача ВЧ-бассейн-датчик температура основание блок-ре


Кстати, чтение комментариев пользователей на веб-сайте Home Depot для устройства AcuRite 617 не дает хорошего ощущения от общей долговечности этого продукта. На самом деле это звучит так, как будто это внешняя позиция в отношении отсутствия утечки в отправляющее устройство.
Майкл Карас

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

Пролистал другие ответы, но это по внешнему виду. Начальная прямоугольная волна - синхронизировать слайсер данных на уровне 50%. Сделайте паузу перед данными, чтобы убедиться, что уровень «1» уменьшился. Тогда 2: 1mk-spc = 1 скажем и 1: 2 = 0. При гистерезисе 50:50 не происходит переключения между предыдущими 1 или 0, НО не должно происходить во время потока данных. Предыдущее является «плохим», поскольку оно не пытается сохранить среднее соотношение 50:50, и ваш уровень постоянного тока будет дрейфовать, если у данных больше 1 или 0, но если ваша постоянная времени уровня постоянного тока длинна по сравнению с длиной сообщения, это не так иметь значение. Затем вы выполните повторную синхронизацию с преамбулой 1: 1 для следующего сообщения.
Рассел МакМэхон

Декодер может быть операционным усилителем с одним входным сигналом, подаваемым RC-фильтром, для установки среднего уровня постоянного тока и другим сигналом, подаваемым через резистор плюс + ve с обратной связью гистерезиса (возможно, около 4R), так что сигнал 1: 1 не переворачивает выходной сигнал, а 2 : 1 или 1: 2 делает. Немного поигрался с гистерезисом% и постоянной времени RC RC, и это должно работать достаточно хорошо.
Рассел МакМэхон

Несколько гранул карбида кальция или металлического кальция в нижней части корпуса должны сохранять его сухим и слегка под давлением :-). Нет, я никогда не пробовал это.
Рассел МакМэхон

Ответы:


8

Микрель называет это схемой ШИМ 33/66%. Похоже, это довольно простой, но специальный протокол.

ШИМ означает широтно-импульсную модуляцию. Существует страница Википедии, которая более детально описана, но вкратце, PWM - это место, где вы сохраняете фиксированный период, поэтому здесь время от переднего фронта до следующего переднего фронта, но вы меняете процент времени, проведенного в максимуме. состояние путем изменения, когда происходит падение фронта. Для этого вы можете видеть, что он равен 33% для «1» и 66% для «0».

Начальные серии импульсов равны высоким и низким временам. Обычно это делается для того, чтобы приемник мог синхронизироваться до получения фактических данных.

См. Http://www.micrel.com/_PDF/App-Notes/an-22.pdf для получения дополнительной информации о том, что они ожидают от модуля.

Типичный способ получить кодирование такого рода - ввести его в вывод захвата таймера микроконтроллера. Или вы можете просто подключиться к общему входу и получить его в 4-5 раз больше периода ШИМ. Алгоритм декодирования не так уж сложен.

В качестве альтернативы, как предлагает Markt, вы можете вернуться обратно к самому датчику температуры. Но, если это аналоговый выходной сигнал, вам придется самостоятельно преобразовать его в цифровой, и при регистрации в нем могут немного отличаться номера от исходного выхода.


3

Люди моего знакомого обычно называют эту технику кодирования "ШИМ", что, я думаю, является разумным описанием.

Моя первая мысль, глядя на ваш поток данных и предполагая, что вы правильно угадываете полярность битов, заключается в том, что это 12-разрядное чтение АЦП, сначала LSB, с начальным «1» в качестве начального бита. Сначала я расскажу о LSB, потому что начало следующего чтения, по-видимому, показывает однобитное отклонение, и маловероятно, что показание АЦП (пула) температуры будет изменяться на 2 или 3 MSB за такой короткий промежуток времени.

Я бы немного углубился в систему, вернувшись к тому, что генерирует данные (в отличие от передачи), посмотрю, можно ли определить датчик температуры, и поищу некоторую корреляцию между передаваемыми данными и температурой.


Мне кажется, что @RobStarling уже должен знать, какая переданная температура, благодаря тому, что он смотрит на приемное устройство и видит то, что отображается.
Майкл Карас

1
правда, но эти вещи могут быть хитрыми. например, дисплей переключается между ˚F / ˚C, поэтому передача может быть в абсолютных значениях ˚C или ˚F или относительно некоторого странного смещения или с некоторой произвольной точностью фиксированной точки. Кроме того, есть 3 переключаемых идентификатора станции («A», «B», «C»), и хотя он говорит, что изменение идентификатора может помочь приему, у меня есть догадка, это просто идентификационный префикс в сообщениях - я переключу это и посмотрим, что изменится на данных.
Роб Старлинг

@RobStarling - Вы можете открыть блок отправителя, чтобы увидеть, использует ли он датчик температуры простого типа, такой как LM75 или один из других распространенных типов I2C. Если это так, вполне вероятно, что данные, передаваемые по ссылке в качестве значения температуры, просто следуют данным, считанным с устройства датчика температуры. С другой стороны, если отправитель использует аналоговый датчик, такой как диод или BJT-транзистор, в качестве датчика, было бы более сложно определить фактические отправленные данные.
Майкл Карас

Я подозреваю, что наилучший шанс выяснить содержание данных - это поместить отправителя в контролируемую ситуацию, в которой вы можете медленно изменять температуру, чтобы вы могли видеть, как показания изменяются постепенно. У вас будет дисплей приемника, чтобы сказать вам, что на самом деле ожидается.
Майкл Карас

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

2

Почти все схемы радиочастотной передачи должны иметь несколько характеристик в своих протоколах кодирования данных. Это будет включать:

  1. Преамбула согласованного формата используется для блокировки приемника на частоте
  2. Индикатор импульса синхронизации, чтобы отметить начало, если индикация кадра
  3. Метод для кодирования данных 1 и 0 с некоторой кодированной синхронизацией для восстановления данных.

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

Кодирование данных, по-видимому, соответствует тому, что я видел, называемому кодированием ширины импульса. Это довольно распространенный метод, при котором одно направление перехода следует за постоянной частотой, что приводит к постоянным значениям битовых ячеек постоянной ширины. Во время битовой ячейки активный импульс представляется как 25% времени битовой ячейки или 75% времени битовой ячейки. Эта схема не является схемой сбалансированного кодирования постоянного тока, подобного манчестерскому кодированию. Это обычная технология с кодированием ширины импульса для обеспечения баланса постоянного тока в протоколе сообщения путем отправки дополнительных битов для создания общего баланса во всем сообщении. В простейшем виде данные отправляются дважды, а вторая копия логически инвертируется.

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

Редактировать:

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


мне интересно, если это: преамбула (квадрат) + стартовый бит (1) + уникальный идентификатор (12 бит) + синхроимпульс + данные. (о, как вы и предлагали ... например, возможно, он ожидает, что микроконтроллер подготовится к данным во время импульса синхронизации)
Роб Старлинг

2

Я начал декодировать Acurite 617 и вот мои первые наблюдения. Я могу сказать вам, что последний байт - это своего рода «проверочный» байт, а следующие три последних байта содержат температуру. Эти байты также отправляются с использованием 7-го бита для выравнивания четности, и используется только нижняя часть каждого байта. Я написал программу Arduino для сбора данных и видел следующие сообщения / температуру.

40 ce c0 00 00 0c 03 be
(00 0C 03) => 0C3 => 67F

40 ce c0 00 00 0c 84 39
(00 0C 04) => 0C4 => 67F

40 ce c0 00 00 0c 05 b8
(00 0C 05) => 0C5 => 67F

Другие данные / температуры, которые я видел:

E2 => 73F

F5 => 76F

108 => 80F (81 00 88)

109 => 80F

Используя это, вы должны быть в состоянии сделать «прямую линию» (предположение) преобразования.

Поскольку у меня нет хорошего объема (и тот факт, что данные отправляются раз в минуту), я не уверен в моем времени. Я вижу синхронизацию HI и LO как 720 мксек, а биты данных 240 и 480 мксек.

Надеюсь, у меня будет больше информации позже. У меня есть куча таких. Как только они начинают протекать, я вынимаю их из бассейна и высушиваю для использования по дому. Более поздние 617 модулей (с нижним винтом и уплотнительным кольцом), кажется, работают дольше.


Я сделал еще немного расшифровки. Последний байт (контрольный байт) делает XOR всех восьми байтов равным 0FFH. Например, для "40 CE C0 00 00 8D 0C 30", 40 xor CE xor C0 xor 00 xor 00 xor 00 xor 8D xor 0C xor 30 равно 0FF.

Кроме того, я снизил температуру до 34F, и счет составил 10 десятичных знаков (т.е. 00 00 0A), а при 80F счет был 264 десятичных знаков (т.е. 81 00 88 или 108H).

Из этого я использую Temp (F) = 0,1811 * Количество + 32,1889. Я мог бы получить больший промежуток, чтобы получить лучшие данные, если я увижу какую-либо ошибку.

Глядя на строку Роба Старлинга на 2016-02-14:

00000111/10011000/11000000/00000000/00000000/10001110/10000100/10101010 07 98 C0 00 00 8E 84 AA

XOR = FF

Количество = 0E4 или 228

Temp = 73,5F


Спасибо ребята!!! я почти уверен, что число - это не просто «счет», а точная температура в 0.1C, то есть «математика» для декодирования в 228том, что это так 22.8C. Для Фаренгейта, делай как обычно F=C*9/5+32.
Роб Старлинг

подведены итоги работы на Reverse Engineering SE: reverseengineering.stackexchange.com/a/13593/15076
Роб Старлинг

1
Роб, ты прав - я должен это видеть. F = 0,18 * Количество + 32,0. Хорошо, что вы указали на это, я скоро собирался положить его в настоящую горячую воду, чтобы получить лучшие "m" и "x", используя более широкий диапазон.
Кен С

Возможно, вы все же захотите выполнить калибровку, чтобы получить более точные цифры, так как несколько обозревателей жаловались на то, что дисплей отключен на пару градусов. Это, однако, может также просто отражать тот факт, что он находится всего на ≈4 "ниже поверхности, и большинство термометров для бассейна старой школы находятся на длинной струне.
Роб Старлинг

Обновление: я написал библиотеку Arduino - github.com/robstarling/ArduRight - дайте мне знать, если она работает для вас! У него есть пример и все. Ссылаясь на картинку в этом посте, вам нужно припаять провода к контактам "SH", "D" и "G". Для запуска примера эскиза подключите эти провода к контактам 2, 7 и GND соответственно.
Роб Старлинг
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.