RisalDash RisalDash

Проект · LoRa · Дальняя связь

Километры радио — совсем без интернета

Wi-Fi умирает у забора. LoRa-модуль за $4 продолжает говорить километрами — датчики на ферме, домик в горах, лодка на якоре — без шлюза, SIM-карты и абонплаты. Эта сборка связывает два ESP32 точка-точка и выводит RSSI, SNR и живой журнал трафика на дашборд каждого узла — видно, как тает связь, пока вы уходите.

ПроектLoRaSX1278РадиоESP32
Проект LoRa точка-точка на ESP32: SX1278, RSSI и SNR вживую, без интернета

Подключение — обычный SPI плюс два управляющих пина

SX1278 — SPI-устройство: общие SCK/MISO/MOSI, свой NSS chip-select, линия RST и DIO0 как прерывание «пакет готов». Одно физическое правило важнее всего: никогда не передавать без антенны — усилитель умирает за секунды.

LoRa SX1278 подключён к ESP32 по SPI с NSS, RST и DIO0
SX1278 на VSPI ESP32. Собрано в BoardLab.

Протокол — бикон, а не стек

P2P LoRa не требует LoRaWAN-стека. Каждый узел биконит ID:счётчик; всё услышанное не со своим ID — это пир. Аппаратный CRC молча отбрасывает битые пакеты, а таймаут в 10 секунд управляет LED «peer online»:

#define NODE_ID 'A'             // flash 'A' on one board, 'B' on the other
#define FREQ 433E6              // match your module + region!

LoRa.setPins(LORA_NSS, LORA_RST, LORA_DIO0);
if (!LoRa.begin(FREQ)) { evlog->print("LoRa init FAILED"); return; }
LoRa.enableCrc();               // drop corrupt packets in hardware

// Beacon "A:123" every couple of seconds:
LoRa.beginPacket();
LoRa.print(String((char)NODE_ID) + ":" + String(++txNo));
LoRa.endPacket();
int sz = LoRa.parsePacket();
if (sz) {
  String msg;
  while (LoRa.available()) msg += (char)LoRa.read();
  if (msg.length() && msg[0] != NODE_ID) {      // anything not ours = the peer
    recv += 1;
    rssi = LoRa.packetRssi();                   // link strength, dBm
    snr  = LoRa.packetSnr();                    // quality above the noise floor
    if (evlog) evlog->print(msg + "  " + String((int)rssi) + " dBm");
  }
}
online = millis() - lastHear < 10000;           // peer-online LED

Прошейте готовый скетч (examples/06_Projects/LoRaLink, библиотека sandeepmistry/LoRa) на две платы — NODE_ID 'A' и 'B' — и каждая отдаст свой дашборд-AP. ⚠ Ставьте FREQ по региону: 433 МГц (Азия/EU ISM), 868 МГц (EU), 915 МГц (US).

Читаем RSSI и SNR

ПоказаниеДиапазонСмысл
RSSI −40…−90 dBmсильныйзапас с головой
RSSI −90…−110 dBmрабочийнормальная «дальняя» зона
RSSI −110…−125 dBmкрайLoRa декодирует и ниже шума — смотрите SNR
SNR > 0 dBчистосигнал выше шума
SNR 0…−15 dBмагия LoRaздесь выживает только LoRa

Рычаги дальности: больший spreading factor (SF7→SF12) покупает километры ценой эфирного времени; уже и полоса помогает. Для батарейного узла — пара с deep sleep: бикон, сон, повтор. Как LoRa соотносится с ESP-NOW, Zigbee и остальными — гайд по беспроводным протоколам; mesh поверх LoRa — Meshtastic.

Две платы, две антенны — и связь, за которой следишь по dBm.