在本教程中,我们将探讨 LoRa 的基本原理,以及如何使用 Arduino IDE 将其与 ESP32 一起用于 IoT 项目。为了帮助您入门,我们还将向您展示如何使用 RFM95 收发器模块创建简单的 LoRa 发送器和 LoRa 接收器。
目录
介绍 LoRa
什么是LoRa?
LoRa 是一种无线数据通信技术,它使用可由 Semtech LoRa 收发器芯片产生的无线电调制技术。
这种调制技术允许少量数据(这意味着低带宽)的长距离通信、高抗干扰性,同时最大限度地降低功耗。因此,它允许以低功率要求进行长距离通信。
LoRa 频率
LoRa 使用全球可用的未经许可的频率。这些是最广泛使用的频率:
- 中国:470~510MHz
- 欧洲:868 MHz
- 北美:915 MHz
- 亚洲:433 MHz
因为这些频段是未经许可的,任何人都可以自由使用它们,而无需付费或获得许可。
LoRa应用
LoRa 远距离和低功耗特性使其非常适合电池供电的传感器和低功耗应用:
- 物联网 (IoT)
- 智能家居
- 机器对机器通信
- 以及更多…
因此,对于在线圈电池或太阳能供电上运行的传感器节点来说,LoRa 是一个不错的选择,可以传输少量数据。
请记住,LoRa 不适合以下项目:
- 需要高数据速率传输;
- 需要非常频繁的传输;
- 或者在人口密集的网络中。
LoRa 拓扑
您可以在以下方面使用 LoRa:
- 点对点通信
- 或者建立一个 LoRa 网络(例如使用 LoRaWAN)
点对点通信
在点对点通信中,两个支持 LoRa 的设备使用射频信号相互通信。
例如,这对于在两个配备 LoRa 收发器芯片的 ESP32 板之间交换数据很有用,这些板彼此相距较远或在没有 Wi-Fi 覆盖的环境中。
与仅支持短距离通信的 Wi-Fi 或蓝牙不同,两个带有合适天线的 LoRa 设备可以远距离交换数据。
您可以使用 LoRa 芯片轻松配置您的 ESP32,以在超过 200 米的距离内可靠地传输和接收数据(您可以获得更好的结果,具体取决于您的环境和 LoRa 设置)。还有其它 LoRa 解决方案可以轻松实现超过 30 公里的范围。
LoRaWAN
您还可以使用 LoRaWAN 构建 LoRa 网络。
LoRaWAN 协议是源自 LoRa 联盟标准化的 LoRa 技术的低功耗广域网 (LPWAN) 规范。我们不会在本教程中探索 LoRaWAN,但有关更多信息,您可以查看LoRa Alliance和The Things Network网站。
LoRa 如何在您的智能家居项目中发挥作用?
我们来看一个实际应用。
想象一下,您想测量田地中的水分。虽然它离你家不远,但它可能没有 Wi-Fi 覆盖。因此,您可以构建一个带有 ESP32 和湿度传感器的传感器节点,每天使用 LoRa 将湿度读数发送一到两次到另一个 ESP32。
后来的 ESP32 可以访问 Wi-Fi,并且可以运行显示湿度读数的网络服务器。
这只是一个示例,说明如何在 ESP32 项目中使用 LoRa 技术。
带有 LoRa 的 ESP32
在本节中,我们将向您展示如何使用 Arduino IDE 在 ESP32 上开始使用 LoRa。例如,我们将构建一个简单的 LoRa 发送器和一个 LoRa 接收器。
LoRa 发送器将发送一个“hello”消息,然后是一个用于测试目的的计数器。此消息可以轻松替换为有用的数据,例如传感器读数或通知。
要完成此部分,您需要以下组件:
- 2x ESP32 DOIT DEVKIT V1 开发板
- 2 个 LoRa 收发器模块 (RFM95)
- RFM95 LoRa 分线板(可选)
- 连接线
- 面包板 或 洞洞板
可选择:
- 2x TTGO LoRa32 SX1276 OLED
ESP32 开发板没有使用 ESP32 和单独的 LoRa 收发器模块,而是内置 LoRa 芯片和 OLED,这使得接线更加简单:
准备 Arduino IDE
Arduino IDE 有一个附加组件,允许您使用 Arduino IDE 及其编程语言对 ESP32 进行编程。如果您还没有准备好使用 ESP32 的 Arduino IDE,请按照下一个教程进行操作。
安装 LoRa 库
有几个库可用于使用 ESP32 轻松发送和接收 LoRa 数据包。在这个例子中,我们将使用sandeep mistry的arduino-LoRa 库。
打开您的 Arduino IDE,然后转到Sketch > Include Library > Manage Libraries并搜索“ LoRa ”。选择下图中突出显示的 LoRa 库,并安装它:
获取 LoRa 收发器模块
要使用 ESP32 发送和接收 LoRa 消息,我们将使用 RFM95 收发器模块。所有 LoRa 模块都是收发器,这意味着它们可以发送和接收信息。您将需要其中的 2 个。
您还可以使用其它兼容模块,如基于 Semtech SX1276/77/78/79 的开发板,包括:RFM96W、RFM98W 等……
或者,也有内置 LoRa 和 OLED 显示屏的 ESP32 板,如 ESP32 Heltec Wifi 模块或 TTGO LoRa32 板。
在获取 LoRa 收发器模块之前,请确保检查您所在位置的正确频率。
对于这个项目,我们将使用工作频率为 868 MHz 的 RFM95。
准备 RFM95 收发器模块
如果您有内置 LoRa 的 ESP32 开发板,则可以跳过此步骤。
RFM95 收发器不适合面包板。一排常见的 2.54 毫米插头引脚不适合收发器引脚。连接之间的空间比平时短。
有几个选项可用于访问收发器引脚。
- 您可以将一些电线直接焊接到收发器上;
- 断开头针并分别焊接每个针;
- 或者您可以购买一个分线板,使引脚面包板友好。
我们已经将一个接头焊接到模块上,如下图所示。
通过这种方式,您可以使用常规连接线访问模块的引脚,甚至可以放置一些插头引脚将它们直接连接到条形板或面包板。
天线
RFM95 收发器芯片需要外接天线连接到 ANA 引脚。
您可以连接一个“真正的”天线,也可以使用如下图所示的导线自己制作一个。一些分线板带有一个特殊的连接器来添加合适的天线。
电线长度取决于频率:
- 868 MHz:86.3 毫米(3.4 英寸)
- 915 MHz:81.9 毫米(3.22 英寸)
- 433 MHz:173.1 毫米(6.8 英寸)
对于我们的模块,我们需要使用直接焊接到收发器的 ANA 引脚的 86.3 毫米电线。请注意,使用合适的天线会扩大通信范围。
重要提示:您必须将天线连接到模块。
为 RFM95 LoRa 收发器模块接线
RFM95 LoRa 收发器模块使用 SPI 通信协议与 ESP32 通信。因此,我们将使用 ESP32 默认的 SPI 引脚。将两个 ESP32 板连接到相应的收发器模块,如下图所示:
下面是 RFM95 LoRa 收发器模块和 ESP32 之间的连接:
- ANA:天线
- 地: 地线
- DIO3:不连接
- DIO4:不连接
- 3.3V: 3.3V
- DIO0: 通用输入输出口 2
- DIO1:不连接
- DIO2:不连接
- GND:不连接
- DIO5:不连接
- RESET: 通用输入输出口 14
- NSS: 通用输入输出口 5
- SCK: 通用输入输出口 18
- MOSI: 通用输入输出口 23
- MISO: 通用输入输出口 19
- GND:不连接
注: RFM95 收发器模块有 3 个 GND 引脚。您使用哪一个并不重要,但您需要至少连接一个。
出于实际原因,我们在条形板上制作了这个电路。它更容易处理,而且电线不会断开。如果您愿意,可以使用面包板。
LoRa 发送器程序
打开您的 Arduino IDE 并复制以下代码。此程序基于 LoRa 库中的示例。它使用 LoRa 每 10 秒传输一次消息。它发送一个“hello”,后跟一个在每条消息中递增的数字。
让我们快速浏览一下代码。
它首先包含所需的库。
#include <SPI.h>
#include <LoRa.h>
然后,定义 LoRa 模块使用的引脚。如果您遵循了之前的原理图,则可以使用代码中使用的引脚定义。如果您使用的是内置 LoRa 的 ESP32 板,请检查板中 LoRa 模块使用的引脚并进行正确的引脚分配。
#define ss 5
#define rst 14
#define dio0 2
你初始化 counter 从 0 开始的变量;
int counter = 0;
在 setup() 里面,您初始化串行通信。
Serial.begin(115200);
while (!Serial);
设置 LoRa 模块的引脚。
LoRa.setPins(ss, rst, dio0);
并以指定的频率初始化收发模块。
while (!LoRa.begin(866E6)) {
Serial.println(".");
delay(500);
}
您可能需要更改频率以匹配您所在位置使用的频率。选择以下选项之一:
- 433E6
- 866E6
- 915E6
LoRa 收发器模块侦听其范围内的数据包。数据包来自哪里并不重要。为确保您只接收来自发送方的数据包,您可以设置一个同步字(范围从 0 到 0xFF)。
LoRa.setSyncWord(0xF3);
接收方和发送方都需要使用相同的同步字。这样,接收器会忽略任何不包含该同步字的 LoRa 数据包。
接下来,在 loop() 函数内你发送 LoRa 数据包。您使用以下命令初始化数据包 beginPacket() 方法。
LoRa.beginPacket();
您使用 print() 方法。正如您在以下两行中看到的,我们发送了一条 hello 消息,然后是计数器。
LoRa.print("hello ");
LoRa.print(counter);
然后,关闭数据包 endPacket()方法。
LoRa.endPacket();
在此之后,计数器消息在每个循环中递增 1,每 10 秒发生一次。
counter++;
delay(10000);
测试LoRa发送器程序
将代码上传到您的 ESP32 开发板。确保您选择了正确的电路板和 COM 端口。
之后,打开串行监视器,然后按下 ESP32 启用按钮。您应该会看到一条成功消息,如下图所示。计数器应每 10 秒递增一次。
LoRa 接收器程序
现在,拿起另一个 ESP32 并上传以下程序(LoRa 接收器程序)。此程序使用您定义的同步字侦听 LoRa 数据包,并在串行监视器以及 RSSI 上打印数据包的内容。RSSI 测量相对接收信号强度:
这张程序与上一张非常相似。只有 loop() 是不同的。
您可能需要更改频率和同步词以匹配发件人程序中使用的频率和同步词。
在里面 loop() 该代码使用 解析包() 方法。
int packetSize = LoRa.parsePacket();
如果有新数据包,我们将在它可用时读取其内容。
要读取传入的数据,您使用 readString() 方法。
while (LoRa.available()) {
String LoRaData = LoRa.readString();
Serial.print(LoRaData);
}
传入的数据保存在 洛拉数据 变量并打印在串行监视器中。
最后,接下来的两行代码以 dB 为单位打印接收到的数据包的 RSSI。
Serial.print("' with RSSI ");
Serial.println(LoRa.packetRssi());
测试 LoRa 接收器程序
将此代码上传到您的 ESP32。此时,您应该有两个具有不同程序的 ESP32 板:发送器和接收器。
打开 LoRa 接收器的串行监视器,然后按下 LoRa 发送器启用按钮。您应该开始在接收器上获取 LoRa 数据包。
恭喜!您已经使用 ESP32 构建了一个 LoRa 发送器和一个 LoRa 接收器。
更进一步
现在,您应该测试您所在地区的发送方和接收方之间的通信范围。通信范围因您的环境而有很大差异(如果您居住在高楼林立的农村或城市地区)。要测试通信范围,您可以将 OLED 显示器添加到 LoRa 接收器,然后走走看看您可以获得多远的通信(这是未来教程的主题)。
在这个例子中,我们只是发送一条 hello 消息,但我们的想法是用有用的信息替换该文本,比如温度数据。
总结
总之,在本教程中,我们向您展示了 LoRa 技术的基础知识:
- LoRa 是一种无线电调制技术;
- LoRa 允许少量数据的远距离通信,并且是低功耗;
- 您可以在点对点通信或网络中使用 LoRa;
- 如果您想监控 Wi-Fi 网络未覆盖且相距几米的传感器,LoRa 尤其有用。
我们还向您展示了如何构建一个简单的 LoRa 发送器和 LoRa 接收器。这些只是帮助您开始使用 LoRa 的简单示例。
最近刚好需要了解这方面的资料,感谢分享啊
您好我是一名新手,请问您在上面的例程中并没规定接收方的地址,请问发送方在发送信息时如何确定接收方呢?