基于ESP32的LoRa通信实现
LoRa通信的工作原理是,发送方将数据发送给接收方,数据通过调制器转换成数字信号,传输到接收器,并被解调回来。这种通信方式的优点在于低功耗、长传输距离和高可靠性,它不但能够通过距离,甚至可以穿过建筑物、地下室和其他类似的地理和物理障碍直接通信,这些特性使得LoRa在无线传感器网络和IoT应用中非常有用。如果有,我们创建一个空的消息串,并使用LoRa.read()读取接收到的信息,并将它们添加到me
目录
一、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的定位系统实现
硬件准备
- ESP32开发板
- GPRS+GPS A9G模块
- LoRa通信模块
- 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;
}
}
- 配置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()) {
// 处理接收的数据
}
}
- 获取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();
}
在这里,我们通过将经度和纬度信息发送到接收端来实现位置信息的传输。
- 在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通信模块进行数据传输。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)