嵌入式开发 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,取决于地区)。
它的核心优势就两个字:远和省。
| 特性 | LoRa | WiFi | 蓝牙 |
|---|---|---|---|
| 通信距离 | 1-15km(视距) | 30-100m | 10-30m |
| 功耗 | 极低(μA 级休眠) | 高 | 中等 |
| 带宽 | 0.3-50 kbps | 100+ Mbps | 1-3 Mbps |
| 适合场景 | 远距离传感器 | 高速传输 | 短距离连接 |
扩频调制:为什么 LoRa 能传这么远?
LoRa 使用线性调频扩频(CSS, Chirp Spread Spectrum)技术。简单说就是:
**
把数据编码成频率随时间变化的”鸟鸣”信号(Chirp)。
这种信号有两个天然优势:
-
$1
-
$1
关键参数
| 参数 | 含义 | 推荐值 |
|---|---|---|
| 频率 | 中国可用 470-510MHz | 470MHz(CN470) |
| 带宽(BW) | 125/250/500kHz,越窄越远 | 125kHz(远距离) |
| 扩频因子(SF) | SF7-SF12,越大越远但越慢 | SF9(折中) |
| 发射功率 | 2-20dBm | 17-20dBm |
**
注意:** SX1278 工作在 433MHz(欧洲/亚洲),SX1276 支持 868/915MHz(欧美)。买模块时一定要看清楚型号。
二、SX1278 模块选型与参数对比
常见 SX1278 模块对比
| 模块型号 | 天线类型 | PCB 尺寸 | 特色 | 参考价格 |
|---|---|---|---|---|
| Ra-02(AI-Thinker) | PCB 板载天线 | 16×16mm | 便宜,最常用 | ¥12-15 |
| RFM95W | U.FL/IPEX 接口 | 18×16mm | 可接外置天线,距离更远 | ¥18-25 |
| eByte E22-400M22S | SMA 外置天线 | 35×16mm | 功率 22dBm,距离可达 10km+ | ¥25-35 |
我的建议:
-
新手入门 → Ra-02 够用,板载天线省心
-
需要远距离 → 选带 SMA 接口的模块 + 外置天线(3dBi 或 5dBi)
-
工业场景 → eByte 系列,封装更可靠
SX1278 vs SX1262:该选哪个?
SX1262 是 Semtech 的第二代 LoRa 芯片,相比 SX1278 的改进:
| 对比项 | SX1278 | SX1262 |
|---|---|---|
| 功耗 | 休眠 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 引脚 | 说明 |
|---|---|---|
| GND | GND | 共地 |
| 3.3V | 3.3V | 不要用 5V! 会烧毁模块 |
| MISO | GPIO19 | SPI 数据输出 |
| MOSI | GPIO23 | SPI 数据输入 |
| SCK | GPIO18 | SPI 时钟 |
| NSS | GPIO5 | SPI 片选 |
| NRESET | GPIO27 | 复位 |
| DIO0 | GPIO26 | 中断(收发完成) |
| 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
-
$1
-
$1
或者直接在 platformio.ini 中添加:
lib_deps = sandeepmistry/LoRa@^0.8.0
发送端代码(带 DHT22 温湿度采集)
#include
#include
#include
// 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
#include
#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
-
$1
-
$1
-
$1
五、通信距离实测
测试环境
| 场景 | 描述 | 距离 | 结果 |
|---|---|---|---|
| 室内 | 同一楼层,隔两堵墙 | 30m | ✅ 稳定接收,RSSI -65dBm |
| 楼道 | 同一栋楼,不同楼层 | 50m | ✅ 稳定接收,RSSI -78dBm |
| 室外视距 | 开阔地带,无遮挡 | 500m | ✅ 稳定接收,RSSI -85dBm |
| 郊区有遮挡 | 有树木、建筑物 | 1km | ⚠️ 偶有丢包,RSSI -105dBm |
| 农田开阔 | 无遮挡,天线架高 3m | 3km+ | ✅ 基本稳定,RSSI -110dBm |
提升通信距离的技巧
-
$1
-
$1
-
$1
-
$1
-
$1
为什么实际距离远小于理论值?
芯片手册上写的 “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-100m | LoRa 覆盖 500m-3km |
部署建议
以一个 50 亩(约 330m × 100m)的温室大棚为例:
-
$1
-
$1
-
$1
-
$1
功耗优化
// 发送数据后立即进入深度休眠
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 远程数据采集](https://makeronsite.com/tag/4g/) → 网关数据回传的另一种选择