• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос Не получается декодировать данные из 433MHz

NikolayCh

New member
Приветствую!
Хочу декодировать сигнал от метеодатчика Oregon Scientific. Он транслирует данные на частоте 433MHz с модуляцией включением/выключением (OOK) и кодированием манчестерским кодом.
Из железа у меня есть WeMos D1 mini pro и декодер RX-4M50RR30SF. Подключил я декодер по даташиту, завел на вход микроконтроллера, закачал программку небольшую:
Код:
do
  -- use pin 1 as the input pulse width counter
  local pin, pulse1, du, now, trig = 1, 0, 0, tmr.now, gpio.trig
  gpio.mode(pin, gpio.INT)
  local function pin1cb(level)
    local pulse2 = now()
    print(level, pulse2 - pulse1)
    pulse1 = pulse2
    trig(pin, "both")
  end
  trig(pin, "both", pin1cb)
end
Начинаю слушать... В эфире какой-то шум идет бесконечный. Ставлю фильтр помех (для декодера можно пустить одну из ног на землю через резистор) - получаю кое-какие данные. Но вот что с ними делать - ума не приложу. Пример данных под спойлером.
1 828637
0 2115
0 2058
0 2055
0 2057
0 2055
0 2058
0 2055
0 2058
0 2061
0 2051
1 2142
1 2136
1 2070
1 2058
1 2056
0 2059
1 2055
1 2058
0 2056
0 2057
1 2056
1 2058
1 2069
0 2093
1 2066
0 2058
1 2056
0 2058
1 2055
0 2059
0 2055
0 2057
0 2055
0 2058
1 2069
1 2058
1 2057
1 2058
0 2056
1 2058
0 2056
1 2058
0 2056
0 2058
1 2055
1 2058
1 2070
0 2058
0 2055
0 2058
1 2055
0 2059
0 2055
1 2057
1 2056
0 2059
1 2055
1 2058
0 2057
1 2146
1 2139
1 2072
0 2059
0 2058
0 2055
1 2058
0 2056
1 2057
0 2057
1 2057
0 2056
1 2070
1 2090
1 2070
1 2056
0 2059
1 2055
0 2058
0 2056
0 2057
1 2055
1 2059
0 2056
0 2077
0 2055
1 2058
0 2056
1 2057
1 2056
0 2058
0 2055
0 2051
Я так понимаю, что проще всего взять каждую вторую цифру и это будет нужный мне бит? Или я не прав? Ссылки на C-код или ардуино-код давать не надо, у меня используется луа. Лучше подскажите, пожалуйста, с алгоритмом.
 

Arthur

Active member
А у вас есть описание того, что вообще передает на 433MHz? Откуда вы узнали про "кодированием манчестерским кодом"? Есть описание протокола передачи данных?
 

Arthur

Active member
Вы Googleли данный вопрос? Я нагуглил и протокол и готовые прожекты :) других товарищей, по этой теме-то...
Не знаю, будет ли работать, но гуглится вопрос влёт.
Касательно Lua - Вы уверены, что он работает не медленнее C++, плане чтения портов? Разве C++ не более шустрый язык?
В Internet полно примеров на эту тему для C++. Почему бы вам их не взять и не переписать на Lua самим, коли это вам так критично? Или, например, почему бы не взять Lua для ЕСПшки и не скомпилировать его с нужными C++ функциями и звать из уже непосредственно из Lua?
 

pvvx

Активный участник сообщества
Приветствую!
Хочу декодировать сигнал от метеодатчика Oregon Scientific. Он транслирует данные на частоте 433MHz с модуляцией включением/выключением (OOK) и кодированием манчестерским кодом.
Если вам не будут мешать приему по I/O постоянные отработки WiFi с запретами прерываний доходящих до нескольких ms, то прием пином будет работать. Ели нет, то принимайте по I2S c использованием подобия DMA или вход SPI. Потом декодируйте. На lua ничего хорошего не выйдет в связи с особенностями-фичами китайского SDK.
 

NikolayCh

New member
Так... Меня смутило, что примерно такой-же код, на малинке отрабатывал с огромными задержками (там был вывод в дебаг, я естественно решил, что из-за дебага так все тормозит), а здесь - задержек не было. Но, это я сначала так думал, что задержек нет, а потом... потом убрал вывод в порт, задействовал массив в памяти и тайминги совсем другие посыпались - примерно 2000 срабатываний за пару-тройку секунд. На скорую руку проверил ловлю преамбулы - вроде как есть что-то.

Сам протокол Oregon'а, естественно я гуглил, но думал, что я что-то не так делаю с 433, раз там такое количество срабатываний идет в эфире и тайминги слишком большие. Сейчас попробую написать декодинг основного протокола, хотя-бы SYNC-ниббл - ночью с ходу не получилось.

С С++ не очень хотелось связываться, я на нем прогал плотно лет 15 назад, с тех порт - только по мелочам. Мне уж проще тогда на малинку все загнать под C#.
 

pvvx

Активный участник сообщества
А в чем проблемы то?
Код передатчика видно на осциллографе:
при подносе щупа Снимок1119.gif
по точкам (если увеличить и на два канала) Снимок1120.gif
Декодировать 433 MHz нет никаких проблем, после детектора если у вас отдельный MCU. Дискретность сигналов (включения/отключения несущей в 433Mhz) около 1 ms. В много-поточных системах тик переключения задач обычно 1 ms. Т.е. просто-так, считывая i/o нормальной непрерывной последовательности не получить. Аналогично и на ESP8266. Отключайте WiFi и принимайте - тогда исполнение вашей задачи не будет прерываться на периоды более чем требуется для декодирования.
 

NikolayCh

New member
Много времени прошло, я надолго забил на все это. За это время купил USB-анализатор и подсоединил к декодеру (RX-4M50RR30SF) - нашел принимаемый сигнал от датчика Oregona. Теперь понятно, что декодер работает, остается только найти проблему в моем коде... Кто работал с ESP8266 - должен же он успевать считывать переключения входящего цифрового сигнала с частотой чуть больше одного килогерца?
 
Сверху Снизу