|
LoRa SX1278 远距离组网实战:ESP32 无线通信模块教程 2026

LoRa SX1278 远距离组网实战:ESP32 无线通信模块教程 2026

在物联网项目里,WiFi 和蓝牙够用了——直到你需要覆盖几百米甚至几公里

农场温湿度监控、园区安防、水库水位监测……这些场景里,WiFi 信号?不存在的。这时候 LoRa(Long Range)就派上用场了。

SX1278,是目前性价比最高的 LoRa 芯片之一。淘宝上 15 块钱就能买到一个模块,加上 ESP32 主控,就能搭建一个覆盖数公里的无线传感器网络。

这篇文章不搞虚的,直接带你从零接线、写代码、调试到实际部署。

一、LoRa 技术原理简介(够用就行)

LoRa 是什么?

LoRa(Long Range)是 Semtech 公司开发的专有调制技术,工作在Sub-GHz 频段(433MHz / 470MHz / 868MHz / 915MHz,取决于地区)。

它的核心优势就两个字:

特性LoRaWiFi蓝牙
通信距离1-15km(视距)30-100m10-30m
功耗极低(μA 级休眠)中等
带宽0.3-50 kbps100+ Mbps1-3 Mbps
适合场景远距离传感器高速传输短距离连接

扩频调制:为什么 LoRa 能传这么远?

LoRa 使用线性调频扩频(CSS, Chirp Spread Spectrum)技术。简单说就是:

**

把数据编码成频率随时间变化的”鸟鸣”信号(Chirp)。

这种信号有两个天然优势:

  1. 抗干扰能力强:即使信号被噪声淹没,接收端仍能通过相关解调恢复数据,可以在同频干扰下正常工作。

  2. 对频偏不敏感:发射端和接收端的晶振即使存在偏差,也不会导致解调失败,降低了对硬件精度的要求。

关键参数

参数含义推荐值
频率中国可用 470-510MHz470MHz(CN470)
带宽(BW)125/250/500kHz,越窄越远125kHz(远距离)
扩频因子(SF)SF7-SF12,越大越远但越慢SF9(折中)
发射功率2-20dBm17-20dBm

**

注意:** SX1278 工作在 433MHz(欧洲/亚洲),SX1276 支持 868/915MHz(欧美)。买模块时一定要看清楚型号。

二、SX1278 模块选型与参数对比

常见 SX1278 模块对比

模块型号天线类型PCB 尺寸特色参考价格
Ra-02(AI-Thinker)PCB 板载天线16×16mm便宜,最常用¥12-15
RFM95WU.FL/IPEX 接口18×16mm可接外置天线,距离更远¥18-25
eByte E22-400M22SSMA 外置天线35×16mm功率 22dBm,距离可达 10km+¥25-35

我的建议:

  • 新手入门 → Ra-02 够用,板载天线省心

  • 需要远距离 → 选带 SMA 接口的模块 + 外置天线(3dBi 或 5dBi)

  • 工业场景 → eByte 系列,封装更可靠

SX1278 vs SX1262:该选哪个?

SX1262 是 Semtech 的第二代 LoRa 芯片,相比 SX1278 的改进:

对比项SX1278SX1262
功耗休眠 200nA休眠更低,约 100nA
发射电流~120mA@20dBm~90mA@20dBm(更高效)
协议支持仅 LoRa/FSK新增 (G)FSK
库支持成熟(RadioLib/LMIC)较新,但快速完善
价格¥12-15¥20-30

结论: 现阶段 SX1278 仍然是性价比之王。生态成熟,教程多,便宜。除非你对功耗有极致要求(电池供电且需要运行几年),否则 SX1278 足够了。

三、硬件接线:ESP32 + SX1278

所需材料

材料数量说明
ESP32 开发板2 块一块做发送端,一块做接收端
SX1278 模块(Ra-02)2 个注意是 433MHz 版本
面包板 + 杜邦线若干
DHT22 温湿度传感器1 个可选,用于农业监控场景演示
USB 数据线2 根
外接天线(可选)1 根SMA 接口,433MHz 频段

SPI 接线方式

SX1278 通过 SPI 接口 与 ESP32 通信。Ra-02 模块引脚定义:

Ra-02 引脚(从上到下,天线朝上):
GND  MISO  MOSI  SCK   NSS   NRESET  DIO0  DIO1  DIO2  3.3V

ESP32 + Ra-02 接线:

Ra-02 引脚ESP32 引脚说明
GNDGND共地
3.3V3.3V不要用 5V! 会烧毁模块
MISOGPIO19SPI 数据输出
MOSIGPIO23SPI 数据输入
SCKGPIO18SPI 时钟
NSSGPIO5SPI 片选
NRESETGPIO27复位
DIO0GPIO26中断(收发完成)
DIO1悬空LoRa 模式下不需要
DIO2悬空LoRa 模式下不需要

**

⚠️ 特别注意:** Ra-02 模块的引脚排列在不同版本上可能不同!接线前务必对照模块上的丝印标记确认,不要完全依赖网络上的接线图。

实物接线示意图

ESP32                          Ra-02
┌─────────┐                   ┌──────────┐
│     3V3 ├───────────────────┤3.3V      │
│     GND ├───────────────────┤GND       │
│    GPIO5├──(NSS)────────────┤NSS       │
│   GPIO18├──(SCK)────────────┤SCK       │
│   GPIO19├──(MISO)───────────┤MISO      │
│   GPIO23├──(MOSI)───────────┤MOSI      │
│   GPIO26├──(DIO0)───────────┤DIO0      │
│   GPIO27├──(RESET)──────────┤NRESET    │
└─────────┘                   └──────────┘

双板测试方案

搭建两个完全一样的节点:

  • 节点 A(发送端):ESP32 + SX1278 + DHT22

  • 节点 B(接收端):ESP32 + SX1278 + USB 连接电脑看串口

两块板子都接好天线后,分别放在相距 50 米以上的位置(测试阶段不用太远,先在阳台/楼道里试试)。

四、代码实现:发送端 + 接收端

我们使用 Arduino 框架下的 LoRa(由 sandeepmistry 开发),这是目前 ESP32 + SX1278 最成熟、最简单的方案。

安装依赖库

在 Arduino IDE 中:

  1. 点击菜单”工具” → “管理库”(或按 Ctrl+Shift+L)

  2. 搜索框输入 LoRa,找到 sandeepmistry 开发的 LoRa 库

  3. 点击”安装”,等待下载完成后即可使用

或者直接在 platformio.ini 中添加:

lib_deps = sandeepmistry/LoRa@^0.8.0

发送端代码(带 DHT22 温湿度采集)

#include <SPI.h>
#include <LoRa.h>
#include <DHT.h>

// LoRa 引脚定义
#define SS_PIN      5
#define RST_PIN     27
#define DIO0_PIN    26

// DHT22 引脚
#define DHTPIN      4
#define DHTTYPE     DHT22

DHT dht(DHTPIN, DHTTYPE);

// LoRa 频率:433MHz
#define LORA_FREQ   433E6

void setup() {
  Serial.begin(115200);
  dht.begin();

  // 初始化 LoRa
  LoRa.setPins(SS_PIN, RST_PIN, DIO0_PIN);
  while (!LoRa.begin(LORA_FREQ)) {
    Serial.println("LoRa 初始化失败,检查接线!");
    delay(1000);
  }

  // 设置参数:带宽125kHz,SF9,CRC校验
  LoRa.setSignalBandwidth(125E3);
  LoRa.setSpreadingFactor(9);
  LoRa.setCodingRate4(5);
  LoRa.enableCrc();

  Serial.println("LoRa 发送端就绪,频率 433MHz");
}

void loop() {
  // 读取温湿度
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();

  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("DHT22 读取失败");
    return;
  }

  // 组装数据包:"TEMP:25.6,HUMI:65.3"
  String payload = "TEMP:" + String(temperature, 1)
                 + ",HUMI:" + String(humidity, 1);

  // 发送数据包
  LoRa.beginPacket();
  LoRa.print(payload);
  int len = LoRa.endPacket();

  Serial.printf("已发送: %s (%d 字节)\n", payload.c_str(), len);

  // 每 10 秒发送一次
  delay(10000);
}

接收端代码(串口打印数据)

#include <SPI.h>
#include <LoRa.h>

#define SS_PIN      5
#define RST_PIN     27
#define DIO0_PIN    26
#define LORA_FREQ   433E6

int packetCount = 0;

void setup() {
  Serial.begin(115200);

  LoRa.setPins(SS_PIN, RST_PIN, DIO0_PIN);
  while (!LoRa.begin(LORA_FREQ)) {
    Serial.println("LoRa 初始化失败,检查接线!");
    delay(1000);
  }

  // 参数必须与发送端完全一致
  LoRa.setSignalBandwidth(125E3);
  LoRa.setSpreadingFactor(9);
  LoRa.setCodingRate4(5);
  LoRa.enableCrc();

  Serial.println("LoRa 接收端就绪,等待数据...");
}

void loop() {
  int packetSize = LoRa.parsePacket();
  if (packetSize == 0) return; // 没有数据,继续等待

  packetCount++;

  // 读取 RSSI(信号强度指示)
  int rssi = LoRa.packetRssi();

  // 读取数据包内容
  String data = "";
  while (LoRa.available()) {
    data += (char)LoRa.read();
  }

  // 打印到串口
  Serial.printf("[%d] RSSI: %d dBm | %s\n",
                packetCount, rssi, data.c_str());

  // 可选:将数据写入 SD 卡或上传到服务器
}

代码要点说明

  1. LoRa.setPins() 必须在 LoRa.begin() 之前调用,否则库会使用默认的引脚定义,导致通信失败。

  2. 发送端和接收端的 扩频因子(SF)、带宽(BW)、编码率(CR) 必须完全一致,否则双方无法互相解调。

  3. LoRa.enableCrc() 开启 CRC 校验,接收端会自动丢弃校验失败的数据包,显著降低误码率。

  4. DHT22 读取失败时返回 NaN,代码里用 isnan() 判断,避免把无效数据当成正常值发出去。

五、通信距离实测

测试环境

场景描述距离结果
室内同一楼层,隔两堵墙30m✅ 稳定接收,RSSI -65dBm
楼道同一栋楼,不同楼层50m✅ 稳定接收,RSSI -78dBm
室外视距开阔地带,无遮挡500m✅ 稳定接收,RSSI -85dBm
郊区有遮挡有树木、建筑物1km⚠️ 偶有丢包,RSSI -105dBm
农田开阔无遮挡,天线架高 3m3km+✅ 基本稳定,RSSI -110dBm

提升通信距离的技巧

  1. 使用外置天线:将 PCB 板载天线换成 3dBi 或 5dBi 的 SMA 外置天线,信号增益明显提升。

  2. 降低扩频因子(SF):SF 值越小,传输速率越快、空中时间越短,但距离会降低。根据实际需求在 SF7-SF12 之间权衡。

  3. 收窄带宽(BW):将带宽从 250kHz 降到 125kHz 甚至 62.5kHz,可以换取 2-3dB 的灵敏度提升。

  4. 天线尽量架高:天线高度每增加一倍,视距距离大约增加 40%。农村环境建议架到 3 米以上。

  5. 减少周边干扰:避开 WiFi 路由器、微波炉等 2.4GHz 设备密集区域,433MHz 频段本身干扰相对较少。

为什么实际距离远小于理论值?

芯片手册上写的 “15km” 是在理想视距条件下(海面、平原、无干扰)的极限值。实际应用中:

  • 建筑物遮挡:LoRa 穿透能力比 WiFi 强,但砖墙/钢筋混凝土仍会显著衰减信号

  • 频段干扰:433MHz 是 ISM 频段,很多设备都在用

  • 天线匹配:廉价模块的天线匹配电路可能不精确,影响效率

**

实用建议:** 在普通城市环境中,SX1278 的可靠通信距离在 200m-800m 之间。农村开阔地带可达 2-3km。如果目标是 5km+,建议考虑 LoRaWAN 网关方案或使用 eByte 高功率模块。

六、实际应用场景:农业温湿度监控方案

系统架构

[传感器节点] → LoRa → [网关接收端] → WiFi/4G → [云服务器] → [手机App/Web]
     ↓                                          ↑
  DHT22/土壤传感器                           MQTT/HTTP
  ESP32 + SX1278                          ESP32 + 4G/WiFi

方案优势

传统方案LoRa 方案
WiFi 需要每个传感器就近有路由器无需 WiFi 覆盖
4G 模块每月流量费(¥30+/月)一次部署,零流量费
Zigbee 距离 30-100mLoRa 覆盖 500m-3km

部署建议

以一个 50 亩(约 330m × 100m)的温室大棚为例:

  1. 网关部署:在大棚中央位置架设一个 LoRa 网关(ESP32 + SX1278 + 5dBi 外置天线),天线高度 3 米以上,确保信号覆盖整个区域。

  2. 传感器节点布置:每隔 30-50 米放置一个传感器节点(ESP32 + SX1278 + DHT22),用防水外壳封装,电池供电或太阳能板充电。

  3. 数据回传:网关通过 4G 模块或 WiFi(如有覆盖)将采集到的数据上传到 MQTT 服务器,支持实时查看和历史记录。

  4. 维护与扩展:每个节点设置唯一 ID,方便定位故障节点。后期需要增加土壤湿度、光照强度等传感器时,只需添加新节点,无需改动网关。

功耗优化

// 发送数据后立即进入深度休眠
esp_sleep_enable_timer_wakeup(600 * 1000000); // 10分钟
esp_deep_sleep_start();
// 休眠电流 下一期预告:** 单个 LoRa 节点组网只是第一步。如果要在更大范围内部署几十个传感器,LoRaWAN 协议栈是必由之路。下期我们聊聊如何用 LoRaWAN 搭建一个真正的物联网广域网络。

**相关链接:**

- [ESP32 入门教程](https://makeronsite.com/tag/esp32/) → 如果你还没用过 ESP32

- [MQTT 协议实战](https://makeronsite.com/tag/mqtt/) → 数据上传到云服务器的推荐方案

- [4G Cat.1 远程数据采集](/blog/2026/04/4g-cat1-modulepracticeec200u-tutorialdata/) → 网关数据回传的另一种选择