• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 - должен же он успевать считывать переключения входящего цифрового сигнала с частотой чуть больше одного килогерца?
 
Сверху Снизу