
Это первая статья в серии про LoRa — технологию передачи данных, способную работать с сигналами ниже уровня шума. Протокол LoRa позволяют передавать данные на километры с очень небольшой мощностью передатчика — порядка 10 мВт или 10 дБм. При этом модули LoRa потребляют так мало энергии, что могут работать от одной зарядки аккумулятора год или больше.
На базе LoRa делают системы сбора данных с обширных территорий без подключения к интернету. Это могут быть, например, данные от счетчиков воды и электроэнергии, погодных станций, газовых котлов и другого оборудования. Также можно управлять устройствами на больших расстояниях.
С помощью LoRa можно сделать шлюз, который будет работать далеко от зоны покрытия интернета. Можно даже настроить передачу сообщений на большие расстояния вообще без интернета.
Из этой статьи вы узнаете, как появились устройства LoRa и почему они могут принимать сигналы ниже уровня шума. Вы узнаете, как работать с модулями LoRa, подключенными к микрокомпьютеру Raspberry Pi, научитесь конфигурировать эти модули с учетом ограничений законодательства, а также передавать с их помощью сообщения на километры. В завершение статьи я расскажу, как сделать простую погодную станцию, измеряющую температуру, давление и влажность. Данные будут передаваться через LoRa и отображаться на OLED-мониторах, подключенных к передатчику и приёмнику.
Немного истории
В 2009–2010 годах французские инженеры Николя Сорнен (Nicolas Sornin), Оливье Селлер (Olivier Seller) и Франсуа Сфорца (François Sforza) основали компанию Cycleo в Гренобле, чтобы наладить беспроводной сбор показаний счётчиков газа, воды и электричества.
В своих разработках они использовали уже известную на то время линейно-частотную модуляцию с расширением спектра Chirp Spread Spectrum (CSS). Эта модуляция применялась в военной и аэрокосмической технике.
Компания Cycleo сумела адаптировать эту модуляцию для недорогой и массовой передачи цифровых данных.
В мае 2012 года американская компания Semtech приобрела компанию Cycleo и выпустила микросхемы SX1272 и SX1276. На их базе выпустили множество модулей, в том числе EBYTE LoRa, о применении которых я расскажу в этой статье.
Также в 2015 году создали объединение LoRa Alliance, выпустившее стандарт протокола верхнего уровня LoRaWAN. LoRaWAN добавляет поверх LoRa-модуляции целый сетевой стек. При этом конечные устройства общаются не напрямую друг с другом, а с одним или несколькими шлюзами, которые пересылают пакеты в сетевой сервер.
Оставлю LoRaWAN и Meshtastic для следующих статей: эти темы заслуживают отдельного разбора и не нужны для первого знакомства с LoRa..
Об истории возникновения LoRa читайте в статье «A Brief History of LoRa: Three Inventors Share Their Personal Story at The Things Conference».
Преимущества и ограничения LoRa
Что же даёт применение модулей LoRa?
Прежде всего, увеличение дальности связи при низком энергопотреблении. Если между антеннами, подключенными к модулям LoRa, есть прямая видимость, то дальность связи может достигать нескольких или даже десятков километров. При этом модули LoRa могут работать годами от батарейки, включаясь лишь на время передачи данных. В режиме приёма модули потребляют единицы мА.
Очень важно, что модули LoRa могут работать в нелицензируемых ISM-диапазонах на частотах 433 МГц, 868 МГц, 915 МГц, а также 2.4 ГГц. Частота выбирается в зависимости от страны. Есть решения, которые не требуют разрешения на выход в эфир.
Среди других преимуществ — устойчивость к эффекту Доплера и многолучевому распространению сигнала (повторным отражениям от зданий и рельефа). Это делает модуляцию CSS пригодной для развёртывания в городской застройке и пригодной для городской застройки и подвижных объектов.
Модули LoRa на частотах до 915 МГц передают данные с небольшой скоростью — порядка единиц и десятков кбит/с. Передавать через LoRa видео или голос в хорошем качестве не получится, но для телеметрии и управления модули вполне пригодны.
В случае модулей на частоту 2.4 ГГц скорость передачи данных заметно выше, однако и расстояние надёжной связи меньше. Тем не менее это расстояние может составлять сотни метров и даже до 2-3 Км, в зависимости от условий на местности и мощности передатчика. Модули LoRa, работающие на 2.4 ГГц, можно использовать для управления различными устройствами в реальном времени — например, робототехникой, телеметрией и промышленным оборудованием..
Кроме того, в ряде стран есть ограничения по рабочему циклу (duty cycle), поэтому вы не можете передавать через LoRa непрерывный поток данных. Рабочий цикл — это ограничение на долю времени, в течение которого устройство может передавать данные в эфир, установленное регуляторами для нелицензируемых ISM-диапазонов.
Работа с сигналом ниже уровня шума
При передаче данных через радиоканал шумы и помехи ограничивают дальность и надёжность связи. Обычно для увеличения дальности приходится применять антенны с большим коэффициентом усиления, в том числе направленные. Другое решение — увеличение мощности передатчика, что не всегда приемлемо. Но оказалось, что применение специальных методов модуляции позволяет устанавливать связь даже в тех условиях, когда полезный сигнал ниже уровня шума.
Но как же модули LoRa могут принимать сигнал ниже уровня шума?
В классических видах модуляции (амплитудной, частотной, фазовой) один символ данных передаётся практически мгновенно, и приёмнику приходится принимать решение о значении бита, опираясь на очень короткий отрезок сигнала. Если в этот момент уровень шума сопоставим с уровнем сигнала или превышает его, различить полезную информацию невозможно.
В модуляции CSS один символ кодируется не короткой посылкой, а протяжённым во времени «чирпом» — тоном, частота которого линейно нарастает (upchirp) или убывает (downchirp) в пределах всей выделенной полосы. Информация о переданном символе закодирована не в мгновенной амплитуде или частоте, а в сдвиге по времени и частоте этого чирпа относительно опорного.
Ключевой параметр, определяющий «длину» чирпа, — это Spreading Factor (SF, коэффициент расширения спектра): чем он выше, тем дольше передаётся один символ и тем на большее число возможных значений он может указывать.
Приёмник демодулирует сигнал, перемножая принятую смесь сигнала и шума с обратным (опорным) чирпом и переводя результат в частотную область через быстрое преобразование Фурье. При этом энергия полезного сигнала, «размазанная» по всей длительности символа, когерентно суммируется и превращается в чёткий, узкий пик на определённой частоте, в то время как шум, будучи некоррелированным (случайным) сигналом, при таком суммировании не накапливается, а лишь усредняется.
В результате LoRa-приёмник способен уверенно декодировать сигнал, мощность которого примерно на 19–20 дБ ниже уровня шума. Это не нарушение законов физики, а прямое следствие накопления энергии сигнала во времени при демодуляции.
К сожалению, чем выше SF, тем дольше передаётся каждый символ и тем ниже итоговая скорость передачи данных.
С технологией LoRa можно познакомиться на сайте Semtech, а также в статьях «LoRa - The Wireless Technology for the Internet of Things» и «Mitigating Inter-network Interference in LoRa Networks».
Почему не Wi-Fi
Но почему бы не использовать для передачи данных телеметрии недорогой и широко распространённый протокол Wi-Fi?
Прежде всего, обычный Wi-Fi требует наличия точки доступа и подключения к сети. При этом дальность связи обычно не превышает 30–50 м в помещении и 100–150 м на открытом пространстве при стандартном оборудовании.
Далее, модули Wi-Fi постоянно потребляют десятки миллиампер от источника питания.
Ещё одна проблема связана с необходимостью выделения IP-адреса для каждого устройства, подключенного к Wi-Fi, что может вызывать проблемы при большом количестве таких устройств. На точке доступа может быть ограничение числа клиентов.
На территории промышленных объектов и жилых домов сигнал LoRa (433, 868 или 915 МГц) проходит через препятствия заметно лучше, чем сигнал Wi-Fi на 2,4 ГГц.
Надо сказать, что большое покрытие, сравнимое с LoRa, обеспечивает новый стандарт HaLow (IEEE 802.11ah), работающий в том же поддиапазоне частот ниже 1 ГГц, что и LoRa. В штатных условиях он обеспечивает дальность до 1 км при заметно более высокой скорости передачи данных, чем у LoRa. В отдельных полевых испытаниях на открытой местности дальность достигала 16 км, хотя скорость на таких дистанциях падает уже до долей мегабита в секунду. Также для увеличения покрытия можно применять направленные Wi-Fi-мосты на частотах 2,4 или 5 ГГц с антеннами высокого усиления.
Проект WFB-NG, лежащий в основе OopenIipc, позволяет передавать видео в реальном времени на несколько километров. Правда, это видео должно быть сжатое через h265.
Но все это другие сценарии и области применения, нежели используемые LoRa.
Модули LoRa производства EBYTE
Далее я расскажу о применении некоторых модулей LoRa, выпускаемых компанией Chengdu Ebyte Electronic Technology (EBYTE). Такие модули созданы на базе чипов Semtech с добавленной «обвязкой», облегчающей конструирование оборудования для дальней передачи цифровых сигналов.
Серии модулей EBYTE
Модули LoRa EBYTE выпускаются сериями, такими как E32, E22, E220, E90 (рис. 1).

К одному из модулей на частоту 433 МГц подключена относительно длинная антенна, а к другому — короткая антенна, пригодная для работы на частотах 868 МГц и 915 МГц. Сразу заметим, что включать модули LoRa без «правильных» антенн нельзя, так как это приведет к их повреждению.
В зависимости от серии в модулях используются те или иные чипы Semtech, а также различная обвязка.
Серия E32 на базе чипов SX1276/78 старая, но популярная. Для нее существует множество библиотек под разные платформы, такие как Arduino, ESP32, Raspberry Pi. По своим возможностям она уступает современным сериям.
Серия E22 создана на новых чипах SX1262/68 и обладает улучшенными характеристиками по сравнению с E32. У неё выше чувствительность, стабильность частоты и более низкое энергопотребление. Модули этой серии могут работать в режиме ретранслятора без внешнего контроллера.
На базе модулей E220 с чипом LLCC68 (упрощённая версия SX1262) и E22 можно создать системы, которые перед передачей данных прослушивают эфир, чтобы проверить, свободен ли он. Если эфир занят, модуль откладывает передачу. Эта технология называется LBT (Listen Before Talk) и на некоторых диапазонах LBT требуется по законодательству.
Если нужен модуль с очень мощным передатчиком, обратите внимание на серию E90, созданную для промышленных применений (рис. 2).

Модули E90-DTU можно подключить к компьютеру, микроконтроллеру или микрокомпьютеру через RS232 и RS485. Для этого предусмотрены промышленные клеммы и стандартный DB9 разъём. Также можно подключить эти модули и к USB с помощью переходника для RS485, показанного на рис. 2.
В модулях E90-DTU могут быть установлены чипы SX1262 (для высоких частот) или SX1268 (для частот 430 МГц).
Мощность передатчика E90-DTU может достигать 5 Вт, что обеспечит дальность связи в пределах прямой видимости до 15 Км и больше. Но, конечно, дальность зависит от условий на местности, наличия зданий, леса, от усиления антенны и высоты ее установки. Для работы с таким уровнем мощности необходимо получить разрешение регулятора в вашей стране.
Помимо чипа Semtech в модулях EBYTE LoRa есть кварцевый резонатор, усилитель мощности для передатчика и малошумящий усилитель приёмника, согласующие цепи и контакты или разъём для подключения антенны. Металлический экран снижает паразитные излучения и уменьшает влияние внешних помех.
На рис. 3 показана плата из модуля E90-DTU.

Как видите, здесь используется модуль серии E22. Радиочастотный тракт спрятан внутри металлического экрана.
Особый интерес могут представлять серии E28 и E280, работающие на частоте 2.4 ГГц. Модули E28-2G4M12S и E280-2G4T12S можно найти на маркетплейсах по их названиям или по запросам «EBYTE E28 SX1280 2.4GHz LoRa» и «EBYTE E280 SX1280 UART».
В линейке модулей EBYTE LoRa есть модули со встроенным контроллером, а также без такого контроллера. Наличие контроллера можно определить по суффиксу в названии модуля.
Если в названии модуля есть суффикс T, то это модуль со встроенным контроллером, который сам управляет чипом Semtech. Программа передаёт данные через UART в прозрачном режиме, а все операции по передаче данных через эфир выполняет контроллер.
Если же в названии модуля есть суффикс M, то встроенного контроллера нет. При этом тайминг, формирование пакетов и управление режимами выполняет внешний контроллер, подключенный к модулю через интерфейс SPI. Такой подход предоставляет доступ к внутренним регистрам чипа и даёт разработчикам больше возможностей.
Заслуживает внимания серия E106, в частности модули E106-868G27P2. На базе этой серии можно создавать LoRaWAN-концентраторы, способные одновременно принимать пакеты от множества конечных устройств на разных частотах и с разным значением SF. Подобные модули используются исключительно в шлюзах LoRaWAN.
Контакты модулей EBYTE
Оставив в стороне мощный модуль E90-DTU, займёмся подключением менее мощных модулей, которые при определённых условиях не требуют разрешения от регуляторов.
На рис. 4 показаны контакты одного из таких модулей E220-900T22D.

Контакт GND нужно подключить к земле, а на контакт VCC подать питание в диапазоне 3-5 В (точнее смотрите в даташите на ваш модуль).
Анализируя состояние контакта AUX, можно контролировать завершение процесса отправки данных.
Для подключения к управляющему микроконтроллеру или микрокомпьютеру используются выводы TXD и RXD. Первый из них нужно подключить к выводу RX, а второй — к выводу TX микрокомпьютера.
Контакты M0 и M1 позволяют выбрать один из режимов работы модуля.
В режиме конфигурирования следует подать на M0 уровень 0, а на M1 — уровень 1, то есть 3,3 В. В режиме обычной передачи подайте уровень 0 на оба эти входа.
При установке M0=1, а M1=0 включается режим энергосбережения с периодическим прослушиванием эфира. И, наконец, если на оба эти контакта подать 1, включается режим глубокого сна или обновления прошивки.
Обычно контакты M0 и M1 подключают к выходам микрокомпьютера. На E90-DTU управление режимами выполняется с помощью микропереключателей, расположенных на корпусе этого модуля.
Учёт законодательных ограничений
Прежде чем «выйти в эфир» с помощью модулей LoRa, нужно разобраться в законодательных ограничениях и настроить модули с их учётом.
Правила использования радиочастотного спектра в России устанавливаются Государственной комиссией по радиочастотам (ГКРЧ).
Решение Государственной комиссии по радиочастотам (ГКРЧ) от 7 мая 2007 года № 07-20-03-001 «О выделении полос радиочастот устройствам малого радиуса действия» разрешает безлицензионное использование диапазона 868 МГц. Впоследствии в это решение вносились изменения.
Согласно разъяснениям Роскомнадзора, для применения радиоэлектронных средств, работающих в режиме IoT («интернет вещей», англ. Internet of Things) и в сетях транспортной телематики, выделены такие полосы радиочастот:
864 - 865 МГц;
866 - 868 МГц;
868,7 – 869,2 МГц
Для оконечных устройств (но не базовых станций) без оформления лицензий в этих диапазонах разрешается использовать эффективную излучаемую мощность до 25 мВт.
Диапазоны частот 864 – 865 МГц и 866 – 868 МГц запрещено использовать на территории аэропортов. Кроме того, в этих диапазонах действует ограничение рабочего цикла (Duty Cycle) — не более 0,1%.
Обойти это ограничение помогает технология прослушивания эфира перед передачей — LBT (Listen Before Talk — «слушай перед тем, как говорить»). Эта технология доступна в модулях E220-900T22D.
Что касается диапазона 868,7 – 869,2 МГц, то он может использоваться на территории аэропортов, и на него не накладываются ограничения по времени Duty Cycle.
Использование диапазона 433,075–434,790 МГц для LoRa допускается, однако с ограничениями. Этот диапазон разрешено использовать без индивидуального разрешения, если мощность излучения не превышает 10 мВт, оборудование соответствует установленным техническим требованиям и работает на вторичной основе, то есть не создает помех пользователям с первичным приоритетом. Однако диапазон 433 МГц загружен сильнее, чем 866 МГц и не выделен специально для интернета вещей.
Применение LoRa в диапазоне 2,4 ГГц регулируется решением ГКРЧ при Мининформсвязи России от 07.05.2007 № 07-20-03-001 «О выделении полос радиочастот устройствам малого радиуса действия».
Изучите Приложение 2 к этому решению. В нём для полосы 2400–2483,5 МГц установлен предел мощности 10 мВт. Также будет полезен документ «Легализация устройств в ISM диапазоне».
Законодательство постоянно изменяется. Ниже приведены ссылки на некоторые документы и статьи по этой теме:
Решение ГКРЧ от 07.05.2007 № 07-20-03-001 «О выделении полос радиочастот устройствам малого радиуса действия» (базовое решение, приложение № 11);
Статья «Праздник к нам приходит: ГКРЧ расширила ISM-диапазон 868 МГц в два раза»
Установка ОС на Raspberry Pi 3B+
Теперь перейдем к практике. Для начала я расскажу, как собрать макет из двух модулей EBYTE LoRa и приведу тексты программ, с помощью которых их можно конфигурировать, а также как передавать данные с одного узла на другой.
Прежде всего подготовим два микрокомпьютера Raspberry PI. Я использовал версию Raspberry PI 3B+.
Загрузите нужный вам образ ОС в соответствии с типом вашего микрокомпьютера Raspberry PI со страницы https://www.raspberrypi.com/software/operating-systems/ и запишите его на карту SD ёмкостью от 16 Гб, например, с помощью программы balenaEtcher.
Я использовал образ 2026-06-18-raspios-bookworm-armhf-lite.img.xz, созданный на базе Debian 12. Также доступен образ 2026-06-18-raspios-trixie-armhf-lite.img.xz на базе Debian 13.
Вставьте карту с образом ОС в микрокомпьютер, подключите монитор, клавиатуру и кабель локальной сети. После включения питания задайте региональные настройки, имя пользователя и пароль.
После загрузки ОС запустите программу конфигурирования:
$ sudo raspi-config
В этой программе вам нужно разрешить работу SSH и включить Serial Port (рис. 5).

На вопрос «Would you like a login shell to be accessible over serial?» ответьте No, а на вопрос «Would you like the serial port hardware to be enabled?» — Yes.
Проверьте, что появились сообщения:
The serial login shell is disabled The serial interface is enabled
Перезагрузите ОС и убедитесь, что появилось доступное устройство serial0:
$ ls -lh /dev | grep serial lrwxrwxrwx 1 root root 5 Jun 30 06:51 serial0 -> ttyS0
Настройка фиксированного IP через NetworkManager
Для удобства работы настройте статический адрес IP на микрокомпьютерах передатчика и приёмника.
Сначала проверьте список соединений:
$ nmcli connection show NAME UUID TYPE DEVICE Wired connection 1 d61c0e8b-28df-3e44-9f73-8029203e60a1 ethernet eth0 lo 1e363ef2-6f0c-4f25-a1e3-ac875239c98a loopback lo
Далее введите команды, указав в них нужный вам адрес IP узла микрокомпьютера с маской, адрес шлюза и сервера DNS:
sudo nmcli con mod "Wired connection 1" ipv4.addresses 192.168.0.17/24 sudo nmcli con mod "Wired connection 1" ipv4.gateway 192.168.0.1 sudo nmcli con mod "Wired connection 1" ipv4.dns "192.168.0.1" sudo nmcli con mod "Wired connection 1" ipv4.method manual
Активируйте изменения:
$ sudo nmcli con down "Wired connection 1" && sudo nmcli con up "Wired connection 1" Connection 'Wired connection 1' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2) Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
После перезагрузки ОС проверьте адрес, выделенный микрокомпьютеру:
$ ip -a
Настройка фиксированного IP через dhcpcd
Если в ответ на команду nmcli connection show вы получили сообщение о том, что NetworkManager не запущен, значит, нужно настраивать фиксированный адрес IP через dhcpcd. Вот пример такого сообщения:
$ nmcli connection show Error: NetworkManager is not running.
Перед настройкой определите имя сетевого интерфейса:
$ ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether b8:27:eb:65:2c:52 brd ff:ff:ff:ff:ff:ff
В данном случае это eth0.
Откройте конфигурационный файл:
sudo nano /etc/dhcpcd.conf
Добавьте внизу описание ваших сетевых настроек:
interface eth0 static ip_address=192.168.0.14/24 static routers=192.168.0.1 static domain_name_servers=192.168.0.1
Укажите здесь сетевые настройки для вашей сети. После редактирования файла dhcpcd.conf перезапустите сервис dhcpcd:
sudo systemctl restart dhcpcd
После этого проверьте с консоли адрес, выделенный микрокомпьютеру:
$ ip -a
Он должен быть такой, как вы указали в параметре static ip_address.
Сборка макетов
Соберём макет из двух модулей LoRa E220-900T22D, способных работать на безлицензионной в России частоте 868 МГц.
В качестве питания для этих модулей в макете будем использовать контакт +5 В от Raspberry Pi 3B+, понижая напряжение до 3,3 В модулем стабилизатора AMS1117 или MP2315.
Внимание! Если подать на модули LoRa питание 5 В, то для подключения контактов GPIO микрокомпьютера к контактам TXD, RXD, AUX, M0, M1 модуля нужно использовать преобразователи уровней с 5 В до 3,3 В. В противном случае можно повредить порты микрокомпьютера, рассчитанные на 3,3 В. Подходящий преобразователь можно найти на маркетплейсах по запросу «преобразователь уровня 5в/3.3в».
Подключение модулей LoRa к Raspberry Pi 3B+
Подключение модуля E220-900T22D к Raspberry Pi 3 B+ показано на рис. 6.

Я собрал два таких макета на E220-900T22D и Raspberry Pi 3 B+ для передатчика и приёмника.
Контакты модуля E220-900T22D и аналогичных модулей EBYTE LoRa показаны ещё раз для удобства на рис. 7.

Просмотр распиновки GPIO на Raspberry Pi 3B+
Для правильного подключения модуля к Raspberry Pi 3B+ нам потребуется распиновка разъёма GPIO. Выведите её на консоль с помощью команды pinout (рис. 8).

Коммутация на макетной плате
Далее с помощью макетной платы и соединительных проводов выполните такую коммутацию:
VCC — подключите к напряжению +3,3 В, полученному от модулей AMS1117 или MP2315, подключенных к одному из выводов +5 В микрокомпьютера (выводы с номерами 2 или 4);
GND — подключите к земле Raspberry Pi 3B+ (один из выводов с номерами 6, 9, 14, 20, 25, 30, 34 или 39);
AUX — к GPIO18 с номером 12;
TXD — к GPIO15 с номером 10;
RXD — к GPIO14 с номером 8;
M1 — к GPIO27 с номером 13;
M0 — к GPIO22 с номером 15
Перед включением питания проверьте дважды все соединения. Напряжение 3,3 В на выходе стабилизатора лучше проверить до установки модуля LoRa на макетную плату. Ошибки в коммутации могут привести к выходу из строя модуля или микрокомпьютера.
Хотя на плате Raspberry Pi 3B+ есть источник 3,3 В, в рабочем варианте устройства лучше всего питать модуль LoRa от отдельного стабилизатора и даже от отдельного источника питания. При большой выходной мощности потребляемый ток будет слишком велик для подключения к плате Raspberry Pi 3B+.
Кроме того, для исключения бросков напряжения рекомендуется шунтировать выводы питания непосредственно около модуля LoRa электролитическим конденсатором на 200-500 мкФ, параллельно которому подключен керамический конденсатор ёмкостью 1 мкФ.
Антенны для модулей LoRa
Чтобы не повредить модули LoRa, их нельзя включать без антенны. Антенна должна соответствовать рабочей частоте. Также от антенны и её расположения сильно зависит дальность связи.
В описании модулей EBYTE LoRa от производителя в разделе «Antenna Recommendation» есть список рекомендованных антенн. Описание модуля E220-900T22D вы можете загрузить по этому адресу.
Для модуля E220-900T22D для работы на частоте 868 МГц предлагаются три антенны с разъёмом SMA-J:
TX868-JZ-5 — усиление 2,0 dBi, короткая (52 мм) прямая всенаправленная антенна;
TX868-JK-20 — усиление 3,0 dBi, гнущаяся резиновая всенаправленная антенна длиной 210 мм;
TX868-XPL-100 — усиление 3,5 dBi, антенна на присоске высотой 290 мм с фидером длиной 100 см
Вы можете найти эти антенны на маркетплейсах по их названию.
Некоторые типы антенн показаны на рис. 9.

В верхней части этого рисунка показана антенна для частоты 433 МГц. Ниже антенны на 868 МГц и 2,4 ГГц, одна из антенн на 868 МГц подключена к модулю LoRa.
Тестирование и конфигурирование модулей LoRa
После сборки макетов нужно протестировать и сконфигурировать модули LoRa. Для работы с модулями EBYTE LoRa есть удобные библиотеки:
Эти библиотеки совместимы с сериями E32, E220 и E22 модулей EBYTE, причём их можно использовать не только для микрокомпьютера Raspberry Pi 3B+, но и для микроконтроллеров Arduino, ESP32 и ESP8266.
Установите нужные вам библиотеки, затем запустите программы получения и установки конфигурации.
Установка библиотек для модулей и клонирование исходных кодов
Установка выполняется в виртуальной среде Python следующими командами:
python3 -m venv my_lora_env source my_lora_env/bin/activate pip install ebyte-lora-e32-rpi pip install ebyte-lora-e220-rpi pip install ebyte-lora-e22-rpi pip install RPi.GPIO pyserial
Здесь были установлены три библиотеки для серий модулей E32, E220 и E22.
Далее склонируйте исходные коды программ для этой статьи на оба микрокомпьютера:
sudo apt install git git clone https://github.com/AlexandreFrolov/LoRa-2026.git
Программы будут скопированы в подкаталог LoRa-2026 текущего каталога.
Проверка текущей конфигурации модуля
Для проверки конфигурации модуля LoRa воспользуйтесь программой get-configuration.py.
Текущая версия программы работает с модулями серий E220 и E32.
Для модуля E220-900T22D запустите эту программу так:
source my_lora_env/bin/activate cd LoRa-2026 python3 get-configuration.py --series e220 --model 900T22D --aux-pin 18 --m0-pin 22 --m1-pin 27
Для модуля E32-915T30D используйте такую команду:
$ python3 get-configuration.py --model 915T30D --aux-pin 18 --m0-pin 22 --m1-pin 27
В качестве параметров передайте программе название модели модуля LoRa, а также номера портов GPIO микрокомпьютера Raspberry Pi 3B+, использованные для подключения модуля LoRa к контактам AUX, M0 и M1.
Конфигурация модуля E220-900T22D по умолчанию будет выглядеть так:
Initialization: Success Retrieve configuration: Success ---------------------------------------- HEAD : 0xc1 0x0 0x8 AddH : 0x0 AddL : 0x0 Chan : 23 -> 873 SpeedParityBit : 0b0 -> 8N1 (Default) SpeedUARTDatte : 0b11 -> 9600bps (default) SpeedAirDataRate : 0b10 -> 2.4kbps (default) OptionSubPacketSett: 0b0 -> 200bytes (default) OptionTranPower : 0b0 -> 22dBm (Default) OptionRSSIAmbientNo: 0b0 -> Disabled (default) TransModeWORPeriod : 0b11 -> 2000ms (default) TransModeEnableLBT : 0b0 -> Disabled (default) TransModeEnableRSSI: 0b0 -> Disabled (default) TransModeFixedTrans: 0b0 -> Transparent transmission (default) ----------------------------------------
Обратите внимание на параметры AddH и AddL. Они показывают, что текущий адрес модуля нулевой. Параметр Chan задаёт номер канала 23, что соответствует частоте передачи, равной 873 МГц. При этом мощность сигнала, указанная в параметре OptionTranPower, равна 22 дБм (примерно 0,16 Вт).
Значение параметра TransModeFixedTrans, равное нулю, указывает, что передача будет выполняться в прозрачном режиме, когда все данные, поступающие в модуль, будут передаваться в эфир.
Параметры SpeedParityBit и SpeedUARTDatte определяют формат — бит чётности и скорость передачи данных через порт UART модуля. Что же касается параметра SpeedAirDataRate, то он задаёт скорость передачи данных через эфир.
С помощью параметра OptionSubPacketSett можно задавать максимальный размер одного пакета данных, передаваемых в эфире. В случае превышения длины данных модуль автоматически разделяет их на пакеты установленного размера.
Параметр OptionRSSIAmbientNo управляет измерением уровня фонового шума на рабочем канале RSSI (Received Signal Strength Indicator Ambient Noise). Если включить этот параметр, программа сможет оценить уровень шума в канале и при необходимости подождать или сменить канал на менее зашумлённый.
Если включить параметр TransModeEnableLBT, перед отправкой данных модуль "прослушивает" радиоканал, чтобы оценить, занят ли он. Если канал свободен, передача выполняется. Если канал занят, передача будет отложена, пока канал не освободится.
Параметр TransModeEnableRSSI включает или отключает возможность модуля измерять и передавать информацию об уровне сигнала (RSSI) принятых пакетов. Если параметр включен, в принятые пакеты добавляется информация об уровне полученного сигнала.
В модулях серии E220 реализован режим пробуждения при получении сигнала WOR (Wake-On-Receive), позволяющий экономить потребляемую энергию. Параметр TransModeWORPeriod задаёт интервал между проверками наличия сигнала в эфире.
Что же касается конфигурации модуля E32-915T30D, то здесь параметров меньше и они другие:
Initialization: Success Retrieve configuration: Success ---------------------------------------- HEAD : 0b11000000 192 AddH : 0 AddL : 17 Chan : 15 -> 915 SpeedParityBit : 0b0 -> 8N1 (Default) SpeedUARTDatte : 0b11 -> 9600bps (default) SpeedAirDataRate : 0b10 -> 2.4kbps (default) OptionTrans : 0b1 -> Fixed transmission (first three bytes can be used as high/low address and channel) OptionPullup : 0b1 -> TXD, RXD, AUX are push-pulls/pull-ups (default) OptionWakeup : 0b0 -> 250ms (default) OptionFEC : 0b1 -> Turn on Forward Error Correction Switch (Default) OptionPower : 0b0 -> 30dBm (Default)
Эти модули более раннего выпуска, чем модули серии E220, и там нет возможности проверки уровня шума перед передачей данных.
На сайте производителя в разделе File Downloads вы сможете скачать документацию на модуль E220-900T22D.
Описание программы get-configuration.py
Исходный текст программы get-configuration.py вы найдете в репозитории GitHub. Рассмотрим только самые важные моменты.
Получив управление, функция main считывает аргументы командной строки и открывает устройство UART:
def main(): args = parse_args() loraSerial = serial.Serial('/dev/serial0')
Далее открытое устройство и параметры запуска передаются функции build_lora, которая создаёт объект модуля LoRa нужной серии:
lora, ResponseStatusCode, print_configuration = build_lora( args.series, args.model, loraSerial, args.aux_pin, args.m0_pin, args.m1_pin, )
Функция build_lora возвращает созданный объект lora, код завершения ResponseStatusCode, а также объект print_configuration для определения конфигурации модуля.
Далее выполняется инициализация модуля, получение и вывод конфигурации. Перед завершением своей работы программа очищает порт GPIO:
try: code = lora.begin() print(f"Initialization: {ResponseStatusCode.get_description(code)}") code, configuration = lora.get_configuration() print(f"Retrieve configuration: {ResponseStatusCode.get_description(code)}") print_configuration(configuration) finally: GPIO.cleanup()
Функция build_lora проверяет параметр series и создает объект lora, импортируя нужный модуль:
if series == "e32": from lora_e32 import LoRaE32, print_configuration from lora_e32_operation_constant import ResponseStatusCode model = model or "915T30D" lora = LoRaE32( model, loraSerial, aux_pin=aux_pin, m0_pin=m0_pin, m1_pin=m1_pin, ) elif series == "e220": from lora_e220 import LoRaE220, print_configuration from lora_e220_operation_constant import ResponseStatusCode model = model or "900T22D" lora = LoRaE220( model, loraSerial, aux_pin=aux_pin, m0_pin=m0_pin, m1_pin=m1_pin, ) else: raise ValueError(f"Неизвестная серия модуля: {series}")
При необходимости вы можете добавить сюда другие серии и модули LoRa.
Полученную конфигурацию модуля программа выводит функцией print_configuration.
Установка новой конфигурации
Прежде чем приступить к передаче и приёму данных, необходимо выполнить конфигурирование модулей.
Самое главное — установить правильный номер канала, чтобы передача шла на разрешённой безлицензионной частоте, и разрешённый уровень мощности.
В наших программах я использую вместо прозрачного режима адресный режим, позволяющий явным образом задать модуль, который должен получать данные, по его адресу. Поэтому очень важно задать правильные адреса для всех модулей LoRa вашего проекта.
И, конечно, нужно правильно указать контакты порта GPIO микрокомпьютера Raspberry Pi 3B+, к которым будут подключены контакты модуля LoRa.
Ниже приведён пример запуска скрипта set-configuration.py, выполняющего такую конфигурацию:
$ source my_lora_env/bin/activate $ cd lora-2026 $ python3 set-configuration.py --series e220 --model 900T22D --addh 0x00 --addl 0x0B --chan 16 --aux-pin 18 --m0-pin 22 --m1-pin 27
Здесь и далее я буду приводить примеры команд и скриптов для модуля E220-900T22D, который можно сконфигурировать для работы на частоте 868 МГц, разрешённой в России.
После инициализации скрипт получает текущую конфигурацию модуля и выводит её на консоль:
$ python3 set-configuration.py --series e220 --model 900T22D --addh 0x00 --addl 0x0A --chan 16 --aux-pin 18 --m0-pin 22 --m1-pin 27 Initialization: Success Retrieve configuration: Success ------------- CONFIGURATION BEFORE CHANGE ------------- HEAD : 0xc1 0x0 0x8 AddH : 0x0 AddL : 0x0 Chan : 23 -> 873 SpeedParityBit : 0b0 -> 8N1 (Default) SpeedUARTDatte : 0b11 -> 9600bps (default) SpeedAirDataRate : 0b10 -> 2.4kbps (default) OptionSubPacketSett: 0b0 -> 200bytes (default) OptionTranPower : 0b0 -> 22dBm (Default) OptionRSSIAmbientNo: 0b0 -> Disabled (default) TransModeWORPeriod : 0b11 -> 2000ms (default) TransModeEnableLBT : 0b0 -> Disabled (default) TransModeEnableRSSI: 0b0 -> Disabled (default) TransModeFixedTrans: 0b0 -> Transparent transmission (default) ---------------------------------------- ------------- CONFIGURATION AFTER CHANGE ------------- Success ---------------------------------------- HEAD : 0xc1 0x0 0x8 AddH : 0x0 AddL : 0xa Chan : 16 -> 866 SpeedParityBit : 0b0 -> 8N1 (Default) SpeedUARTDatte : 0b11 -> 9600bps (default) SpeedAirDataRate : 0b100 -> 9.6kbps OptionSubPacketSett: 0b10 -> 64bytes OptionTranPower : 0b11 -> 10dBm OptionRSSIAmbientNo: 0b1 -> Enabled TransModeWORPeriod : 0b10 -> 1500ms TransModeEnableLBT : 0b0 -> Disabled (default) TransModeEnableRSSI: 0b1 -> Enabled TransModeFixedTrans: 0b1 -> Fixed transmission (first three bytes can be used as high/low address and channel) ----------------------------------------
В данном случае для модуля был установлен адрес 0x000A (или 10 в десятичной системе счисления), канал 16, соответствующий частоте 868 МГц, мощность снижена до 10 dBm (10 мВт), установлен режим фиксированной передачи, когда в первых трёх байтах передаётся адрес и номер канала.
Также активирована возможность измерения уровня шума на рабочем канале OptionRSSIAmbientNo, а также режим измерения и передачи информации об уровне сигнала TransModeEnableRSSI.
Важный момент — определение нужного номера канала по заданной частоте. Для модуля E220-900T22D частота F зависит от номера канала CH следующим образом:
F(CH) = 850.125 МГц + CH × 1 МГц
Изменяя номер канала, вы можете устанавливать частоту с шагом 1 МГц.
Для вычисления номера канала по частоте F_target используйте такую формулу:
CH = (F_target − 850.125) / 1
Если говорить о диапазоне 868,7 – 869,2 МГц, в котором меньше всего ограничений, то в него попадает только канал 19 с частотой 869.125 МГц. В диапазон 864 – 865 МГц попадает тоже один канал 14 с частотой 864.125 МГц.
Для диапазона 866 – 868 МГц подходят два канала — 16 (866,125 МГц) и 17 (867,125 МГц).
Обмен данными
Теперь, после того как вы познакомились с параметрами конфигурации модулей EBYTE LoRa, перейдём к самому интересному — передадим данные через эфир с одного модуля на другой.
На рис. 10 показаны два узла в сборе, расположенные на одном столе.

На самом деле эти модули я расположил на двух разных столах, но расстояние между ними было небольшое — порядка одного метра.
Конфигурирование модулей
Чтобы не запутаться в адресах и каналах, подготовьте два списка — для передатчика и для приёмника. Напишите в них серийный номер, адрес и номер канала модуля LoRa, номера пинов GPIO, а также адрес IP микрокомпьютера, к которому этот модуль подключен.
Пример для передатчика:
s/n xxxxxx1971 (написан на корпусе модуля, у вас будет другой);
адрес модуля 0x11;
канал 16 (866,125 МГц) или 19 (869.125 МГц), нужно выбрать только один;
номера пинов --aux-pin 18 --m0-pin 22 --m1-pin 27;
IP микрокомпьютера 192.168.0.17, на рис. 10 без корпуса (у вас может быть другой IP)
Команда настройки параметров передатчика для работы на канале 16:
python set-configuration.py --series e220 --addh 0x00 --addl 0x11 --chan 16 --aux-pin 18 --m0-pin 22 --m1-pin 27
Аналогично для канала 19:
python set-configuration.py --series e220 --addh 0x00 --addl 0x11 --chan 19 --aux-pin 18 --m0-pin 22 --m1-pin 27
Пример для приёмника:
s/n xxxxxx1120 (у вас будет другой);
адрес модуля 0x12;
канал 16 (866,125 МГц) или 19 (869.125 МГц), нужно выбрать только один;
номера пинов --aux-pin 18 --m0-pin 22 --m1-pin 27;
IP микрокомпьютера 192.168.0.14 на рис. 10 в корпусе (у вас может быть другой IP)
Команда настройки параметров приёмника для работы на канале 16:
python set-configuration.py --series e220 --addh 0x00 --addl 0x12 --chan 16 --aux-pin 18 --m0-pin 22 --m1-pin 27
Аналогично, для канала 19:
python set-configuration.py --series e220 --addh 0x00 --addl 0x12 --chan 19 --aux-pin 18 --m0-pin 22 --m1-pin 27
Программа для приёма текстовой строки
Вначале запустите на принимающем узле программу get-e220.py, ожидающую от передатчика текстовую строку. После получения строки программа выведет её на консоль.
source my_lora_env/bin/activate cd LoRa-2026 python3 get-e220.py
После запуска программа перейдёт в режим ожидания:
Initialization: Success Set configuration: Success Waiting for messages...
Когда приёмник получит данные, программа выведет на консоль такую информацию:
RSSI: -32 dBm (сырое значение: 224) Success Привет! Изучаем модули LoRa
Модуль возвращает данные RSSI (уровень принятого сигнала) в «сыром» виде. Чтобы перевести его в dB, в программе используется код, составленный по формуле из документации на модуль:
rssi_dbm = rssi - 256
Рассмотрим наиболее важные фрагменты кода программы get-e220.py.
Прежде всего, программа инициализирует порт UART, создаёт объект модуля LoRa и инициализирует его:
loraSerial = serial.Serial('/dev/serial0') lora = LoRaE220('900T22D', loraSerial, aux_pin=18, m0_pin=22, m1_pin=27) code = lora.begin() print("Initialization: {}".format(ResponseStatusCode.get_description(code)))
Далее программа выполняет конфигурирование модуля, работающего на приём:
configuration_to_set = Configuration('900T22D') configuration_to_set.ADDH = 0x00 configuration_to_set.ADDL = 0x12 configuration_to_set.CHAN = 16 configuration_to_set.TRANSMISSION_MODE.fixedTransmission = FixedTransmission.FIXED_TRANSMISSION configuration_to_set.TRANSMISSION_MODE.enableRSSI = RssiEnableByte.RSSI_ENABLED code, confSetted = lora.set_configuration(configuration_to_set)
Если модуль LoRa уже сконфигурирован для приёмника, то этот фрагмент кода не нужен. Можно закомментировать весь этот фрагмент или только строку вызова функции lora.set_configuration:
code, confSetted = lora.set_configuration(configuration_to_set)
После установки конфигурации модуль переходит в режим ожидания данных от передатчика:
print("Waiting for messages...") while True: if lora.available() > 0: code, value, rssi = lora.receive_message(rssi=True) rssi_dbm = rssi - 256 print(f'RSSI: {rssi_dbm} dBm (сырое значение: {rssi})') print(ResponseStatusCode.get_description(code)) print(value) time.sleep(0.1)
Когда в приёмник по эфиру придут данные, программа получит их из модуля функцией lora.receive_message. Обратите внимание, что этой функции передаётся параметр rssi=True, включающий режим получения данных об уровне сигнала RSSI.
После этого программа выводит на консоль значение RSSI (исходное и пересчитанное в dBm), код возврата от функции lora.receive_message, а также переданное сообщение.
В репозитории вы также найдете программу get.py, предназначенную для работы с модулями устаревшей серии E32. Оставляю вам эту программу на самостоятельное изучение.
Программа для отправки текстовой строки
Чтобы отправить текстовую строку, я подготовил программу send-e220.py. Запускается она так:
source my_lora_env/bin/activate cd LoRa-2026 python3 send-e220.py
После инициализации порта UART, создания и инициализации объекта модуля lora выполняется конфигурирование модуля для передачи:
configuration_to_set = Configuration('900T22D') configuration_to_set.ADDH = 0x00 configuration_to_set.ADDL = 0x11 configuration_to_set.CHAN = 16 configuration_to_set.TRANSMISSION_MODE.enableRSSI = RssiEnableByte.RSSI_ENABLED configuration_to_set.TRANSMISSION_MODE.fixedTransmission = FixedTransmission.FIXED_TRANSMISSION from lora_e220_constants import TransmissionPower configuration_to_set.OPTION.transmissionPower = TransmissionPower('900T22D').get_transmission_power().POWER_10 code, confSetted = lora.set_configuration(configuration_to_set) print("Set configuration: {}".format(ResponseStatusCode.get_description(code))) code, confSetted = lora.set_configuration(configuration_to_set) print("Set configuration: {}".format(ResponseStatusCode.get_description(code)))
Здесь устанавливается адрес и канал, минимальная мощность на передачу, включается режим фиксированной передачи, а также режим передачи RSSI.
Далее сообщение передаётся функцией lora.send_fixed_message:
message = 'Привет! Изучаем модули LoRa' code = lora.send_fixed_message(0x00, 0x12, 16, message)
В качестве первого и второго параметра этой функции передаются старший и младший байт адреса модуля приёмника. Через третий параметр нужно указать номер канала, а через четвёртый —текстовое сообщение.
Программу send.py передачи текстовой строки для модулей серии E32 мы оставляем вам на самостоятельное изучение.
Приём структуры данных
Если вы передаёте не строку, а структуру в виде набора именованных параметров, то для этого в библиотеке есть соответствующая поддержка. Программа get_dict-e220.py принимает такую структуру и показывает её содержимое на консоли:
source my_lora_env/bin/activate cd LoRa-2026 python3 get_dict-e220.py Initialization: Success Set configuration: Success Waiting for messages... Success RSSI: -30 dBm (сырое значение: 226) Данные: {'key1': 'value1', 'key2': 'value2'} Ключ1: value1
Начальная часть программы аналогична рассмотренной ранее программе приёма текстовой строки.
Что же касается приёма и вывода на консоль структуры, то для этого используется такой код:
print("Waiting for messages...") time.sleep(2) while True: if lora.available() > 0: code, value, rssi = lora.receive_dict(rssi=True) print(ResponseStatusCode.get_description(code)) rssi_dbm = rssi - 256 print(f'RSSI: {rssi_dbm} dBm (сырое значение: {rssi})') if value: print("Данные:", value) print("Ключ1:", value.get('key1')) time.sleep(2)
Приём данных структуры выполняет функция lora.receive_dict. Полученные от неё данные, включая данные RSSI, выводятся на консоль.
Аналогичная программа get_dict.py приёма данных для модулей серии E32 есть в репозитории.
Отправка структуры данных
Для отправки структуры данных я подготовил программу send-dict-e220.py.
source my_lora_env/bin/activate cd LoRa-2026 python3 send-dict-e220.py
Если вы когда-либо работали на любительской радиостанции, то знаете, что перед тем, как выйти в эфир, нужно убедиться с помощью приёмника, что частота, на которой вы собираетесь что-то передать, свободна.
Для модуля E220-900T22D такой режим тоже доступен и, как я уже писал ранее, называется LBT (Listen Before Talk).
Если включить LBT, модуль слушает эфир перед передачей и задерживает отправку, если канал занят. Включается этот режим так:
configuration_to_set.TRANSMISSION_MODE.enableLBT = LbtEnableByte.LBT_ENABLED
Отправка данных структуры выполняется с помощью функции lora.send_fixed_dict:
data = {'key1': 'value1', 'key2': 'value2'} code = lora.send_fixed_dict(0, 0x12, 16, data)
Аналогичную программу send_dict.py для модулей серии E32 вы найдете в моём репозитории. К сожалению, модули серии E32 не поддерживают режим LBT.
Подключаем OLED-дисплей и погодную станцию
В качестве первой конструкции соберём погодную станцию, способную измерять температуру, влажность и давление. Результаты измерений будут передаваться через LoRa на другой узел и отображаться там на мониторе.
Установите на макетной плате OLED-дисплей с интерфейсом I2C и погодную станцию BME-280, способную измерять температуру, влажность и давление (рис. 11).

Вы также можете встретить датчик BMP-280, который не может измерять влажность.
Контакт VCC питания BME-280 подключите к шине 3,3 В, а контакт GND к земле. Аналогичные подключения сделайте и для OLED-дисплея.
Контакты SCL (синхронизация) и SDA (данные) погодной станции и OLED-дисплея нужно подключить к контактам GPIO3 (5) и GPIO2 (3) соответственно.
Запустите программу raspi-config:
sudo raspi-config
Выберите из меню Interface Options строку I2C и переведите порт в состояние Enable.
Теперь установите модули i2c-tools и python3-smbus:
sudo apt install -y i2c-tools python3-smbus
Далее запустите программу обнаружения устройств на шине I2C:
i2cdetect -y 1
Если вы все подключили правильно и устройства исправны, на консоли появится таблица с адресами OLED монитора 0x3c и погодной станции BME-280 0x76:
0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- 76 --
Чтение данных из BME
Если адреса найдены, запускаем тестовую программу bme-test.py для чтения данных из BME-280 и их отображения на консоли. Перед этим нужно установить модуль RPi.bme280:
source my_lora_env/bin/activate pip install RPi.bme280
После запуска программа должна показать температуру, давление и влажность:
source my_lora_env/bin/activate python3 bme-test.py Температура: 24.65 °C Давление: 987.23 гПа Влажность: 69.81 %
Программа bme-test.py очень простая:
import smbus2 import bme280 port = 1 address = 0x76 # или 0x77, смотрите вывод i2cdetect bus = smbus2.SMBus(port) calibration_params = bme280.load_calibration_params(bus, address) data = bme280.sample(bus, address, calibration_params) print(f"Температура: {data.temperature:.2f} °C") print(f"Давление: {data.pressure:.2f} гПа") print(f"Влажность: {data.humidity:.2f} %")
После подключения библиотек smbus2 и bme280 для работы с шиной I²C и датчиком BME280 программа задаёт номер шины и адрес датчика I²C.
Далее с помощью функции smbus2.SMBus программа открывает доступ к шине I²C, а затем функцией bme280.load_calibration_params считывает с датчика калибровочные коэффициенты.
Шина, адрес и калибровочные коэффициенты передаются функции bme280.sample для получения скорректированных показаний температуры, давления и влажности. Эти показания выводятся на консоль функцией print с округлением до двух знаков после запятой.
Вывод на OLED-монитор
Для тестирования вывода текста на OLED монитор я подготовил программу oled-test.py.
Перед тем как её запускать, установите необходимые библиотеки и модули:
sudo apt install -y libopenjp2-7 source my_lora_env/bin/activate pip install adafruit-circuitpython-ssd1306 pillow
Если у вас старая версия ОС и появились ошибки, используйте такую процедуру установки:
sudo apt update sudo apt install -y libjpeg-dev zlib1g-dev libopenjp2-7-dev libtiff-dev \ libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev \ python3-tk libharfbuzz-dev libfribidi-dev libxcb1-dev sudo apt install -y python3-dev python3.9-dev pip install --upgrade pip setuptools wheel pip install adafruit-circuitpython-ssd1306 pillow
После установки запустите тестовую программу:
source my_lora_env/bin/activate python3 oled-test.py
Программа должна вывести на экран строки, показанные на рис. 12.

Итак, на данный момент на передающем узле у нас подключены и протестированы модуль LoRa, OLED монитор и погодная станция BME-280.
Подключите OLED монитор к принимающему узлу и выполните там аналогичные проверки.
Для вывода на экран OLED монитора текста с символами кириллицы можно воспользоваться программой oled-test-ru.py, загружающей необходимые шрифты.
Передача данных о погоде
Для передачи данных о погоде через LoRa можно использовать программу send-bme-e220.py. Перед её запуском выполните установку модулей:
pip install luma.oled luma.core
Далее запустите программу:
python3 send-bme-e220.py Initialization: Success Set configuration: Success Температура: 25.44 °C, Давление: 987.39 гПа, Влажность: 68.45 % Send message: Success
Программа send-bme-e220.py будет в цикле раз в минуту снимать показания с погодной станции, показывать их на OLED мониторе (рис. 13) и консоли, а также передавать через LoRa на узел приёмника.

Приём данных о погоде
Для приёма данных о погоде воспользуйтесь программой get-bmp-e220.py. Прежде чем её запускать, установите модули:
pip install luma.oled luma.core
После запуска программа будет ожидать данные:
$ python3 get-bmp-e220.py Initialization: Success Set configuration: Success Waiting for messages...
Когда данные будут получены, программа выведет их на консоль и на OLED монитор приёмника (рис. 14):
Success RSSI: -31 dBm (сырое значение: 225) Данные: {'temp': 25.44, 'pres': 987.39, 'hum': 68.45}

Обратите внимание, что вместе с данными о погоде на экран выводится уровень принятого сигнала RSSI.
Идём дальше
Тема применения LoRa обширная. Работая с первой статьёй, вы научились использовать модули LoRa производства EBYTE для передачи данных и сделали несложную погодную станцию, способную передавать сведения о погоде на большое расстояние.
Для простоты изучения я использовал распространённые микрокомпьютеры Raspberry Pi 3B+. Однако для снижения энергопотребления при работе с датчиками лучше применять микроконтроллеры, такие, например, как ESP32 или созданные на базе STM32.
Далее, для увеличения дальности связи можно использовать ретрансляторы и меш-сети. Вы можете применять LoRa для передачи сообщений на большие расстояния вместо мессенджеров, а также для создания шлюза в интернет.
Эти и другие темы я планирую затронуть в следующих статьях, посвященных технологии LoRa.
Автор @AlexandreFrolov
НЛО прилетело и оставило здесь промокод для читателей нашего блога:
-15% на заказ нового VDS — HABRFIRSTVDS.
Комментарии (3)

ALT0105
21.07.2026 11:35Интересно было бы провести эксперимент по использованию голографического кодирования в канале LoRa - допустимое отношение сигнал/шум должно опуститься ещё на 10-12 дБ. Для эксперимента достаточно закодировать передаваемый блок данных, например, в Матлабе, и декодировать в нём же после приема.
SebastianP
почему бы LoRa не вставить в нишевый повербанк.
Заряжаешь телефон и как вариант можешь в лесу общаться с помощью "смс" , которые телефон напишет и по кабелю передаст в повербанк LoRa
была бы резервная связь за копейки
tarielx
Кажется, meshtastic.org как раз это и предлагает и готовые устройства уже существуют.