ESP32 使用2个LoRa SX1278模块进行单向通信
目录
凌顺实验室(lingshunlab.com)本文主要分享 LoRa 的基本原理和使用方法。使用的Lora模块是SX1278系列。
实验效果
实现2个ESP32使用Lora进行向通信。
发送端发送「hello + 发送次数」,接收端串口输出接收到的数据。
元件说明
ora模块SX1278是一种低功耗、长距离无线通信模块,采用Lora调制技术。Lora(长距离)是一种用于物联网(IoT)应用的无线通信技术,它提供了远距离通信和低功耗的特性。
芯片方案:SX1278
工作频段:410-525MHz
最大输出功率:20dBm
接收灵敏度:-136dBm@0.2kbps
发射电流:120mA
接收电流:13mA
休眠电流:1uA
典型供电电压:3.3V
Lora模块SX1278具有以下特点:
- 长距离通信:Lora技术具备卓越的传输距离,能够在室外环境下实现数公里的通信范围,这使得它非常适合需要远距离通信的应用场景。
- 低功耗:SX1278芯片采用了一系列的低功耗设计,包括低功耗睡眠模式和快速唤醒机制,以降低模块的能耗,延长电池寿命。
- 抗干扰能力强:Lora调制技术具备出色的抗干扰能力,能够在复杂的无线环境中实现可靠的通信。
- 多频段支持:SX1278芯片可在多个频段操作,以适应不同国家和地区的频率规定。
- 简化射频设计:SX1278芯片集成了大部分射频前端功能,简化了模块设计的复杂性,减少了开发周期和成本。
- 开放的通信协议:Lora模块通常使用LoraWAN协议,这是一种开放的、基于云的物联网通信协议,提供了安全、可靠的通信连接。
引脚说明
序号 | 接口名 | 功能 |
---|---|---|
1 | GND | 电源GND |
2 | GND | 电源GND |
3 | GND | 电源GND |
4 | GND | 电源GND |
5 | DIO0 | 可编程决定 |
6 | DIO1 | 可编程决定 |
7 | DIO2 | 可编程决定 |
8 | DIO03 | 可编程决定 |
9 | NC | 模块内部使用。电路设计上此引脚不能连接到任何电气网络 |
10 | DIO05 | 可编程决定 |
11 | GND | 电源GND |
12 | GND | 电源GND |
13 | VCC | 模块电源引脚。供电不可超过3.7V,否则烧坏模块 |
14 | CLK | SPI总线时钟引脚,常态为高电平 |
15 | MISO | SPI总线从机输出引脚。当MCU读取模块数据时,模块数据 由此引脚输出 |
16 | MOSI | SPI总线从机输入引脚。当MCU向模块写数据时,数据从此 引脚写入 |
17 | SEL | SPI片选引脚,低电平有效 |
18 | RST | 复位引脚,低电平有效 |
19 | GND | 电源GND |
20 | GND | 电源GND |
21 | ANT | 天线端 |
22 | GND | 电源GND |
BOM表
- ESP32 x2
- Lora SX1278模块 x2
- Lora 433 天线 x2
- 跳线(杜邦线) x若干
- 面包板 x2
接线图
ESP32 | Lora SX1278模块 |
---|---|
Pin 2 | GIO 0 |
Pin 5 | RST |
Pin 4 | SEL |
Pin 23 | MOSI |
Pin 19 | MISO |
Pin 18 | CLK |
3.3V | VCC |
GND | GND |
使用的库
使用GitHub安装
「Arduino-LoRa」
https://github.com/sandeepmistry/arduino-LoRa
把该Github打包下载,解压到Arduino IDE的「libraries」文件夹中即可
使用Arduino IDE安装
在库的搜索框中输入「Lora」,找到如下图的库:
代码提点
指定频率初始化收发模块。
if (!LoRa.begin(433E6)) {
Serial.println("Starting LoRa failed!");
while (1);
}
您可能需要更改频率以匹配您所在位置使用的频率。选择以下选项之一:
- 433E6
- 866E6
- 915E6
设置同步字
LoRa 收发器模块监听其范围内的数据包。数据包来自哪里并不重要。为了确保您只接收来自发送方的数据包,您可以设置同步字(范围从 0 到 0xFF)。
LoRa.setSyncWord(0xF3);
接收方和发送方都需要使用相同的同步字。这样,接收器就会忽略任何不包含该同步字的 LoRa 数据包。
程序代码
LoRa 发送端代码
// welcome to https://lingshunlab.com
#include <SPI.h>
#include <LoRa.h>
int counter = 0;
#define ss 4
#define rst 5
#define dio0 2
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("LoRa Sender");
LoRa.setPins(ss, rst, dio0);
if (!LoRa.begin(433E6)) {
Serial.println("Starting LoRa failed!");
while (1);
}
}
void loop() {
Serial.print("Sending packet: ");
Serial.println(counter);
// send packet
LoRa.beginPacket();
LoRa.print("hello ");
LoRa.print(counter);
LoRa.endPacket();
counter++;
delay(1000);
}
LoRa 接收端代码
// welcome to https://lingshunlab.com
#include <SPI.h>
#include <LoRa.h>
#define ss 4
#define rst 5
#define dio0 2
void setup() {
Serial.begin(115200);
while (!Serial);
delay(500);
Serial.println("LoRa Receiver");
LoRa.setPins(ss, rst, dio0);
if (!LoRa.begin(433E6)) {
Serial.println("Starting LoRa failed!");
while (1);
}
}
void loop() {
// try to parse packet
int packetSize = LoRa.parsePacket();
if (packetSize) {
// received a packet
Serial.print("Received packet '");
// read packet
while (LoRa.available()) {
Serial.print((char)LoRa.read());
}
// print RSSI of packet
Serial.print("' with RSSI ");
Serial.println(LoRa.packetRssi());
}
}
把代码分别上传至2个ESP32,然后观察各自的串口监视器,即可看到数据的传输信息。