目录

一、LoRa通信原理

二、基于ESP32的LoRa通信例程

三、基于ESP32的定位系统实现

硬件准备

程序实现步骤

完整代码及注释


一、LoRa通信原理

        LoRa(Long Range)通信是一种无线通信技术,它采用了低功耗、长距离传输和抵抗干扰的工作方式。LoRa通信可以被广泛应用于物联网(IoT)领域,例如智能家居、智能农业、智能电力等领域。LoRa通信的工作频段通常是在区域无线电频率的ISM频段,可达到数公里的传输距离和深入建筑物等复杂环境的穿透能力。

        LoRa通信的工作原理是,发送方将数据发送给接收方,数据通过调制器转换成数字信号,传输到接收器,并被解调回来。这种通信方式的优点在于低功耗、长传输距离和高可靠性,它不但能够通过距离,甚至可以穿过建筑物、地下室和其他类似的地理和物理障碍直接通信,这些特性使得LoRa在无线传感器网络和IoT应用中非常有用。

二、基于ESP32的LoRa通信例程

        下面是ESP32和LoRa通信的简单示例代码,请确保你已经安装了ESP32的Arduino开发环境和LoRa库。

        首先在Arduino IDE中打开一个新的空白窗口,将以下代码复制并粘贴到窗口中:

#include <SPI.h>      
#include <LoRa.h>

#define SS_PIN     18
#define RST_PIN    14
#define DI0_PIN    26
#define BAND       433E6

void setup() {
  Serial.begin(115200);
  while (!Serial);

  if (!LoRa.begin(BAND)) {
    Serial.println("LoRa init failed. Check your connections.");
    while (true);
  }
}

void loop() {
  String message = "Hello LoRa";
  
  LoRa.beginPacket();
  LoRa.print(message);
  LoRa.endPacket();
  delay(1000);
}

        这段代码中,我们首先引入SPI和LoRa库。接着定义了一些常量和引脚,包括:                

  • SS_PIN: LoRa模块的片选引脚
  • RST_PIN: LoRa模块的重置引脚
  • DI0_PIN: LoRa模块的数字输入口0
  • BAND: 使用的频率,单位为赫兹

        在setup()函数中,我们开始了串口通信,并使用LoRa.begin()初始化LoRa模块。如果初始化失败,将会打印“LoRa init failed. Check your connections.”并进入死循环。

        在loop()函数中,我们将要发送的消息定义为一个字符串,然后调用LoRa.beginPacket()开始一个数据传输过程。LoRa.print()将信息发送到LoRa模块,并LoRa.endPacket()结束传输。之后,我们在延迟1秒钟之后重新开始循环,不断发送消息。

        接下来,我们将代码上传到ESP32,并使用另一台ESP32或LoRa模块接收消息。如果你想将代码改变为接收消息,只需要在setup()函数中添加以下代码:

LoRa.onReceive(receive);
LoRa.receive();

        在loop()函数中不需要改变任何内容,因为我们接收到的消息将会在receive()函数中处理。receive()函数可以这样定义:

void receive(int packetSize) {
  if (packetSize) {
    String message = "";
    while (LoRa.available()) {
      message += (char)LoRa.read();
    }
    Serial.println(message);
  }
}

        在这个函数中,我们首先判断是否接收到了消息。如果有,我们创建一个空的消息串,并使用LoRa.read()读取接收到的信息,并将它们添加到message中。最后,我们使用Serial.println()在串口中打印接收到的消息。

        如果你不想使用串口通信,可以将Serial.println()替换成你自己的处理函数,比如控制LED灯亮起或者是向其他设备发送WiFi通知等操作。

三、基于ESP32的定位系统实现

硬件准备

  1. ESP32开发板
  2. GPRS+GPS A9G模块
  3. LoRa通信模块
  4. GPS天线

程序实现步骤

        1.配置ESP32的WiFi模块,连接到网络。可以通过以下代码实现:

WiFi.begin("SSID", "Password");
while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
  • 初始化和配置GPS定位和通信模块。可以使用以下代码:
#include <Adafruit_GPS.h>
#include <TinyGPS++.h>
#include <SoftwareSerial.h>

SoftwareSerial ss(16, 17);
Adafruit_GPS GPS(&ss);

void setup(){
  ss.begin(9600);
  GPS.begin(9600);
  GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
  GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
  GPS.sendCommand(PGCMD_ANTENNA);
}

void loop(){
  GPS.read();
  char c = GPS.read();
  if (GPS.newNMEAreceived()) {
    if (!GPS.parse(GPS.lastNMEA())) 
      return;
  }
}
  1. 配置LoRa模块,并打开接收模式。可以通过以下代码实现:
#include "LoRa.h"

void setup() {
  LoRa.setPins(4, 15, 16);
  while (!LoRa.begin(433E6)) {
    Serial.println(".");
    delay(500);
  }
  LoRa.setSyncWord(0xF3);
  LoRa.enableCrc();
  LoRa.receive();
}

void loop() {
  if (LoRa.parsePacket()) {
    // 处理接收的数据
  }
}
  1. 获取GPS定位信息,并利用LoRa模块发送数据。可以通过以下代码实现:
void loop() {
  if (GPS.newNMEAreceived()) {
    if (!GPS.parse(GPS.lastNMEA())) 
      return;
    postDataToServer(GPS.latitude, GPS.longitude);
  }
}

void postDataToServer(float latitude, float longitude) {
  LoRa.beginPacket();
  LoRa.print("Latitude:");
  LoRa.print(latitude);
  LoRa.print(", Longitude:");
  LoRa.print(longitude);
  LoRa.endPacket();
}

        在这里,我们通过将经度和纬度信息发送到接收端来实现位置信息的传输。

  1. 在LoRa接收端接收数据,并处理位置信息。可以通过以下代码实现:
void loop() {
  if (LoRa.parsePacket()) {
    String message = "";
    while (LoRa.available()) {
      char c=LoRa.read();
      message+=c;
    }
    Serial.print("Received: ");
    Serial.print(message);
  }
}

        这是个简单的例子,它仅仅输出接收到的数据,您可以在接收到数据后进行具体的处理。

完整代码及注释


#include <Adafruit_GPS.h>
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include "LoRa.h"

SoftwareSerial ss(16, 17);  // 自定义软串口使用GPIO16、17分别连接模块的TX、RX
Adafruit_GPS GPS(&ss);

void setup() {
  Serial.begin(9600);       // 开启串口
  LoRa.setPins(4, 15, 16);  // 配置LoRa模块
  while (!LoRa.begin(433E6)) {
    Serial.println(".");
    delay(500);
  }
  LoRa.setSyncWord(0xF3);   // 设置同步字
  LoRa.enableCrc();         // 开启CRC校验
  LoRa.receive();           // 打开接收模式
  ss.begin(9600);
  GPS.begin(9600);          // 初始化GPS模块
  GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
  GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
  GPS.sendCommand(PGCMD_ANTENNA);
}

void loop() {
  GPS.read();
  char c = GPS.read();
  if (GPS.newNMEAreceived()) {
    if (!GPS.parse(GPS.lastNMEA())) 
      return;
    postDataToServer(GPS.latitude, GPS.longitude);
  }
  if (LoRa.parsePacket()) {
    String message = "";
    while (LoRa.available()) {
      char c=LoRa.read();
      message+=c;
    }
    Serial.print("Received: ");
    Serial.print(message);
  }
}

void postDataToServer(float latitude, float longitude) {
  LoRa.beginPacket();               // 创建数据包
  LoRa.print("Latitude:");           // 发送经度数据
  LoRa.print(latitude);          
  LoRa.print(", Longitude:");        // 发送纬度数据
  LoRa.print(longitude);
  LoRa.endPacket();                 // 发送数据
}

        以上代码完整实现了一个基于ESP32与GPRS+GPS模块的定位系统,并使用LoRa通信模块进行数据传输。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐