Previous Entry Share Next Entry
Oregon погодные датчики, и Arduino их всех!... )
snickser
Естественно все уже умеют принимать показания датчиков метеостанций Oregon на свои Ардуины с помощью 433МГц приёмника, но не все догадываются насколько код этого самого приёмника прост и шикарен. Человек который его написал - мастер своего дела, я считаю. Код прост до безобразия и так же красив и непонятен для неофитов Ардуины, что я не могу просто так промолчать пока не расскажу как он работает.

Дело было так.... ) Была была тёмная тёмная ночь...
ой, это из дугой сказки... Жили были три статуса,
и первый из них ждал одинаковых сигналов, а другой крутился пока третий искал себе подобных.
Это если сильно упрощённо =)

Вот там этот самый код http://arduino.ru/forum/proekty/chtenie-i-emulyatsiya-datchikov-oregon-scientific-433mhz

Но оставим лирику, он настолько быстр - насколько возможно, занимает памяти так мало - как вообще получается, и при этом работает совершенно по сценарию.

Основная загвоздка к пониманию этого кода - он модульный, в смысле приспособлен к множеству кодеков, из-за этого лично у меня и возникло ложное чувство его сложности, но на самом деле всё просто и понятно.
Если отбросить всю шелуху, в основе там всего три состояния - "UNKNOWN", "T0", и "OK".
UNKNOWN - для всех пакетов из эфира которые мы не понимаем.
T0 - начальное состояние после начала правильной последовательности.
OK - всё хорошо, продолжаем приём...
Вся основная работа происходит внутри циклов T0 и OK.

Так вот, код ищет в эфире начальную последовательность одинаковых длинных пульсаций.
Пульсация - это то самое что делает функция висящая на прерыванию радио-приёмника. Функция просто вычисляет время между двумя сменами состояния входа. Нам не надо знать в каком именно состоянии был вход, достаточно времени, короткий или длинный был промежуток.
Выглядит это примерно вот так (синий - длинный, зелёный - короткий):

IMAGE001.JPG

После нахождения начальной последовательности переходит в состояние запоминания сигнала и перевода его в числовую форму в циклах T0 и ОК. Собирает из кодировки Manchester полученные биты в байты. В самом конце из передатчика идёт длинный пилот-тон, который прерывает циклы и завершает работу алгоритма.
Получаемые пульсации обрабатываются в теле loop() с максимально возможной скорость, потому как если пропустить хоть одну - будет сбой. Именно поэтому совмещая этот код с другим функционалом нужно быть готовым, что не каждая передача будет принята успешно.

Упрощая, код состоит из трёх циклов - поиск начала, запоминание тела, получение конца передачи.

Вроде всё элементарно, но именно в простоте кроется недостаток этого алгоритма. Он не имеет помехозащиты, сбой в начале передачи или в самом конце может прервать накопление информации. Потому лично я рекомендую снизить кол-во детектируемых первых пульсов пилот-тона (переменная flip) до 5-7, а не как 32 в оригинале. А последний вообще игнорировать как только - так сразу.

        }
         else if ( (width <= 200 || width >= 1200) && pos >= 8)
         {


[ookDecoder]
----------||-||-||-||---||-----||-||-||---||-||-||---------------||-||-||-||-||-||-||-||---------------||---||---||-||-----||-||-----------||-----||---||-||---------||---||-||-||-||---||---||-||---||-----||-||-#
OSV2 1A2D40156022708235B9 4.829 3 15 22.6 27% 0
----------||-||-||-||---||-----||-||-||---||-||-||---------------||-||-||-||-||-||-||-||---------------||---||---||-||-----||-||-----------||-----||---||-||---------||---||-||-||-||---||---||-||---||-----||-||-#
OSV2 1A2D40156022708235B9 0.377 3 15 22.6 27% 0








?

Log in