Была метеостанция. Через время базовый блок вышел из строя, а беспроводной датчик продолжает работать, показывая температуру и влажность на своем небольшом дисплее. В базовом блоке имеется небольшая плата (приемник) с антенной, у нее есть три вывода VCC GND DATA. То есть питание + и - и данные которые поступают от датчика. Подав питание на приемник и подключив DATA на вход звуковой платы ПК удалось записать звук, который приходит от датчика. В программе по редактированию аудио удалось увидеть диаграмму сигнала. Фото 1.
Менее чем за 1 сек приходят 3 почти одинаковых сигнала, с небольшой разницей в конце. Один из сигналов увеличен на Фото 2.
Не что иное как набор 0 и 1 . Если представить когда линия вверху это есть импульс, а когда внизу - нет импульса Имеется всего 4 вида импульса:
1. Есть импульс короткий.
2. Есть импульс длинный.
3. Нет импульса короткий.
4. Нет импульса длинный.
Больше вариантов нет. Я предположил что : Есть импульс короткий = 1. Есть импульс длинный = 11 Нет импульса короткий = 0 Нет импульса длинный = 00. В итоге на LPT порт подал сигнал, написал программу которая считывает этот сигнал и превращает его в набор 0 и 1. получилась вот такая строчка 1010110011001101001101010011010101010011001011001010110100101100110101001 Это просто пример, для каждой температуры и влажности своя строка. В строчке меняется небольшая часть, несколько символов примерно в правой части. Левая же часть не меняется. Есть подозрение что там передается номер датчика и номер дома к которому принадлежит датчик, это все выставляется в самом датчике.
Задача: получать сигнал с датчика на ПК, программно его обрабатывать и выводить на экран температуру и влажность которую он показывает.
Что бы выводить на экран температуру и влажность нужно каждому сигналу прописать температуру и влажность которая на датчике в момент отправления сигнала. Сигнал не разделен на температуру и влажность отдельно, нет такого что бы при изменении температуры менялись одни значения, а при изменении влажности, менялись другие. Меняется вся правая часть, даже если меняется лишь только температура или лишь только влажность. Так как датчик работает в диапазоне примерно -30 +50 с шагом 0,1 и влажность меняется от 0 до 100, то вариантов несколько сотен тысяч. Собрать всю базу раками я не в состоянии. Собрал лишь часть. Имеется набор сигналов с влажностью 60% и температурой от 25,7 до 28,8 почти без пропусков. Почти, потому что некоторые значения просто не появляются, к примеру нет значения 28,3 С 60% Есть 28,2 С 60% и сразу 28,4 С 60% Как я не пытался получить 28,3 С 60% такого не появляется, по моему его вообще не существует, оно пропущено, и таких значений много, например часто пропущено xx,9 C 60% Где xx - любая температура заканчивается на, 9 Иногда есть, 9 но чаще нету.
Есть соображения, как по части данных создать бОльшую часть недостающих данных ?
Нужно получить вот такую базу
27,0 С 60 %
1010110011001101001101010011010101010011001011001010110100110011001101001
27,1 С 60 %
1010110011001101001101010011010101010011001011001010110100110100110011001
27,2 С 60 %
1010110011001101001101010011010101010011001011001010110100101100110010101
И так далее. И не от 27 С а от -30 и не только для 60 % а для всех возможных процентов. Получить базу опираясь на некоторую часть известных данных.
В базе и датчике используются бескорпусные МС, так что узнать их названия нет возможности.
Вот фото датчика. Общий вид, Сами термо и влажности элементы. И плата.
В датчике 2 платы, одна над другой и они спаяны 3мя ножками. Я так понял на верхней передатчик, а на нижней стоит с обратной стороны дисплей а под ним бескорпусная МС. Платы вместе спаяны, так что между ними не влезть и не рассмотреть что там еще есть, если только распаять, но пока не хочу паять его.
----------------------------------------------------------
Решение. Возможно кому то пригодится.
Отправился разбираться с манчестерским кодированием и применять к сигналу, обычное кодирование не прошло, использовал Дифференциальное манчестерское кодирование и это как раз то что нужно.
Ранее программа сканировала сигнал и выводила такую строку:
1010110011001101001101010011010101010011001011001010110100110011001101001
выше я расписывал как она получается. Дальше из этой строки получаю двоичный код следующим образом. Берем первые 2 значения, если они разные, значит есть изменение сигнала - это "1", не важно 01 или 10, главное что бы было изменение. Если же значения одинаковые - это "0", так же не важно 00 или 11. В итоге получается следующая строка:
110000010011001111000100110100000010
Теперь остается лишь только выделить где влажность и где температура, на фото ниже.
Влажность - просто из двоичного в десятичное число перевести. Выделено 7 бит, возможное значение от 0 до 127, но последнее значение 96, дальше не растет влажность, а на датчике отображается HI.
Температура (целые значения) - Сначала переводим двоичное в десятичное и получаем значение целых чисел температуры, но это значение больше на 50 градусов от реальное температуры. так что вычитаем 50 - это и есть температура. Так что 00000000 - это температура -50 С (теоретически, не проверял).
Температура (десятые значения) - Тут не понятно, шаг меняется. то 0,05 то 0,1 потому что с шагом 0,05 нужно 20 значений, а есть только 0-15 в 4-х битах. Но так как на экране температура отображает лишь десятые доли, то шаг 0,05 особой роли не играет, та база что собрал, на ее основе построил, где шаг 0,05 а где 0,1 и этого достаточно.
Биты которые не подписал не содержат особо важной информации. вначале где то есть настройки датчика, номер датчика и номер дома. А в конце не знаю, возможно проверка сигнала на ошибки, может и нет, но это уже не важно, то что нужно я получил.