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) | nRF24L01 | 433 MHz ASK | Wi-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 mA | 10–40 mA | 120–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-02 | SX1278 | 433 MHz | SPI | Самый дешёвый и распространённый; антенный разъём IPEX |
| Ai-Thinker Ra-01 | SX1278 | 433 MHz | SPI | Вариант Ra-02 с пружинной антенной |
| HopeRF RFM95W | SX1276 | 868 / 915 MHz | SPI | Популярный выбор для LoRaWAN и TTN |
| Ebyte E32 / E220 | SX1278 / LLCC68 | 433 / 868 MHz | UART | Собственный процессор; работает как последовательный порт без библиотеки |
| TTGO LoRa32, Heltec LoRa 32 | ESP32 + SX1276/78 | 433 / 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 |
Какую частоту выбрать: 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 MHz | EU868 (EU433 встречается редко) |
| США, Канада, Мексика | 902–928 MHz | US915 |
| Бразилия, Аргентина, Австралия | 915–928 MHz | AU915 |
| Индия | 865–867 MHz | IN865 |
| Япония, Юго-Восточная Азия | 920–923 MHz | AS923 |
| Китай | 470–510 MHz (и 433 MHz) | CN470 |
SF, BW и CR: три настройки, определяющие дальность
Дальность и скорость LoRa задаются тремя параметрами. Коэффициент расширения спектра (SF) определяет, из скольких «чипов» состоит каждый символ: от SF7 до SF12 каждый шаг удваивает длительность символа, позволяет приёмнику декодировать сигнал примерно на 2,5 dB слабее, но почти удваивает время в эфире. Таблица ниже рассчитана для полосы 125 kHz, кодирования 4/5 и пакета размером 20 байт; в последнем столбце указана минимальная пауза между двумя пакетами для соблюдения доли времени передачи 1%.
| SF | Битовая скорость | Время передачи 20 байт | Примерная чувствительность | Минимальный SNR для декодирования | Пауза при доле передачи 1% |
|---|---|---|---|---|---|
| SF7 | 5,5 кбит/с | 57 мс | -123 dBm | -7,5 dB | 6 с |
| SF8 | 3,1 кбит/с | 103 мс | -126 dBm | -10 dB | 10 с |
| SF9 | 1,8 кбит/с | 185 мс | -129 dBm | -12,5 dB | 18 с |
| SF10 | 977 бит/с | 371 мс | -132 dBm | -15 dB | 37 с |
| SF11 | 537 бит/с | 741 мс | -134 dBm | -17,5 dB | 73 с |
| SF12 | 293 бит/с | 1319 мс | -137 dBm | -20 dB | 131 с |
Полоса пропускания (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 бит/с.
Подключение Ra-02: Arduino Uno, ESP32 и Pico
Помимо четырёх линий SPI (SCK, MISO, MOSI, NSS), Ra-02 нужны пин сброса и пин прерывания (DIO0). DIO0 переходит в HIGH после завершения передачи или при поступлении нового пакета; библиотека LoRa использует его для прерывания. Для кода из этого руководства пины DIO1–DIO5 модуля можно не подключать. Если SPI тебе пока незнаком, сначала прочитай статью «Что такое SPI».
| Пин Ra-02 | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| 3.3V | Внешний стабилизатор 3,3 V | 3V3 | 3V3 (OUT) |
| GND | GND | GND | GND |
| SCK | D13 (через преобразователь уровней) | GPIO 18 | GP18 |
| MISO | D12 (напрямую) | GPIO 19 | GP16 |
| MOSI | D11 (через преобразователь уровней) | GPIO 23 | GP19 |
| NSS | D10 (через преобразователь уровней) | GPIO 5 | GP17 |
| RESET | D9 (через преобразователь уровней) | GPIO 14 | GP20 |
| DIO0 | D2 (напрямую, пин прерывания) | GPIO 26 | GP21 |
Антенна важна не меньше подключения. Подсоедини к разъёму IPEX модуля Ra-02 антенну, настроенную на 433 MHz. Сделать её самостоятельно легко: длина волны равна 300 / 433 = 0,693 метра, и для четвертьволновой антенны достаточно прямого провода длиной 17,3 см (8,6 см для 868 MHz, 8,2 см для 915 MHz). Держи антенну вертикально, не помещай её в металлическую коробку и направляй антенны с обеих сторон одинаково (обе вертикально); при расположении под прямым углом друг к другу теряется большая часть сигнала.
Пошагово: передатчик с библиотекой LoRa
- Открой «Менеджер библиотек» (Library Manager) в Arduino IDE, введи LoRa и установи библиотеку LoRa от Sandeep Mistry.
- Подключи модуль по таблице и никогда не включай передачу без установленной антенны.
- Загрузи приведённый ниже код в плату передатчика; он определяет, ESP32 это или Uno, и выбирает соответствующие пины.
- Открой «Монитор порта» (Serial Monitor) на скорости 115200 бод; каждые 5 секунд должна появляться строка «Gonderildi / sent».
- Если LoRa.begin() завершается ошибкой, проверь провода, питание 3,3 V и пины NSS и RESET.
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(). Код также подсчитывает пропуски в номерах пакетов, чтобы вычислить долю потерь — основу проверки дальности, которую мы вскоре проведём.
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}
50RSSI (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 — самая простая плата для 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»; иначе передача будет очень слабой.
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, обязательно |
| Библиотека Arduino | LoRa (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 — получение данных с поля без электроснабжения и Wi-Fi или из теплицы в дальнем конце сада. Код ESP32 ниже измеряет влажность почвы, отправляет небольшой пакет вида «T1,42,37» (ID узла, номер пакета, процент влажности), затем переводит модуль LoRa и ESP32 в сон и пробуждается через 10 минут. Датчик получает питание через GPIO 25 только во время измерения, поэтому во сне не потребляет ток, а у резистивных датчиков ещё и уменьшается коррозия электродов. Калибровка датчика описана в статье «Датчик влажности почвы», а подробности глубокого сна — в статье «Глубокий сон ESP32». Домашний приёмник может использовать приведённый выше код приёмника и разделять значения по запятым.
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() с обеих сторон |
| Некоторые пакеты не доходят | Пакеты передаются слишком часто и сталкиваются в эфире | Увеличь интервал между пакетами с учётом времени в эфире |
Модуль 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
Ты заставляешь две Arduino разговаривать по одному проводу: нажми кнопку на одной, и на другой загорится светодиод, нажми снова — погаснет. Плата-передатчик сообщает о нажатии кнопки коротким сообщени

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

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

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

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

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

Управление светодиодом с телефона по Bluetooth
Небольшая репетиция того, как включать и выключать свет в комнате с телефона. Bluetooth-модуль передаёт в Arduino буквы, отправленные с телефона; одна буква включает красный светодиод, другая — зелёны
Другие статьи
Приложение BlueGrays
Собери эту схему шаг за шагом в телефоне
Схема подключения, код и список деталей на одном экране. 200+ проектов на Arduino, ESP32 и Pico готовы к сборке.
Наведи камеру телефона
Наведи камеру на код — откроется магазин приложений на телефоне.
или открыть магазин

