У вас большие запросы!
Точнее, от вашего браузера их поступает слишком много, и сервер VK забил тревогу.
Эта страница была загружена по HTTP, вместо безопасного HTTPS, а значит телепортации обратно не будет.
Обратитесь в поддержку сервиса.
Вы отключили сохранение Cookies, а они нужны, чтобы решить проблему.
Почему-то страница не получила всех данных, а без них она не работает.
Обратитесь в поддержку сервиса.
Вы вернётесь на предыдущую страницу через 5 секунд.
Вернуться назад
У вас большие запросы!
Точнее, от вашего браузера их поступает слишком много, и сервер VK забил тревогу.
Эта страница была загружена по HTTP, вместо безопасного HTTPS, а значит телепортации обратно не будет.
Обратитесь в поддержку сервиса.
Вы отключили сохранение Cookies, а они нужны, чтобы решить проблему.
Почему-то страница не получила всех данных, а без них она не работает.
Обратитесь в поддержку сервиса.
Вы вернётесь на предыдущую страницу через 5 секунд.
Вернуться назад
Практика радиосвязи, как она есть
Все мы ежедневно сталкиваемся с разными видами радиосвязи и беспроводной передачи данных. Да что там сталкиваемся: мы практически пронизаны радиоволнами разной частоты, модуляции и напряженности (за исключением, разве что, случая, если не находимся внутри «клетки Фарадея»). Здесь, на хабре, в силу ИТ-направленности, очень много статей о видах связи и передачи данных, о разнообразных телекомах, о магистралях и «последних милях», да и еще много о чем, что имеет прямое или косвенное отношение к связи, как к проводной, так и к беспроводной.
Так же, наверняка, практически всем хабравчанам в школах, на уроках физики, рассказывали о колебательных контурах, распространении и длине волн, и прочих процессах, лежащих в основах любой технологии радио- и беспроводной связи.
Однако, поискав по хабру, я так и не нашел ни одной статьи, в которой рассказывалось бы о радиосвязи, с бытовой и любительской точки зрения. А ведь если подойти к радиосвязи именно с таким, бытовым взглядом – для одних она может стать удобным, а порой и незаменимым помощником во многих делах, а для других – перерасти в интересное увлечение или хобби. Именно с такими намерениями я хочу сегодня попытаться просто и доступно рассказать о радиосвязи, о том, как она есть в жизни, о том, с чем сам имел место столкнуться и познать.
Совсем немного теории в свободном изложении
Для начала – диапазоны. Рассмотрим диапазоны радиоволн и выберем те, которые нас будут интересовать с практической точки зрения. Википедия приводит ГОСТ, в котором радиоволны делятся на следующие диапазоны, на основании длины волны:
— 3 кГц – 30 кГц – Сверхдлинные волны.
— 30 кГц – 300 кГц – Длинные волны.
— 300 кГц – 3 МГц – Средние волны.
— 3 МГц – 30 МГц – Короткие волны.
— 30 МГц – 300 МГц – Метровые волны.
— 300 МГц – 3 ГГц – Дециметровые волны.
— 3 ГГц – 300 ГГц – Сантиметровые волны.
Определение длины волны можно прочесть в википедии, а я лишь напишу простой и понятный тезис – чем короче длина волны – тем менее она подвержена помехам и затуханиям, проникающая способность увеличивается, огибающая способность уменьшается. То есть если длина волны 11 метров (27 МГц) – то эта волна запросто огибает плотные скопления деревьев в лесу и находит путь для распространения, но при этом для увеличения дальности связи на открытом пространстве – требуется увеличение мощности передатчика. А волна, длиной, например 70 см (433 МГц), практически не будет огибать деревьев, а будет распространяться исключительно за счет просветов между деревьями, своей проникающей способности и возможности переотражения. Однако, за счет своей помехоустойчивости и малого затухания, на открытом пространстве дальность связи будет ограничена лишь зоной прямой видимости, при низкой мощности передатчика.
Стоит, правда, добавить сюда небольшую оговорку: на диапазонах коротких волн наблюдаются эффекты прохождения радиоволн, за счет многократных отражений от атмосферы Земли, и порой получаются ситуации, когда можно абсолютно спокойно установить связь с корреспондентом, находящимся за многие тысячи километров, а товарища, находящегося в паре километров – не услышать вовсе. Но, это явление тесно связано с природными факторами, непостоянно и мало прогнозируемо, поэтому, для бытового использования этот эффект использовать крайне ненадежно.
Скажу сразу: мы немного коснемся коротких волн, и плотно рассмотрим метровые и дециметровые волны. Остальные мы отбросим в силу усложнения аппаратуры, антенного хозяйства, трудностей использования, да и просто неудобства в быту. Кто-то со мной поспорит, что во многих случаях только сантиметровые волны приемлемы для передачи данных, кто-то скажет, что только короткие волны хорошо подходят для связи на большие расстояния, и эти люди будут правы. Но сейчас мы рассматриваем самые простые и доступные виды, с точки зрения простого обывателя.
Плавно переходим к конкретике
В силу рассмотренных выше теоретических знаний подведем промежуточный итог: нам интересны диапазоны дециметровых, метровых и небольшая часть диапазона коротких радиоволн. Кратко, тезисами, о выбранных диапазонах:
– Короткие волны: 3 МГц – 30 МГц. В данном диапазоне работают как профессиональные радиолюбители (начало диапазона, от 3 МГц), использующие дорогую аппаратуру, огромные антенны, имеющие профессиональные навыки и знания, так и серьезные структуры, которым требуется связь на сверхдальних расстояниях, например арктические экспедиции. В конце данного диапазона выделены частоты для бытового и гражданского использования
– CB 27 МГц. Здесь длина волны достигает 11 метров (эффективная антенна имеет физическую длину, равную ¼ длины радиоволны, то есть примерно 2,7 метра). Наверняка, многие из вас видели автомобили такси, на крыше которых красовался длинный хлыстик – это и есть антенна на данный диапазон. В девяностые многие таксомотрные фирмы и люди, занимающиеся частным извозом, облюбовали этот диапазон, ввиду относительной доступности и приемлемой цене оборудования, а так же отсутствию необходимости получать статус радиолюбителя для использования данных частот. Для использования в городе – не самый лучший выбор, мы ведь помним, что этот диапазон крайне подвержен помехам, которых в городе крайне много от массы электрических устройств и линий электропередач.
– Метровые волны: 30 МГц – 300 МГц. Данный диапазон делится на несколько поддиапазонов, в том числе LowBand (30-50 МГц, использовался в советские времена практически повсеместно для коммунальных служб, служб скорой помощи и прочее, в районах используется и по сей день) и так называемый диапазон «2 метра» (136-174 МГц), который так назван за свою длину волны. В диапазоне «2 метра» работают городские и федеральные службы, такие как пожарная охрана, МЧС и другие. Имеются и свободные частоты, которые выдаются на коммерческой основе организациям и предприятиям. В моем городе в этом диапазоне работает одна из фирм-такси, очень довольны качеством связи, по сравнению с CB (27 МГц), который используется остальными таксомоторными парками, как бесплатный. Так же в диапазоне «2 метра» имеется небольшой кусочек, выделенный для радиолюбителей (144-146 МГц). Эти частоты может легально использовать любой человек, получивший радиолюбительскую категорию и позывной сигнал, придерживаясь регламента любительской связи. Используя направленные антенны с высокой точкой установки даже с небольшой излучаемой мощностью можно устанавливать связи на десятки, а в удачных условиях и на сотни километров. Так же стоит упомянуть авиадиапазон (118-136 МГц), здесь все серьезно, большая ответственность и надежная связь.
– Дециметровые волны: 300 – 3000 МГц. В данном диапазоне работает много разнообразных радиостанций и аппаратуры связи, мы рассмотрим лишь интересную для нас часть диапазона, а именно 400-470 МГц, получивший за счет своей длины волны название «70 сантиметров». За счет оптимальных характеристик для использования в условиях большого индустриального города (хорошая помехозащищенность, дальнее распространение в условиях радиовидимости при небольшой мощности), многие крупные службы в крупных городах переходят или перешли на данный диапазон частот. Здесь уже не обойтись без использования «репитеров» — специальных приемо-передатчиков сигнала, устанавливаемых в самых высоких точках, имеющих качественные и чувствительные антенны, и соответственно способные принимать и передавать сигнал на большие расстояния (не забываем: при наличии прямой радиовидимости для данных частот сигнал распространяется далеко и без затуханий, даже при небольшой мощности). Но репитеры – это отдельный разговор, я бы не хотел их касаться в сегодняшней статье, потому как это очень интересная тема, и ее стоит описывать отдельно.
Мы подошли к самой интересной части статьи: в диапазоне «70 сантиметров» находятся выделенные полосы частот, как для официальных радиолюбителей, так и для свободного использования всеми желающими (на некоммерческой основе). Для радиолюбителей отведены частоты 430-440 МГц, для бытового использования выделены 433.075 МГц – 434.775 МГц (сетка из 69 каналов с шагом 25 кГц, LPD) и 446.00625 – 446.09375 МГц сетка из 8 каналов с шагом 12.5 кГц, PMR). Именно с комплекта простеньких радиостанций, купленного в одном из магазинов сотовой связи и началось мое более близкое знакомство, поэтому и рассмотрим стандарты LPD и PMR.
Бытовая связь
LPD – расшифровывается как Low Power Device, то есть «устройства с низкой мощностью излучения». Именно так и есть – по стандарту, мощность излучаемая передатчиком радиостанции стандарта LPD не должна превышать 10 мВт, что крайне мало, хотя даже этого достаточно для связи на расстоянии до нескольких километров, в условиях прямой видимости. По факту же, большинство полу-игрушечных комплектов радиостанций, находящихся в продаже, имеют значительно большую мощность, хоть и сертифицированы, как LPD. Как говорится «строгость наших законов компенсируется необязательностью их исполнения», чем и пользуются поставщики при сертификации: у радиостанций выставляется низкий уровень мощности через меню, товар проходит сертификацию, а потом, точно так же через стандартное меню – возвращается обычная мощность, как правило, это 2-4 Ватта. Этой мощности достаточно для связи на 10-12 километров в хороших условиях, например над озером, или с возвышенности (не забываем о плохой огибаемости препятствий при данной длине волны).
PMR – расшифровывается как Private Mobile Radio, то есть радиосвязь для частного пользования. По стандарту разрешенная мощность излучения здесь уже больше, чем у LPD, а именно 0.5 Ватта. Однако, в отличии от LPD эта мощность как правило и является честной, редкая радиостанция PMR имеет мощность более 1 Ватта, так как этот стандарт разрешен во многих странах Европы, и сертификация там проходит более серьезно. Так же, диапазон частот PMR более узкий, и в нем «помещаются» всего лишь 8 каналов (против 69 каналов у LPD).
Именно с этих стандартов (а точнее – с комплекта простейших радиостанций из магазина сотовой связи) началось мое более плотное знакомство с радиосвязью. Но в скором времени наступило разочарование от довольно низкого качества устройств, это были скорее «игрушки», нежели что-то относительно серьезное. Однако радиосвязь меня заинтересовала, и я заказал из одного, небезизвестного в кругах радиолюбителей магазина, неплохую портативную радиостанцию, уже любительского уровня, в которой имелось сразу два диапазона, а именно «2 метра» (136-174 МГц) и «70 сантиметров» (400-470 МГц). По моей скромной оценке – в настоящее время это самые популярные и доступные широкому кругу пользователей диапазоны. Аппаратура относительно доступная (особенно китайская, цена низкая, качество высокое), имеющая серьезный функционал, и обладающая приятным внешним видом. Так же не могу не заметить, что на указанных диапазонах антенна действительно может быть портативной (в отличии, например от CB, вспоминаем длину волны).
За полгода пользования радиостанцией мне успело надоесть общаться только на «гражданских частотах» (LPD и PMR, все каналы этих двух сеток легко настраиваются в диапазоне «70 сантиметров»), было принято решение о получении радиолюбительского категории, позывного сигнала, регистрации радиостанции. Сейчас я официальный радиолюбитель, это стало моим хобби. Технологии не стоят на месте, и с помощью карманной портативной радиостанции могу проводить связи дальностью в несколько тысяч километров (через искусственные спутники Земли), общаться с экипажем МКС, другими радиолюбителями (на выделенных для этого частотах).
Ну и конечно же – это удобно и легко! Моя семья оснащена простыми, небольшими (менее мобильного телефона), недорогими китайскими радиостанциями, которые прошиты на свободные каналы LPD диапазона, и в зависимости от того, едем ли мы в лес за грибами, или в магазин за покупками – мы всегда на связи.
В планах – создание единого общегородского информационного канала связи для автовладельцев, туристов, и просто жителей города, который будет доступен даже людям с недорогими комплектами радиостанций из салонов сотовой связи. Но это отдельный разговор, там целая концепция.
Благодарю за внимание!
P.S. Статья изложена в свободной форме и с использованием упрощений в некоторых понятиях и деталях. На энциклопедическую точность не претендует.
Еще раз о передатчиках и приемниках 433 МГц
Простейший комплект из приемника и передатчика ISM-диапазона 433 МГц завоевал заслуженную популярность в среде любителей электроники. Комплекты дешевы (даже в «Чипе-Дипе» их можно купить рублей за 300, а на Ali, говорят, вообще за полтинник), просты и надежны. Кроме того (о чем вы, возможно, не подозреваете), это самый дальнодействующий и проникающий способ беспроводного обмена данными — сигнал на частоте 433 МГц куда лучше проходит через препятствия и действует на более далеком расстоянии, чем в популярном диапазоне 2,4 ГГц (433 МГц полностью задерживаются стенкой в полметра бетона, а Wi-Fi умирает уже на 10 сантиметрах). Допускаю, что недавно появившиеся модули MBee-868, будучи снабженными соответствующей (направленной) антенной, «стреляют» дальше, но они как минимум на порядок дороже, сложнее в подключении, требуют управления энергосбережением и предварительной настройки. И вдобавок частота 868 МГц вдвое хуже проходит через препятствия (хотя, конечно, несравненно лучше частоты 2,4 ГГц).
О приемниках-передатчиках 433 МГц написано очень много (в том числе и на хабре, конечно). Однако, правильно включать в схему этот комплект по какой-то странной причине, кажется, не умеет никто. Когда я в который раз прочел вот тут, что комплект «принимал на 8-ми метрах в пределах прямой видимости, 9-ый метр осилить не удалось», мое терпение лопнуло. Какие еще 8 метров?! В 40-50 я бы поверил, хотя в реальности, наверное, дальность еще больше.
Стоит заметить, что я далее решаю задачу создания линии для передачи произвольных данных, а не просто управления какими-нибудь умными розетками или мотором модели катера. Моя задача сложнее, но все-таки расстояние надежной работы у меня оказывается гораздо больше. Причем в такой задаче важно не только и не столько расстояние в пределах прямой видимости (оно может служить только для сравнения), сколько способность проникать через различные препятствия.
У меня такой комплект работает за городом на расстоянии примерно 25-30 метров под острым углом к бревенчатой стенке, так, что на пути сигнала оказывается примерно метр (в сумме) стен и перегородок, причем частично экранированных фольгированным утеплителем. На гораздо меньшем расстоянии, почти прямо за стенкой, WiFi уже полностью теряет сигнал. В городе сигнал добивает от одного конца трехкомнатной городской квартиры к другому через две межкомнатные перегородки, а также с балкона, где по прямой линии между передатчиком и приемником не менее 80 сантиметров кирпичной кладки и гипсолитовая перегородка. Никаких более дорогих вариантов комплектов, упомянутых в приведенном обзоре, я не употреблял.
Дополнительный плюс комплекта в том, что в паузах передатчик не потребляет ничего, причем без всяких специальных режимов Sleep, просто по принципу своего устройства (ток потребления в покое сравним с токами коллекторной утечки запертого транзистора, то есть порядка 100 нА).
Давайте разберемся, в чем тут подводные камни.
Подключение передатчика
Передатчик (он носит название FS1000A), как мы видим из его схемы ниже, представляет собой простейший генератор на основе ПАВ-резонатора на 433 МГц. Генератор собран на транзисторе Q1, а транзистор Q2, на базу которого подаются цифровые данные — просто ключ, который подключает генератор к питанию (к шине GND) при наличии высокого уровня (логической единицы) на входе. Питание может быть от 5 до 12 вольт, причем, по утверждению производителей, чем выше питание, тем дальше работает связь.
Принципиальных преимуществ увеличенного питания в рамках своей задачи я не заметил. Тем не менее, не следует пренебрегать фактом, что особых требований к питанию тут не предъявляется, и при повышенном напряжении девайс будет работать только лучше. Удобно подключать передатчик непосредственно к напряжению с адаптера 9-12 вольт, аккумулятора или комплекта из 6 батареек (контакт Vin Arduino). При нестабилизированном питании, которое может превышать 12 вольт (как, например, у аккумуляторов) я обычно развязываю передатчик от основной схемы отдельным 9-вольтовым стабилизатором (можно простейшим 78L09), причем разницы в работе между питанием 9 и 12 вольт я не наблюдаю никакой. У Uno или Nano можно для питания самого контроллера и остальных схем (например, датчиков) при этом использовать встроенный стабилизатор 5 вольт, а для Mini (особенно — его дешевых клонов) я бы посоветовал поставить отдельный 5-вольтовый стабилизатор, подключив его к выводу 5V.
Следует отметить, что в последнее время стали появляться передатчики, выглядящие несколько нестандартно (см. рис. ниже). Оказалось, что отсутствие дросселя L1 (трехвиткового), от которого остались только отверстия — фикция, он просто заменен на соответствующий SMD-компонент. Хуже в этом варианте другое: неряшливая полиграфия может ввести в заблуждение относительно подключения выводов данных и питания. Правильное подключение показано на рисунке, оно для всех вариантов одинаково:
Самое поразительное в этом деле — то, что при перепутанном подключении данных и питания передатчик на небольших расстояниях продолжает работать! Если вы рассмотрите схему, то поймете в чем дело: база Q2 через резистор при этом оказывается подключенной к питанию, транзистор всегда открыт, и влияния на работу схемы не оказывает. А логический высокий уровень на шине питания просто запитывает в нужный момент генератор. Несуразности начинаются на некотором расстоянии — понятно, что из логического вывода источник питания получается плохой.
Подключение приемника
При приобретении приемника (он может носить название вроде MX-RM-5V или XD-RF-5V) обращайте внимание на длину выводов — мне как-то попалась целая партия с укороченными штырьками, отчего из стандартного разъема PBS приемник вываливался при малейшем перекосе и его приходилось к плате специально крепить.
У приемника схема гораздо сложнее (я ее не буду воспроизводить, но можете ознакомиться, например, тут). Она должна принять и усилить высокочастотный сигнал, отфильтровать частоту 433 МГц, выделить всплески и преобразовать их в логические уровни. Приемник имеет подстроечный дроссель (посередине платы), но без точных приборов для измерения амплитудно-частотной характеристики я его крутить не советую — скорее всего, вы ничего не улучшите, а только испортите.
Так как уже на небольшом расстоянии сигнал будет гораздо меньше помехи, понятно, что мы с помехами должны бороться по всем фронтам: и схемотехническими и программными методами. Последнее за нас делают библиотеки, но какая бы математика не применялась в программной обработке, желательно сначала сделать все для того, чтобы логическая единица на выходе появлялась только при всплеске полезного сигнала и не появлялась при наличии помехи. Иными словами, классно было бы от помех при приеме отстроиться заранее по максимуму.
Стандартный метод снижения помех, известный в мои времена каждому школьнику, собравшему хоть один радиоприемник или усилитель, заключается в том, что для чувствительных к помехам узлов необходимо делать отдельное питание, по максимуму изолированное от остальных схем. Можно его делать разными методами: когда-то ставили отдельный стабилитрон, сейчас часто изолируют питание проблемного узла LC-фильтром (так рекомендуется поступать, например, для АЦП, посмотрите даташиты на AVR-контроллеры). Но в наших условиях, когда современные компоненты невелики и дешевы, проще просто поставить на приемник отдельный от всего остального стабилизатор.
Стабилизатор, например, типа LP2950-5.0 плюс два необходимых конденсатора к нему в самом дешевом варианте (когда оба конденсатора — керамические, в диапазоне 1–3,3 мкФ) добавит к стоимости вашей схемы рублей шестьдесят максимум. Но я предпочитаю не экономить: на выходе ставлю обычный керамический, а на входе электролит (10–100 мкФ), причем твердотельный (полимерный) или танталовый. Обойтись керамическими конденсаторами и там и там можно, если входное напряжение 7-12 вольт поступает с батареек-аккумуляторов или с другого аналогового стабилизатора. Импульсные стабилизированные источники и простейшие нестабилизированные выпрямители требуют дополнительной фильтрации. Можно использовать дешевый алюминиевый электролит, если ставить параллельно ему керамический 0,1 мкФ, еще лучше поставить на входе последовательную индуктивность в несколько долей или единиц миллигенри.
Стабилизатор следует устанавливать прямо около приемника, длина проводников должна быть минимальна. Вместо LP2950 можно взять LM2931 или аналогичный с маленьким проходным напряжением (это особенно важно, если схема питается от батареек — для обычного LM78L05 входное напряжение должно быть не менее 7,5, а лучше 8-9 вольт).
Сравнив со случаем питания приемника непосредственно от Arduino, как рекомендуется во всех публикациях (исключений я не встречал), вы поразитесь полученному эффекту — дальность и способность проникать через стенки сразу увеличивается в разы. Приемник вместе со стабилизатором для удобства можно вынести в отдельную маленькую коробочку. Связать его выход с контроллером в основном корпусе можно любым трехжильным проводом (два питания и сигнальный проводник) длиной до 3 метров, а может быть и больше. Удобнее это потому, что еще нужны антенны, и по правилам будет лучше, если они будут параллельны друг другу в пространстве, а большие корпуса не всегда удается разместить так, чтобы антенны торчали в нужной ориентации.
В простейшем варианте в качестве антенн можно обойтись обрезками одножильного провода сечением не меньше 0,5 мм и длиной 17 см ± 1-3 мм. Не следует употреблять многожильный монтажный провод! В продаже имеются более компактные спиральные антенны, но я лично их эффективность не испытывал. Кончик антенны и у передатчика и у приемника запаивается в соответствующее отверстие в углу платы (не ошибитесь в модернизированном варианте передатчика — там слово ANT тоже не на месте, см. рис. выше).
Формирование и обработка передаваемых данных
Это второй крупный недостаток большинства обзоров по нашей теме: авторы ограничиваются какой-то локальной задачей, не формулируя ее в общем виде, как передачу произвольных данных одним пакетом. Как вы поняли из описания выше, передаваться нашим комплектом может только простая последовательность бит. Стандартная библиотека VirtualWire кодирует их специальным образом (каждая тетрада кодируется 6-ю битами, впереди добавляется синхронизирующий заголовок, и еще добавляется контрольная сумма для всего пакета) и на выходе превращает в более привычную последовательность байт. Но разбираться с ней уже приходится программисту самостоятельно.
Далее мы считаем, что передатчик и приемник подключены к Arduino. Кроме VirtualWire, в связи с бумом «умных домов», есть еще много всякого подобного, вроде RC-Switch или RemoteSwitch, но они ориентированы на другие задачи, и для передачи произвольных данных их употреблять явно не стоит.
Максимальная длина одного сообщения в VirtualWire равна 27 байт (см. документацию). Передача одного полного сообщения (оно автоматически дополняется сигнатурой 0xb38, значением длины сообщения и контрольной суммой) при выбранной мной скорости 1200 бит/с составляет 0,35 секунды.
Чем больше, кстати, выбранная скорость передачи, тем дальность передачи будет меньше. По опыту применения RS-232 известно, что при увеличении дальности допустимая скорость передачи экспоненциально падает: на скорости 19200 неэкранированная линия работает на 15 метров, на 9600 — 150 метров, а на скорости 1200 — более километра. Интересно было бы экспериментально выяснить характер этой зависимости для нашего случая, ведь очень много здесь зависит и от применяемой математики.
Инициализация передатчика в VirtualWire выглядит так:
. . . . . #include . . . . . void setup() < vw_setup(1200); // Скорость соединения VirtualWire vw_set_tx_pin(10); // Вывод передачи VirtualWire D10 . . . . . >
Разберем принципы формирования данных на конкретном примере. Пусть у нас имеется выносной датчик температуры-влажности. Он выдает значения (переменные temperature и humidity) в формате действительного числа со знаком (float). Чтобы было проще разбираться на приемном конце, будем все приводить к виду положительного целого числа с числом десятичных разрядов не менее 4, переводить разряды по отдельности в ASCII-символы, передавать получившуюся строку, а на приемном конце выполнять обратные операции. Конечно, можно упростить задачу (например, обойтись без преобразования в ASCII и укоротить числа), но в таком виде она получается единообразной для почти любых разновидностей цифровых данных, что упрощает разборку при приеме.
На практике для формирования сообщения удобно воспользоваться типом String, примерно так:
. . . . . // глобальные переменные в начале #define ledPin 13 //вывод светодиода (D13, вывод 19 ATmega) char msg[13]; volatile int tmpr=0; volatile int hum=0; . . . . . void loop() < delay(1000); //пауза 1 c float temperature; float humidity; . . . . . //здесь получаем значения temperature и humidity с датчика //температуру с десятыми в целое положительное число 4 разряда: tmpr = temperature*10+2731; //2731 = абсолютный ноль в десятых градуса //влажность в целое число 4 разряда: hum = humidity*10+1000; // формируем сообщение: digitalWrite (ledPin,HIGH); //зажигаем светодиод — начало передачи String strMsg="DAH"; //сигнатура - данные strMsg+=tmpr; //температуру в строку strMsg+=hum; //присоединяем влажность strMsg.toCharArray(msg,12); //переводим строку в массив, 12 – количество знаков // и посылаем: vw_send((uint8_t *)msg, strlen(msg)); // передача сообщения vw_wait_tx(); // ждем завершения передачи delay(500); //пауза 500 мс digitalWrite (ledPin, LOW); //гасим светодиод — конец передачи >
Если требуется передавать более точные числа с большим количеством разрядов, то вы просто увеличиваете длину массива msg. Глобальные «волатильные» переменные tmpr и hum нужны в случае, если вы осредняете несколько показаний, в противном случае они тоже могут быть объявлены локальными внутри функции loop(). Сообщение, как видите, состоит из значений преобразованных температуры и влажности, в ASCII-строках по четыре байта каждое, предваряемых строкой из трех символов «DAH» (символы могут быть любыми другими из таблицы ASCII). Это сигнатура, которая позволит выделить данное сообщение из числа возможных других, посылаемых аналогичными устройствами. Не пренебрегайте сигнатурой, даже если вы полагаете, что других устройств поблизости в этом диапазоне не предвидится, заодно она служит дополнительной гарантией целостности принимаемых данных.
Заметьте также, что при преобразовании строки в массив необходимо указать на один символ больше, чем суммарная длина сообщения (3+4+4=11), это учитывается нулевой символ, замыкающий строку. А величина массива msg[] должна быть указана с запасом и может быть любой, в данном случае от 13 до 27 байт. При передаче все равно отправится ровно столько, сколько вернет функция strlen(msg), то есть 11 байт + нулевой символ.
В приемной части полученный массив ASCII-кодов придется разбирать (парсить). Но сначала нужно его принять. Для инициализации приема выполняются следующие действия:
#include char str[5]; вспомогательная строка для преобразований ASCII в число uint8_t buf [VW_MAX_MESSAGE_LEN]; //буфер для хранения принятых данных uint8_t buflen = VW_MAX_MESSAGE_LEN; // max длина принятых данных . . . . . void setup() < vw_set_rx_pin(2); //D2 Вывод приемника VirtualWire vw_setup(1200); // Скорость соединения VirtualWire . . . . . >
Собственно прием с разборкой строки такой:
void loop() < vw_rx_start(); // готовность приема buflen = VW_MAX_MESSAGE_LEN; //размер буфера задавать каждый раз if (vw_have_message()) < //ждем приема if (vw_get_message(buf, &buflen)) // Если данные приняты < vw_rx_stop(); //останавливаем прием и парсим: for (byte i=0; i99) hh=99; //получаем влажность в %, целое число . . . . . //выводим куда-то > //end проверка сигнатуры DAT > //end данные приняты > //прием > // end loop
Надеюсь, у вас теперь будет меньше вопросов по применению этих дешевых и удобных в применении устройств.
- Arduino
- передатчик 433 МГц
- приемник 433 МГц