ESP32 使用2个LoRa SX1278模块进行单向通信

凌顺实验室(lingshunlab.com)本文主要分享 LoRa 的基本原理和使用方法。使用的Lora模块是SX1278系列。

实验效果

实现2个ESP32使用Lora进行向通信。

发送端发送「hello + 发送次数」,接收端串口输出接收到的数据。

WX20231204-1723152x

WX20231204-1652032x

元件说明

WX20231204-1714392x

ora模块SX1278是一种低功耗、长距离无线通信模块,采用Lora调制技术。Lora(长距离)是一种用于物联网(IoT)应用的无线通信技术,它提供了远距离通信和低功耗的特性。

芯片方案:SX1278
工作频段:410-525MHz
最大输出功率:20dBm
接收灵敏度:-136dBm@0.2kbps
发射电流:120mA
接收电流:13mA
休眠电流:1uA
典型供电电压:3.3V

Lora模块SX1278具有以下特点:

  1. 长距离通信:Lora技术具备卓越的传输距离,能够在室外环境下实现数公里的通信范围,这使得它非常适合需要远距离通信的应用场景。
  2. 低功耗:SX1278芯片采用了一系列的低功耗设计,包括低功耗睡眠模式和快速唤醒机制,以降低模块的能耗,延长电池寿命。
  3. 抗干扰能力强:Lora调制技术具备出色的抗干扰能力,能够在复杂的无线环境中实现可靠的通信。
  4. 多频段支持:SX1278芯片可在多个频段操作,以适应不同国家和地区的频率规定。
  5. 简化射频设计:SX1278芯片集成了大部分射频前端功能,简化了模块设计的复杂性,减少了开发周期和成本。
  6. 开放的通信协议:Lora模块通常使用LoraWAN协议,这是一种开放的、基于云的物联网通信协议,提供了安全、可靠的通信连接。

引脚说明

esp32-lora-SX1278-pinout

序号 接口名 功能
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-wiring-diagram

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」,找到如下图的库:

WX20231204-1642322x

代码提点

指定频率初始化收发模块。

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,然后观察各自的串口监视器,即可看到数据的传输信息。