【ESP32最全学习笔记(协议篇)——2.ESP32 LoRa】

关于本教程:

ESP32 基础篇                                

1.ESP32简介                                                                

2.ESP32 Arduino 集成开发环境

3.VS 代码和 PlatformIO

4.ESP32 引脚

5.ESP32 输入输出

6.ESP32 脉宽调制

7.ESP32 模拟输入

8.ESP32 中断定时器

9.ESP32 深度睡眠

ESP32 协议篇

1.ESP32 网络服务器

2.ESP32 LoRa ☑

3.ESP32 BLE

4.ESP32 BLE 客户端-服务器

5.ESP32 蓝牙

6.ESP32 MQTT

7.ESP32 ESP-NOW

8.ESP32 Wi-Fi

9.ESP32 WebSocket

10.ESP32 ESP-MESH

11.ESP32 邮箱

12.ESP32 短信

13.ESP32 HTTP 获取 POST

14.HTTP GET Web APIs

15.HTTP POST Web APIs

 ESP32 服务器篇

持续更新,关注博主不迷路!!!

 ESP32 传感器模块篇

持续更新,关注博主不迷路!!!

ESP32 终极实战篇

百余项ESP32实战项目,敬请关注!!!

使用 Arduino IDE 和 LoRa 的 ESP32——入门

在本教程中,我们将探讨 LoRa 的基本原理,以及如何使用 Arduino IDE 将其与 ESP32 一起用于物联网项目。为了帮助您入门,我们还将向您展示如何使用 RFM95 收发器模块创建简单的 LoRa 发送器和 LoRa 接收器。

什么是LoRa?

LoRa 是一种无线数据通信技术,它使用可由 Semtech LoRa 收发器芯片生成的无线电调制技术。

这种调制技术允许少量数据的远程通信(这意味着低带宽)、高抗干扰性,同时最大限度地降低功耗。因此,它允许以低功率要求进行长距离通信。

LoRa 频率

LoRa 使用全球可用的免许可频率。这些是使用最广泛的频率:

  • 欧洲 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 协议是一种低功耗广域网 (LPWAN) 规范,源自 LoRa 联盟标准化的 LoRa 技术。我们不会在本教程中探讨 LoRaWAN,但有关更多信息,您可以查看LoRa Alliance和The Things Network网站。

    LoRa 如何在您的家庭自动化项目中发挥作用?

    我们来看一个实际应用。

    想象一下,您想测量田地中的湿度。虽然,它离你家不远,但它可能没有 Wi-Fi 覆盖。因此,您可以构建一个带有 ESP32 和湿度传感器的传感器节点,该节点每天使用 LoRa 将湿度读数发送一次或两次到另一个 ESP32。

     后来的 ESP32 可以访问 Wi-Fi,它可以运行一个显示湿度读数的网络服务器。

     这只是一个示例,用于说明如何在 ESP32 项目中使用 LoRa 技术。

    ESP32 与 LoRa

    在本节中,我们将向您展示如何使用 Arduino IDE 通过 ESP32 开始使用 LoRa。例如,我们将构建一个简单的 LoRa 发送器和一个 LoRa 接收器。

    LoRa 发送器将发送一条“hello”消息,然后发送一个用于测试目的的计数器。此消息可以轻松替换为有用的数据,例如传感器读数或通知。

    要完成此部分,您需要以下组件:

    2x ESP32 DOIT DEVKIT V1 开发板
    2x LoRa 收发器模块 (RFM95)
    RFM95 LoRa 分线板(可选)
    跳线
    面包板 或 条板
    选择:2x TTGO LoRa32 SX1276 OLED

    准备 Arduino IDE

    Arduino IDE 有一个附加组件,可让您使用 Arduino IDE 及其编程语言对 ESP32 进行编程。如果您还没有准备好 Arduino IDE 以使用 ESP32,请按照之前进行操作。

    安装 LoRa 库

    有几个库可用于使用 ESP32 轻松发送和接收 LoRa 数据包。在这个例子中,我们将使用sandeep mistry 的 arduino-LoRa 库

    打开您的 Arduino IDE,转到Sketch > Include Library > Manage Libraries并搜索“ LoRa ”。选择下图中突出显示的 LoRa 库,并安装它。

    获取 LoRa 收发器模块

    要使用 ESP32 发送和接收 LoRa 消息,我们将使用 RFM95 收发器模块RFM95 收发器模块RFM95 收发器模块。所有 LoRa 模块都是收发器,这意味着它们可以发送和接收信息。你需要其中的 2 个。

    您还可以使用其他兼容模块,例如基于 Semtech SX1276/77/78/79 的电路板,包括:RFM96W、RFM98W 等……

    准备 RFM95 收发器模块

    如果您有内置 LoRa 的 ESP32 开发板,则可以跳过此步骤。

    RFM95 收发器不适合试验板。一排普通的 2.54mm 接头插针不适合收发器插针。连接之间的空间比平时短。

    有几个选项可用于访问收发器引脚。

  • 您可以将一些电线直接焊接到收发器上;
  • 断开插头引脚并分别焊接每一个;
  • 或者您可以购买一个分线板,使引脚面包板更加友好。
  • 我们已经将接头焊接到模块,如下图所示。

    通过这种方式,您可以使用常规跳线访问模块的引脚,甚至可以放置一些插头引脚将它们直接连接到条形板或面包板上。

    天线

    RFM95 收发器芯片需要一个连接到 ANA 引脚的外部天线。

    您可以连接一个“真正的”天线,也可以使用如下图所示的导线自己制作一个。一些分线板带有一个特殊的连接器,用于添加合适的天线。

    导线长度取决于频率:

  • 868 兆赫:86.3 毫米(3.4 英寸)
  • 915 兆赫:81.9 毫米(3.22 英寸)
  • 433 兆赫:173.1 毫米(6.8 英寸)
  • 对于我们的模块,我们需要使用直接焊接到收发器的 ANA 引脚的 86.3 mm 电线。请注意,使用合适的天线会扩大通信范围。

    重要提示:您必须将天线连接到模块。

    连接 RFM95 LoRa 收发器模块

    RFM95 LoRa 收发模块使用 SPI 通信协议与 ESP32 通信。因此,我们将使用 ESP32 默认的 SPI 引脚。将两个 ESP32 板连接到相应的收发器模块,如下一个示意图所示:

    下面是 RFM95 LoRa 收发模块和 ESP32 之间的连接:

  • ANA:天线
  • GND: GND
  • DIO3:不接
  • DIO4:不接
  • 3.3伏: 3.3V
  • DIO0:   GPIO 2
  • DIO1:不连接
  • DIO2:不接
  • GND:不接
  • DIO5:不接
  • RESET:GPIO 14
  • NSS:GPIO 5
  • SCK:GPIO 18
  • MOSI:GPIO 23
  • MISO:GPIO 19
  • GND:不接
  • 注意: RFM95 收发模块有 3 个 GND 引脚。使用哪一个并不重要,但您至少需要连接一个。

        

    出于实际原因,我们在条板上制作了这个电路。它更容易处理,而且电线不会断开。如果您愿意,可以使用面包板。

    LoRa 发送器代码

    打开您的 Arduino IDE 并复制以下代码。此草图基于 LoRa 库中的示例。它使用 LoRa 每 10 秒传输一次消息。它发送一个“hello”,后跟一个在每条消息中递增的数字。

      

    #include <SPI.h>
    #include <LoRa.h>
    
    //define the pins used by the transceiver module
    #define ss 5
    #define rst 14
    #define dio0 2
    
    int counter = 0;
    
    void setup() {
      //initialize Serial Monitor
      Serial.begin(115200);
      while (!Serial);
      Serial.println("LoRa Sender");
    
      //setup LoRa transceiver module
      LoRa.setPins(ss, rst, dio0);
      
      //replace the LoRa.begin(---E-) argument with your location's frequency 
      //433E6 for Asia
      //866E6 for Europe
      //915E6 for North America
      while (!LoRa.begin(866E6)) {
        Serial.println(".");
        delay(500);
      }
       // Change sync word (0xF3) to match the receiver
      // The sync word assures you don't get LoRa messages from other LoRa transceivers
      // ranges from 0-0xFF
      LoRa.setSyncWord(0xF3);
      Serial.println("LoRa Initializing OK!");
    }
    
    void loop() {
      Serial.print("Sending packet: ");
      Serial.println(counter);
    
      //Send LoRa packet to receiver
      LoRa.beginPacket();
      LoRa.print("hello ");
      LoRa.print(counter);
      LoRa.endPacket();
    
      counter++;
    
      delay(10000);
    }

    让我们快速浏览一下代码。

    它首先包含所需的库。

    #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()方法。正如您在以下两行中看到的,我们发送了一条问候消息,然后是计数器。

    LoRa.print("hello ");
    LoRa.print(counter);

     然后,关闭数据包endPacket()方法。

    LoRa.endPacket();

     此后,计数器消息在每个循环中递增 1,每 10 秒发生一次。

    counter++;
    delay(10000);

    测试发件人代码

    将代码上传到您的 ESP32 开发板。确保选择了正确的板和 COM 端口。

    之后,打开串行监视器,然后按下 ESP32 启用按钮。您应该会看到一条成功消息,如下图所示。计数器应每 10 秒递增一次。

    LoRa 接收器代码

    现在,拿起另一个 ESP32 并上传以下代码(LoRa 接收器代码)。此代码使用您定义的同步字侦听 LoRa 数据包,并在串行监视器和 RSSI 上打印数据包的内容。RSSI 测量相对接收信号强度。

    #include <SPI.h>
    #include <LoRa.h>
    
    //define the pins used by the transceiver module
    #define ss 5
    #define rst 14
    #define dio0 2
    
    void setup() {
      //initialize Serial Monitor
      Serial.begin(115200);
      while (!Serial);
      Serial.println("LoRa Receiver");
    
      //setup LoRa transceiver module
      LoRa.setPins(ss, rst, dio0);
      
      //replace the LoRa.begin(---E-) argument with your location's frequency 
      //433E6 for Asia
      //866E6 for Europe
      //915E6 for North America
      while (!LoRa.begin(866E6)) {
        Serial.println(".");
        delay(500);
      }
       // Change sync word (0xF3) to match the receiver
      // The sync word assures you don't get LoRa messages from other LoRa transceivers
      // ranges from 0-0xFF
      LoRa.setSyncWord(0xF3);
      Serial.println("LoRa Initializing OK!");
    }
    
    void loop() {
      // try to parse packet
      int packetSize = LoRa.parsePacket();
      if (packetSize) {
        // received a packet
        Serial.print("Received packet '");
    
        // read packet
        while (LoRa.available()) {
          String LoRaData = LoRa.readString();
          Serial.print(LoRaData); 
        }
    
        // print RSSI of packet
        Serial.print("' with RSSI ");
        Serial.println(LoRa.packetRssi());
      }
    }

    这代码与上一张非常相似。只有loop()是不同的。

    您可能需要更改频率和 sycnword 以匹配发件人草图中使用的那个。

    在里面loop()该代码使用parsePacket()方法。

    int packetSize = LoRa.parsePacket();

    如果有新数据包,我们会在它可用时读取它的内容。

    要读取传入的数据,您可以使用readString()方法。

    while (LoRa.available()) {
      String LoRaData = LoRa.readString();
      Serial.print(LoRaData); 
    }

    传入的数据保存在LoRa数据变量并在串行监视器中打印。

    最后,接下来的两行代码以 dB 为单位打印接收到的数据包的 RSSI。

    Serial.print("' with RSSI ");
    Serial.println(LoRa.packetRssi());

    测试 LoRa 接收器代码

    将此代码上传到您的 ESP32。此时,您应该有两个具有不同代码的 ESP32 板:发送器和接收器。

    打开 LoRa 接收器的串行监视器,然后按下 LoRa 发送器启用按钮。您应该开始在接收器上获取 LoRa 数据包。

    恭喜!您已经使用 ESP32 构建了一个 LoRa 发送器和一个 LoRa 接收器。

    更进一步

    现在,您应该测试您所在区域的发送方和接收方之间的通信范围。通信范围根据您的环境而有很大差异(如果您住在高楼林立的农村或城市地区)。要测试通信范围,您可以在 LoRa 接收器上添加一个 OLED 显示器,然后出去散散步,看看您可以通信多远(这是未来教程的主题)。

     在此示例中,我们只是发送一条问候消息,但我们的想法是用有用的信息替换该文本。

    总结

    总之,在本教程中,我们向您展示了 LoRa 技术的基础知识:

  • LoRa 是一种无线电调制技术;
  • LoRa允许少量数据的远距离通信,并且需要低功耗;
  • 您可以在点对点通信或网络中使用 LoRa;
  • 如果您想监控未被 Wi-Fi 网络覆盖且相距数米的传感器,LoRa 会特别有用。
  • 物联沃分享整理
    物联沃-IOTWORD物联网 » 【ESP32最全学习笔记(协议篇)——2.ESP32 LoRa】

    发表评论