Компоненты · 12 мин чтения

LoRa с Arduino: дальняя беспроводная связь на SX1278 Ra-02 и ESP32

Руководство по LoRa с Arduino: подключение SX1278 Ra-02, настройки SF и полосы, код передатчика и приёмника, ESP32 и Pico, предупреждение о 3,3 V, проверка дальности, LoRa и LoRaWAN.

Проекты LoRa с Arduino — самый практичный способ передавать данные между двумя платами на километры с минимальным энергопотреблением, без интернета и SIM-карты. LoRa (Long Range) — радиомодуляция, разработанная Semtech; недорогие модули, например Ra-02 на SX1278 с частотой 433 MHz, обеспечивают дальность 1–3 км в городе и до 10 км на открытой местности. Плата за это — скорость: от нескольких сотен байт до нескольких килобит в секунду. Поэтому LoRa не подходит для аудио и видео, но идеально передаёт небольшие объёмы данных на большие расстояния: температуру, влажность, уровень воды, состояние двери или GPS-координаты.

В этом руководстве ты шаг за шагом узнаешь, как LoRa достигает такой дальности, как на неё влияют настройки SF, BW и CR, какую частоту выбрать для своего региона, как подключить Ra-02 к Arduino Uno, ESP32 и Raspberry Pi Pico, написать код передатчика и приёмника с библиотекой LoRa, считать RSSI и SNR и проверить реальную дальность. В заключительных разделах разберём отличия LoRa от LoRaWAN, The Things Network (TTN) и проект полевого датчика, который месяцами работает от батареи.

Что такое LoRa и как достигается такая дальность?

LoRa использует метод расширения спектра с линейной частотной модуляцией (CSS). Каждый символ передаётся как «чирп», частота которого плавно растёт в пределах полосы; информация скрыта в начальной частоте чирпа. Когда приёмник умножает входящий сигнал на известную форму чирпа и суммирует результат, шум взаимно компенсируется, а сигнал накапливается. Так LoRa декодирует сигналы на 20 dB ниже уровня шума. Обычным ASK-модулям на 433 MHz нужен сигнал заметно сильнее шума, а LoRa распознаёт едва различимые сигналы; в этом секрет значительно большей дальности при той же выходной мощности.

Плата за это — время: чем дольше длится чирп, тем больше энергии собирает приёмник и тем выше дальность, но тем медленнее передаются те же данные. В LoRa дальность, скорость и время работы от батареи всегда связаны. Передача измерения размером 20 байт занимает около 57 миллисекунд при самых быстрых настройках и 1,3 секунды при настройках максимальной дальности. В таблице ниже LoRa сравнивается с другими вариантами беспроводной связи для Arduino.

ХарактеристикаLoRa (SX1278)nRF24L01433 MHz ASKWi-Fi (ESP32)
Типичная дальность1–3 км в городе, до 10 км на открытой местности50–100 м (около 1 км с PA+LNA)20–100 м50–100 м (до роутера)
Скорость передачи0,3–5,5 кбит/с (125 kHz)250 кбит/с – 2 Мбит/с1–10 кбит/сПорядка Мбит/с
Ток при передаче40–120 mA (зависит от мощности)11–12 mA10–40 mA120–240 mA
Ток во снеМенее 1 µAОколо 1 µAНет (выключен)10 µA (глубокий сон)
Двусторонняя связьДаДаНет (отдельные передатчик и приёмник)Да
ИнфраструктураНе нужнаНе нужнаНе нужнаРоутер и интернет

Модули LoRa: Ra-02, RFM95, E32 и готовые платы

Большинство модулей LoRa на рынке используют микросхемы семейства SX127x от Semtech. SX1276 охватывает 137–1020 MHz, а SX1278 — 137–525 MHz, поэтому SX1278 встречается в модулях на 433 MHz, а SX1276 — в модулях на 868/915 MHz. Модули делятся на две группы: «чистые» радиомодули с интерфейсом SPI и готовые модули со своим процессором, которые используются как последовательный порт через UART.

МодульМикросхемаЧастотаИнтерфейсПримечание
Ai-Thinker Ra-02SX1278433 MHzSPIСамый дешёвый и распространённый; антенный разъём IPEX
Ai-Thinker Ra-01SX1278433 MHzSPIВариант Ra-02 с пружинной антенной
HopeRF RFM95WSX1276868 / 915 MHzSPIПопулярный выбор для LoRaWAN и TTN
Ebyte E32 / E220SX1278 / LLCC68433 / 868 MHzUARTСобственный процессор; работает как последовательный порт без библиотеки
TTGO LoRa32, Heltec LoRa 32ESP32 + SX1276/78433 / 868 / 915 MHzНа платеESP32, LoRa и OLED на одной плате
Характеристика Ra-02Значение
МикросхемаSemtech SX1278
Диапазон частот410–525 MHz (обычно 433 MHz)
Максимальная выходная мощность+18 dBm (около 63 mW)
Чувствительность приёмникаДо -141 dBm (при самой узкой полосе)
Питание1,8–3,7 V, обычно 3,3 V
ТокОколо 40–120 mA при передаче, около 12 mA при приёме, менее 1 µA во сне
ИнтерфейсSPI (до 10 MHz) + пин прерывания DIO0
АнтеннаРазъём IPEX (U.FL), нужна антенна на 433 MHz
SX1278 — микросхема на 3,3 V, её выводы не выдерживают 5 V. Подключение Ra-02 напрямую к пину 5V Arduino Uno или к линиям SPI с уровнем 5 V необратимо повредит модуль. Питание всегда должно быть 3,3 V, а с Uno нужен преобразователь уровней на линиях SPI (подробнее в разделе подключения).

Какую частоту выбрать: 433 MHz или 868/915 MHz?

LoRa работает в безлицензионных диапазонах ISM, но они различаются по странам, и в каждом есть ограничения мощности и доли времени передачи. В Европе для LoRa используются два диапазона: 433,05–434,79 MHz и 863–870 MHz; в Северной Америке — 902–928 MHz. Сети LoRaWAN и TTN используют 868 MHz в Европе и 915 MHz в США, а 433 MHz очень распространена в любительских соединениях «точка-точка» на дешёвых модулях Ra-02. Перед покупкой проверь диапазон своего региона: антенна и микросхема рассчитаны на определённую частоту; модуль на 868 MHz не будет работать на 433 MHz.

РегионЧастота LoRaЧастотный план LoRaWAN
Европа, Великобритания, Турция433 MHz и 863–870 MHzEU868 (EU433 встречается редко)
США, Канада, Мексика902–928 MHzUS915
Бразилия, Аргентина, Австралия915–928 MHzAU915
Индия865–867 MHzIN865
Япония, Юго-Восточная Азия920–923 MHzAS923
Китай470–510 MHz (и 433 MHz)CN470
По европейским правилам разрешённая мощность в диапазоне 433 MHz обычно составляет 10 mW (10 dBm), а в поддиапазонах 868 MHz — преимущественно 25 mW при доле времени передачи 1%; другими словами, после передачи в течение 1 секунды устройство должно молчать следующие 99. Максимальные 18 dBm у Ra-02 превышают этот предел, поэтому в примере кода используется setTxPower(10). Точные ограничения уточни у национального регулятора радиосвязи.

SF, BW и CR: три настройки, определяющие дальность

Дальность и скорость LoRa задаются тремя параметрами. Коэффициент расширения спектра (SF) определяет, из скольких «чипов» состоит каждый символ: от SF7 до SF12 каждый шаг удваивает длительность символа, позволяет приёмнику декодировать сигнал примерно на 2,5 dB слабее, но почти удваивает время в эфире. Таблица ниже рассчитана для полосы 125 kHz, кодирования 4/5 и пакета размером 20 байт; в последнем столбце указана минимальная пауза между двумя пакетами для соблюдения доли времени передачи 1%.

SFБитовая скоростьВремя передачи 20 байтПримерная чувствительностьМинимальный SNR для декодированияПауза при доле передачи 1%
SF75,5 кбит/с57 мс-123 dBm-7,5 dB6 с
SF83,1 кбит/с103 мс-126 dBm-10 dB10 с
SF91,8 кбит/с185 мс-129 dBm-12,5 dB18 с
SF10977 бит/с371 мс-132 dBm-15 dB37 с
SF11537 бит/с741 мс-134 dBm-17,5 dB73 с
SF12293 бит/с1319 мс-137 dBm-20 dB131 с

Полоса пропускания (BW) — ширина участка спектра, занимаемого сигналом: стандартное значение — 125 kHz; 250 и 500 kHz увеличивают скорость вдвое и вчетверо, но ухудшают чувствительность на 3 и 6 dB, а 62,5 kHz и ниже повышают дальность, но делают связь чувствительной к дрейфу частоты дешёвых кварцевых резонаторов. Скорость кодирования (CR) определяет избыточность для исправления ошибок: 4/5 добавляет 1 корректирующий бит на каждые 4 бита, а 4/8 — 4; это помогает при помехах, но удлиняет пакет. Формула битовой скорости: Rb = SF × (BW / 2^SF) × 4 / (4 + CR); для SF9, 125 kHz и 4/5 получается 9 × 125000 / 512 × 0,8 ≈ 1758 бит/с.

SF9, 125 kHz, 4/5 — хороший баланс для начала. Если дальности недостаточно, повышай SF по одному шагу; если нужна скорость, снижай. Частота, SF, BW, CR и слово синхронизации должны совпадать у передатчика и приёмника; если отличается хотя бы один параметр, приёмник вообще не увидит пакетов. Слово синхронизации по умолчанию — 0x12, его использует большинство частных сетей, а сети LoRaWAN используют 0x34. Собственное значение, например 0xF3, как в примерах, помогает аппаратно отфильтровать пакеты соседних любительских устройств и LoRaWAN.

Подключение Ra-02: Arduino Uno, ESP32 и Pico

Помимо четырёх линий SPI (SCK, MISO, MOSI, NSS), Ra-02 нужны пин сброса и пин прерывания (DIO0). DIO0 переходит в HIGH после завершения передачи или при поступлении нового пакета; библиотека LoRa использует его для прерывания. Для кода из этого руководства пины DIO1–DIO5 модуля можно не подключать. Если SPI тебе пока незнаком, сначала прочитай статью «Что такое SPI».

Пин Ra-02Arduino UnoESP32Raspberry Pi Pico
3.3VВнешний стабилизатор 3,3 V3V33V3 (OUT)
GNDGNDGNDGND
SCKD13 (через преобразователь уровней)GPIO 18GP18
MISOD12 (напрямую)GPIO 19GP16
MOSID11 (через преобразователь уровней)GPIO 23GP19
NSSD10 (через преобразователь уровней)GPIO 5GP17
RESETD9 (через преобразователь уровней)GPIO 14GP20
DIO0D2 (напрямую, пин прерывания)GPIO 26GP21
С Uno возникают две проблемы. Первая — напряжение: выходы SCK, MOSI, NSS и RESET у Uno имеют уровень 5 V; его нужно понизить до 3,3 V преобразователем уровней (например, 74HC4050) или делителем напряжения из резисторов 2,2 kΩ + 3,3 kΩ на каждой линии — расчёт есть в утилите делителя напряжения. MISO и DIO0 идут от модуля к Uno, поэтому их можно подключить напрямую. Вторая проблема — ток: пин 3.3V Uno может выдавать около 50 mA, а Ra-02 при передаче может потреблять более 100 mA. Питай модуль от отдельного стабилизатора 3,3 V, например AMS1117. У ESP32, Pico и Arduino Pro Mini на 3,3 V этих проблем нет.

Антенна важна не меньше подключения. Подсоедини к разъёму IPEX модуля Ra-02 антенну, настроенную на 433 MHz. Сделать её самостоятельно легко: длина волны равна 300 / 433 = 0,693 метра, и для четвертьволновой антенны достаточно прямого провода длиной 17,3 см (8,6 см для 868 MHz, 8,2 см для 915 MHz). Держи антенну вертикально, не помещай её в металлическую коробку и направляй антенны с обеих сторон одинаково (обе вертикально); при расположении под прямым углом друг к другу теряется большая часть сигнала.

Пошагово: передатчик с библиотекой LoRa

  1. Открой «Менеджер библиотек» (Library Manager) в Arduino IDE, введи LoRa и установи библиотеку LoRa от Sandeep Mistry.
  2. Подключи модуль по таблице и никогда не включай передачу без установленной антенны.
  3. Загрузи приведённый ниже код в плату передатчика; он определяет, ESP32 это или Uno, и выбирает соответствующие пины.
  4. Открой «Монитор порта» (Serial Monitor) на скорости 115200 бод; каждые 5 секунд должна появляться строка «Gonderildi / sent».
  5. Если LoRa.begin() завершается ошибкой, проверь провода, питание 3,3 V и пины NSS и RESET.
C++ (Arduino IDE)
1#include <SPI.h>
2#include <LoRa.h>
3
4#if defined(ESP32)
5const int PIN_SS = 5, PIN_RST = 14, PIN_DIO0 = 26;   // ESP32 (VSPI: SCK 18, MISO 19, MOSI 23)
6#else
7const int PIN_SS = 10, PIN_RST = 9, PIN_DIO0 = 2;    // Uno (SCK 13, MISO 12, MOSI 11) + seviye dönüştürücü / level shifter
8#endif
9
10const long FREKANS = 433E6;      // Ra-02: 433 MHz; RFM95 için 868E6 / 868E6 for an RFM95
11unsigned long sayac = 0;
12
13void setup() {
14  Serial.begin(115200);
15  LoRa.setPins(PIN_SS, PIN_RST, PIN_DIO0);
16  if (!LoRa.begin(FREKANS)) {               // SX1278 bulunamadı / SX1278 not found
17    Serial.println("LoRa baslatilamadi / LoRa init failed");
18    while (true) delay(1000);
19  }
20  LoRa.setSpreadingFactor(9);               // SF9: menzil ile hız dengesi / range vs speed balance
21  LoRa.setSignalBandwidth(125E3);           // 125 kHz bant genişliği / bandwidth
22  LoRa.setCodingRate4(5);                   // hata düzeltme 4/5 / error coding 4/5
23  LoRa.setSyncWord(0xF3);                   // iki tarafta aynı olmalı / must match on both sides
24  LoRa.enableCrc();                         // bozuk paketi ele / drop corrupted packets
25  LoRa.setTxPower(10);                      // 10 dBm (433 MHz bandında yasal sınır) / legal limit on 433 MHz
26  Serial.println("Verici hazir / sender ready");
27}
28
29void loop() {
30  LoRa.beginPacket();
31  LoRa.print("BG #");
32  LoRa.print(sayac);                        // paket numarası / packet number
33  LoRa.endPacket();                         // gönderim bitene kadar bekler / blocks until sent
34  Serial.print("Gonderildi / sent #");
35  Serial.println(sayac);
36  sayac++;
37  delay(5000);                              // havada kalma süresine göre bekle / wait according to airtime
38}
39
ФункцияЧто делает?
LoRa.setPins(ss, reset, dio0)Задаёт пины NSS, RESET и DIO0; вызывай перед begin()
LoRa.begin(433E6)Запускает модуль и задаёт частоту в Hz; возвращает 0, если микросхема не найдена
setSpreadingFactor(6–12)Настройка SF, по умолчанию 7
setSignalBandwidth(125E3)Полоса пропускания, по умолчанию 125 kHz
setCodingRate4(5–8)Скорость кодирования 4/5 – 4/8, по умолчанию 4/5
setSyncWord(0xF3)Слово синхронизации, по умолчанию 0x12 (LoRaWAN использует 0x34)
enableCrc()Добавляет CRC к пакету; по умолчанию в библиотеке отключено
setTxPower(2–20)Выходная мощность в dBm, по умолчанию 17
beginPacket() / print() / endPacket()Подготавливает, записывает и отправляет пакет

Приёмник: чтение пакетов, RSSI и SNR

Код приёмника на каждом проходе цикла проверяет через LoRa.parsePacket(), поступил ли новый пакет; если да, функция возвращает его размер, а содержимое считывается побайтно через LoRa.read(). Код также подсчитывает пропуски в номерах пакетов, чтобы вычислить долю потерь — основу проверки дальности, которую мы вскоре проведём.

C++ (Arduino IDE)
1#include <SPI.h>
2#include <LoRa.h>
3
4#if defined(ESP32)
5const int PIN_SS = 5, PIN_RST = 14, PIN_DIO0 = 26;
6#else
7const int PIN_SS = 10, PIN_RST = 9, PIN_DIO0 = 2;
8#endif
9
10long sonNo = -1;                 // son alınan paket numarası / last packet number
11unsigned long alinan = 0, kayip = 0;
12
13void setup() {
14  Serial.begin(115200);
15  LoRa.setPins(PIN_SS, PIN_RST, PIN_DIO0);
16  if (!LoRa.begin(433E6)) {
17    Serial.println("LoRa baslatilamadi / LoRa init failed");
18    while (true) delay(1000);
19  }
20  LoRa.setSpreadingFactor(9);    // verici ile aynı ayarlar / same settings as the sender
21  LoRa.setSignalBandwidth(125E3);
22  LoRa.setCodingRate4(5);
23  LoRa.setSyncWord(0xF3);
24  LoRa.enableCrc();
25  Serial.println("Alici hazir / receiver ready");
26}
27
28void loop() {
29  int boyut = LoRa.parsePacket();           // paket geldi mi? / did a packet arrive?
30  if (boyut == 0) return;
31
32  String mesaj = "";
33  while (LoRa.available()) mesaj += (char)LoRa.read();
34
35  int diyez = mesaj.indexOf('#');           // "BG #123" içinden numara / number from "BG #123"
36  long no = (diyez >= 0) ? mesaj.substring(diyez + 1).toInt() : -1;
37  if (sonNo >= 0 && no > sonNo + 1) kayip += no - sonNo - 1;   // atlanan numaralar kayıp / skipped numbers are lost
38  if (no >= 0) sonNo = no;
39  alinan++;
40
41  Serial.print(mesaj);
42  Serial.print("  RSSI: ");
43  Serial.print(LoRa.packetRssi());          // dBm, -120'ye yaklaştıkça zayıf / weaker towards -120
44  Serial.print(" dBm  SNR: ");
45  Serial.print(LoRa.packetSnr(), 1);        // dB, eksi değerler de çözülebilir / negative values still decode
46  Serial.print(" dB  kayip / lost: ");
47  Serial.print(100.0 * kayip / (alinan + kayip), 1);
48  Serial.println(" %");
49}
50

RSSI (Received Signal Strength Indicator) — уровень принятого сигнала, отрицательное число в dBm: -40 dBm означает очень сильный сигнал, -120 dBm — очень слабый. SNR (Signal to Noise Ratio) показывает, насколько сигнал сильнее шума. Особенность LoRa в том, что SNR может быть отрицательным: при SF9 пакеты декодируются даже при -12,5 dB. Чтобы понять, близок ли предел дальности, ориентируйся больше на SNR, чем на RSSI; в шумном городе SNR может уже достичь предела даже при RSSI -100 dBm.

ПоказательЗначениеЗначение показания
RSSIОт -30 до -70 dBmОчень сильный сигнал; модули рядом
RSSIОт -70 до -110 dBmХорошая, стабильная связь
RSSIОт -110 до -125 dBmСлабый сигнал; стоит повысить SF
SNR+5 dB и вышеХороший запас; можно увеличить скорость, снизив SF
SNRОт 0 до -10 dBНормальная рабочая область LoRa
SNRБлизко к пределу SF (-12 dB при SF9)Связь на грани обрыва; повысь SF или улучши антенну

LoRa с ESP32: мост к Wi-Fi

Отладочная плата ESP32
ESP32: её пины с уровнем 3,3 V подключаются к Ra-02 без преобразователя уровней, и одновременно она может передавать данные LoRa в интернет через Wi-Fi.

ESP32 — самая простая плата для LoRa: её пины уже работают на 3,3 V, пин 3V3 обеспечивает нужный модулю ток, а шина VSPI (GPIO 18, 19, 23) используется напрямую. Код передатчика и приёмника выше компилируется для ESP32 без изменений; строка #if defined(ESP32) выбирает NSS = 5, RESET = 14 и DIO0 = 26. Мы подключаем DIO0 к GPIO 26, а не GPIO 2, потому что GPIO 2 — пин конфигурации при старте, влияющий на загрузку микросхемы. Главное преимущество ESP32 — работа в качестве моста: она может пересылать поступающие по LoRa данные полевых датчиков на веб-страницу, MQTT-сервер или в Telegram через Wi-Fi. В TTGO LoRa32 и Heltec LoRa 32 на одной плате уже есть ESP32, микросхема LoRa и OLED-дисплей; номера пинов у них отличаются, поэтому сверься со схемой платы.

LoRa с Raspberry Pi Pico (MicroPython)

На Pico модуль Ra-02 подключается к шине SPI0 (GP16 MISO, GP18 SCK, GP19 MOSI, GP17 NSS). В официальном репозитории micropython-lib есть драйвер LoRa для микросхем SX127x; его можно установить через менеджер пакетов Thonny или командой mpremote mip install lora-sync lora-sx127x. Драйвер принимает настройки в виде словаря; если SF, полоса пропускания и слово синхронизации совпадают с Arduino, Pico без проблем читает пакеты передатчика Arduino из примера выше. Драйвер возвращает SNR в том виде, в каком он хранится в регистре микросхемы, — в четыре раза больше значения в dB, поэтому код делит его на 4. Поскольку антенна Ra-02 подключена к выходу PA_BOOST микросхемы, параметр tx_ant должен иметь значение «PA_BOOST»; иначе передача будет очень слабой.

MicroPython
1from machine import Pin, SPI
2from lora import SX1278          # mip: lora-sync + lora-sx127x paketleri / packages
3import time
4
5lora_cfg = {
6    "freq_khz": 433000,          # Ra-02: 433 MHz
7    "sf": 9,                     # Arduino tarafıyla aynı / same as the Arduino side
8    "bw": "125",                 # kHz
9    "coding_rate": 5,            # 4/5
10    "preamble_len": 8,
11    "syncword": 0xF3,
12    "tx_ant": "PA_BOOST",        # Ra-02 anteni PA_BOOST çıkışında / Ra-02 antenna is on PA_BOOST
13    "output_power": 10,          # dBm
14}
15
16spi = SPI(0, baudrate=2_000_000, sck=Pin(18), mosi=Pin(19), miso=Pin(16))
17modem = SX1278(spi=spi, cs=Pin(17), dio0=Pin(21), reset=Pin(20), lora_cfg=lora_cfg)
18
19while True:
20    paket = modem.recv(timeout_ms=10000)       # 10 sn dinle / listen for 10 s
21    if paket and paket.valid_crc:
22        # snr kayıtta 4 katı tutulur / snr is stored as 4x in the register
23        print(bytes(paket), "RSSI:", paket.rssi, "dBm  SNR:", paket.snr / 4, "dB")
24    elif paket:
25        print("CRC hatali paket / bad CRC")
26    else:
27        print("Paket yok / no packet")
28    time.sleep_ms(10)
29

Проверка дальности: на сколько километров работает LoRa?

Единственный способ узнать реальную дальность — проверить её. Поставь передатчик у окна или на крыше дома, подключи приёмник к ноутбуку либо к ESP32 + OLED с питанием от пауэрбанка и записывай RSSI, SNR и долю потерь по мере удаления. Когда потери превышают 10% или SNR приближается к пределу для выбранного SF, практический предел дальности достигнут. В каждом тесте меняй только что-то одно (SF, антенну, высоту), чтобы видеть причину разницы. Расстояние по прямой между двумя точками можно измерить в приложении с картами на телефоне.

УсловияТипичная дальность (Ra-02, SF9–SF12, простая антенна)Определяющий фактор
В помещениях, внутри зданийНесколько этажей, 100–500 мБетонные стены и металл
Плотная городская застройка1–3 кмЗдания, отсутствие прямой видимости
Пригород, деревня3–6 кмДеревья и невысокие здания
Открытая местность, поля5–10 кмВысота антенны над землёй
Прямая видимость между вершинами холмов15 км и болееКривизна Земли и усиление антенны
  • Подними антенну: ничто не увеличивает дальность так сильно, как высота антенны. Антенна на высоте 5 метров вместо 1 метра многократно расширяет прямую видимость.
  • Используй подходящую антенну: маленькие пружинные антенны из комплекта модулей удобны, но неэффективны; четвертьволновой провод длиной 17,3 см или уличная штыревая антенна дают заметную разницу.
  • Повысь SF: переход с SF9 на SF12 даёт около 8 dB выигрыша, что на открытой местности означает увеличение расстояния примерно более чем вдвое.
  • Сузь полосу: переход со 125 kHz на 62,5 kHz даёт 3 dB выигрыша, но дрейф кварцевых резонаторов двух модулей может вызвать проблемы.
  • Освободи зону Френеля: даже при видимой прямой видимости деревья или здания в эллипсообразной зоне между антеннами ослабляют сигнал; небольшой подъём антенн решает проблему.
  • Не забывай о питании: скачок тока при передаче может вызвать просадку слабой шины 3,3 V и сброс модуля; добавь к питанию конденсатор 100 µF.

LoRa и LoRaWAN: что такое TTN?

Эти два термина часто путают. LoRa — только радиомодуляция, физический уровень: два модуля отправляют пакеты напрямую друг другу, а кто, что и кому передаёт, решаешь ты. Все примеры в этом руководстве используют LoRa «точка-точка». LoRaWAN — сетевой протокол поверх LoRa: устройства (конечные узлы) отправляют пакеты ближайшим шлюзам, шлюзы передают их через интернет сетевому серверу, а оттуда данные поступают в твоё приложение. LoRaWAN самостоятельно обеспечивает идентификацию устройств, шифрование AES-128, автоматическую настройку частоты и SF (ADR) и соблюдение ограничений доли времени передачи.

ХарактеристикаLoRa («точка-точка»)LoRaWAN
УровеньТолько радиосвязь (физический уровень)Радиосвязь + сетевой протокол (MAC)
ИнфраструктураДостаточно двух модулейНужны шлюзы и сетевой сервер
ШифрованиеНет, добавляешь самостоятельноAES-128, обязательно
Библиотека ArduinoLoRa (Sandeep Mistry)MCCI LoRaWAN LMIC, RadioLib
Частота в Европе433 или 868 MHz, свободный выборПлан каналов EU868
Лучше всего подходит дляСвоего сада, связи между двумя зданиями, пультов управленияГородских сетей датчиков, множества устройств

The Things Network (TTN) — бесплатная общественная сеть LoRaWAN из шлюзов, установленных добровольцами. Если рядом есть шлюз TTN, можно зарегистрировать устройство и читать его данные через интернет без собственного шлюза. Бесплатное использование ограничено правилами добросовестного использования: около 30 секунд суммарной передачи на устройство в сутки и не более 10 нисходящих сообщений в сутки. Поскольку TTN в Европе использует EU868, а в США — US915, модуль Ra-02 на 433 MHz для неё не подходит; для TTN выбери RFM95 для своего региона или готовый модуль LoRaWAN. Если поблизости нет шлюза, LoRa «точка-точка» гораздо проще.

Проект: полевой и садовый датчик на батарее

Датчик влажности почвы
Датчик влажности почвы: узел LoRa в поле выполняет измерения этим датчиком и отправляет пакет домой каждые 10 минут.

Классическое применение LoRa — получение данных с поля без электроснабжения и Wi-Fi или из теплицы в дальнем конце сада. Код ESP32 ниже измеряет влажность почвы, отправляет небольшой пакет вида «T1,42,37» (ID узла, номер пакета, процент влажности), затем переводит модуль LoRa и ESP32 в сон и пробуждается через 10 минут. Датчик получает питание через GPIO 25 только во время измерения, поэтому во сне не потребляет ток, а у резистивных датчиков ещё и уменьшается коррозия электродов. Калибровка датчика описана в статье «Датчик влажности почвы», а подробности глубокого сна — в статье «Глубокий сон ESP32». Домашний приёмник может использовать приведённый выше код приёмника и разделять значения по запятым.

C++ (Arduino IDE)
1#include <SPI.h>
2#include <LoRa.h>
3
4const int PIN_SS = 5, PIN_RST = 14, PIN_DIO0 = 26;
5const int NEM_PIN = 34;                      // toprak nem sensörü AO (yalnız giriş pini) / soil sensor AO (input-only pin)
6const int SENSOR_GUC = 25;                   // sensörü yalnız ölçerken besle / power the sensor only while measuring
7const int KURU = 3000, ISLAK = 1200;         // kendi sensörünle kalibre et / calibrate with your sensor
8const uint64_t UYKU_US = 10ULL * 60 * 1000000;   // 10 dakika / 10 minutes
9
10RTC_DATA_ATTR uint32_t paketNo = 0;          // derin uykuda korunur / kept during deep sleep
11
12void setup() {
13  pinMode(SENSOR_GUC, OUTPUT);
14  digitalWrite(SENSOR_GUC, HIGH);
15  delay(200);                                // sensör otursun / let the sensor settle
16  int ham = analogRead(NEM_PIN);
17  digitalWrite(SENSOR_GUC, LOW);
18  int nem = constrain(map(ham, KURU, ISLAK, 0, 100), 0, 100);   // % nem / % moisture
19
20  LoRa.setPins(PIN_SS, PIN_RST, PIN_DIO0);
21  if (LoRa.begin(433E6)) {
22    LoRa.setSpreadingFactor(10);             // uzak tarla için daha yüksek SF / higher SF for a distant field
23    LoRa.setSignalBandwidth(125E3);
24    LoRa.setSyncWord(0xF3);
25    LoRa.enableCrc();
26    LoRa.setTxPower(10);
27    LoRa.beginPacket();
28    LoRa.print("T1,");                       // düğüm kimliği / node id
29    LoRa.print(paketNo++);
30    LoRa.print(",");
31    LoRa.print(nem);                         // ör. "T1,42,37" / e.g. "T1,42,37"
32    LoRa.endPacket();
33    LoRa.sleep();                            // SX1278 uykuda 1 uA altı / under 1 uA asleep
34  }
35  esp_sleep_enable_timer_wakeup(UYKU_US);
36  esp_deep_sleep_start();                    // 10 dk sonra setup() baştan başlar / setup() restarts after 10 min
37}
38
39void loop() {}
40

Оценим время работы от батареи. Каждые 10 минут (600 секунд) узел просыпается примерно на 0,5 секунды и в это время потребляет в среднем около 100 mA; во сне отдельный модуль ESP32 вместе с Ra-02 потребляют около 15 µA. Средний ток равен (0,5 × 100) / 600 + 0,015 ≈ 0,1 mA; аккумулятор 18650 ёмкостью 2000 mAh теоретически проработает 20 000 часов, более двух лет. На практике саморазряд аккумулятора и потери стабилизатора сокращают этот срок. Обрати внимание: готовые платы ESP32 DevKit могут потреблять несколько миллиампер даже во сне из-за USB-UART-преобразователя и стабилизатора; ток сна 5 mA сокращает время работы от того же аккумулятора до 17 дней. Для длительной работы используй стабилизатор с малым током покоя или отдельный модуль. Подставить свои значения можно в калькулятор времени работы от батареи.

Идеи проектов с LoRa

  • Уровень воды в удалённом баке: измеряй заполнение удалённого бака с помощью датчика уровня воды и передавай показания домой.
  • Уведомление из почтового ящика: определяй открытие ящика у садовой калитки с помощью геркона и показывай это на дисплее в доме.
  • Весы для улья: передавай вес улья несколько раз в день с помощью тензодатчика с HX711.
  • GPS-трекер: отслеживай велосипед или животных на расстоянии нескольких километров с помощью NEO-6M GPS.
  • Монитор климата в теплице: получай температуру и влажность теплицы по LoRa и включай оповещение дома при пересечении порога.
  • Собственный шлюз: передавай данные нескольких датчиков LoRa в Wi-Fi через одну ESP32 и наблюдай за ними на телефоне.

Частые ошибки и их решение

СимптомВероятная причинаРешение
«LoRa init failed»Неверно подключён SPI, пин NSS или RESET; нет питанияПроверь подключение и значения setPins(), измерь напряжение 3,3 V
Передатчик передаёт, приёмник ничего не видитРазличаются частота, SF, BW, CR или слово синхронизацииУстанови одинаковые настройки с обеих сторон
Модуль греется или совсем не работаетПитание от 5 V или сигналы с уровнем 5 VИспользуй питание 3,3 V и преобразователь уровней; модуль может быть повреждён
Плата перезагружается при передачеШина 3,3 V не справляется со скачком токаОтдельный стабилизатор и конденсатор 100 µF по питанию
Дальность всего несколько метровНет антенны или она рассчитана на другую частотуУстанови антенну на 433 MHz; передача без неё может повредить PA
В пакетах искажённые символыCRC отключён, принимаются пакеты с помехамиВызови enableCrc() с обеих сторон
Некоторые пакеты не доходятПакеты передаются слишком часто и сталкиваются в эфиреУвеличь интервал между пакетами с учётом времени в эфире
Первую проверку проведи с обоими модулями на одном столе и при малой мощности (setTxPower(2)). На очень коротких расстояниях большая мощность может вызвать насыщение входа приёмника и потери пакетов. Когда связь на столе заработает, переходи к увеличению расстояния.

Модуль LoRa — самый дешёвый способ вывести проекты Arduino за пределы дома: в поле, сад и соседнее здание. Правильная частота, подходящий SF и хорошая антенна позволяют создавать датчики, работающие месяцами от батареи на расстоянии нескольких километров. Для быстрой передачи на меньшие расстояния лучше могут подойти nRF24L01 или ESP-NOW. В приложении BlueGrays ты найдёшь проекты односторонней и двусторонней связи между двумя Arduino, умного полива и глубокого сна ESP32 с пошаговыми схемами и кодом; их можно дополнить LoRa.

Частые вопросы

Какова дальность модуля LoRa?

Модуль на SX1278, например Ra-02, с простой антенной обычно работает на 1–3 км в городе и 5–10 км на открытой местности. При высоко установленных антеннах и прямой видимости возможна дальность более 15 км. Больше всего она зависит от высоты и качества антенны и настройки SF.

Чем LoRa отличается от LoRaWAN?

LoRa — только радиомодуляция, и два модуля отправляют пакеты напрямую друг другу. LoRaWAN — сетевой протокол поверх LoRa: устройства передают данные шлюзам, откуда они через интернет поступают на сетевой сервер, а шифрование и управление устройствами обеспечивает протокол. LoRa подходит для своего сада, LoRaWAN — для городских сетей.

Какую частоту LoRa использовать: 433, 868 или 915 MHz?

Это зависит от региона. В Европе используются 433 MHz и 863–870 MHz (EU868 для LoRaWAN), в Северной Америке — 902–928 MHz (US915), а в других регионах есть свои планы, например AU915 или AS923. Покупай модуль и антенну для своего диапазона и соблюдай местные ограничения мощности и доли времени передачи.

Можно ли подключить модуль LoRa к Arduino на 5 V?

Напрямую нельзя: SX1278 работает на 3,3 V, и сигналы 5 V повреждают её. Для Arduino Uno поставь преобразователь уровней на линии SCK, MOSI, NSS и RESET и питай модуль от отдельного стабилизатора 3,3 V. ESP32 и Raspberry Pi Pico работают на 3,3 V, поэтому подключаются напрямую.

Может ли LoRa передавать звук или изображения?

На практике нет. При полосе 125 kHz скорость LoRa составляет около 0,3–5,5 килобит в секунду, а ограничения доли времени передачи определяют, как часто можно передавать данные. Даже маленькая фотография займёт несколько минут; LoRa предназначена для небольших объёмов данных: показаний датчиков, координат и сообщений о состоянии.

Что такое коэффициент расширения спектра (SF) и какое значение выбрать?

SF задаёт длительность передачи каждого символа LoRa; от SF7 до SF12 каждый шаг увеличивает дальность, но вдвое снижает скорость и расходует больше энергии батареи. SF9 — хороший баланс для начала. Повышай SF, если дальности не хватает, и снижай до SF7, если нужна скорость на малом расстоянии; передатчик и приёмник должны использовать одинаковый SF.

Все проекты
Односторонняя связь между двумя Arduino
#57Средний
Premium

Односторонняя связь между двумя Arduino

Ты заставляешь две Arduino разговаривать по одному проводу: нажми кнопку на одной, и на другой загорится светодиод, нажми снова — погаснет. Плата-передатчик сообщает о нажатии кнопки коротким сообщени

4.4(37)
50
Двусторонняя связь между двумя Arduino
#58Средний
Premium

Двусторонняя связь между двумя Arduino

Две Arduino соединены проводами и разговаривают друг с другом: нажми кнопку на одной, и на другой загорится свет, нажми снова — погаснет. На обеих платах одна и та же программа, поэтому каждая и отпра

4.5(20)
26
Умная станция полива
#83Продвинутый
Premium

Умная станция полива

Садовник, который сам поливает растения, чтобы они не засохли, пока ты в отпуске. Датчик влажности почвы измеряет, насколько влажная земля; когда она сохнет, Arduino на несколько секунд включает водян

5.0(42)
57
Глубокий сон ESP32: экономия батареи (OLED + счётчик в RTC RAM)
#135Продвинутый
Premium

Глубокий сон ESP32: экономия батареи (OLED + счётчик в RTC RAM)

Режим глубокого сна (Deep Sleep) у ESP32 снижает потребление до ~10 µA, выключая процессор и большую часть периферии, — это важно для IoT-устройств на батарейках. В этом проекте используются три источника пробуждения: таймер (15 секунд), внешний пин (EXT0 — кнопка GPIO 33) и касание (T0/GPIO 4). Переменные с RTC_DATA_ATTR сохраняются во время глубокого сна — счётчики загрузок, пробуждений по таймеру и по кнопке ведутся непрерывно.

4.3(10)
16
Сигнализация движения на ESP32 (PIR + зуммер + светодиод + Telegram)
#145Продвинутый
Premium

Сигнализация движения на ESP32 (PIR + зуммер + светодиод + Telegram)

Умная охранная сигнализация, которая при обнаружении движения PIR-датчиком включает зуммер и светодиод и одновременно сразу отправляет владельцу уведомление в Telegram. В ней есть 30-секундная пауза, ограничивающая частоту повторных тревог; этот механизм не проверяет срабатывания PIR и не устраняет ложные тревоги. Подходит для дома, гаража, склада или мастерской. С ESP32-CAM можно добавить уведомления с фото, а с обычной ESP32 DevKit V1 приходят текстовые.

0.0(0)
9
Регистратор температуры на ESP32 (DHT22 + DS1307 RTC + microSD + OLED)
#144Продвинутый
Premium

Регистратор температуры на ESP32 (DHT22 + DS1307 RTC + microSD + OLED)

Собери на ESP32 регистратор температуры с отметками времени! Каждую минуту читай температуру и влажность с DHT22, бери реальное время из DS1307 RTC и записывай всё на карту microSD в формате CSV. OLED показывает текущую температуру (крупным шрифтом), влажность в процентах, время и счётчик записей. Файл /temp_log.csv на SD-карте открывается в Excel, Google Sheets или Python pandas — идеально для теплиц, комнат, лабораторий и хранения продуктов.

4.7(7)
12
Управление светодиодом с телефона по Bluetooth
#34Новичок
Premium

Управление светодиодом с телефона по Bluetooth

Небольшая репетиция того, как включать и выключать свет в комнате с телефона. Bluetooth-модуль передаёт в Arduino буквы, отправленные с телефона; одна буква включает красный светодиод, другая — зелёны

4.8(68)
89