大纲
捐赠
觉得有帮助吗?
教程视频
特性
- 完全访问 LoRa 设置,包括带宽、扩频因子、载波频率、编码率等。
- 过流保护
- 数据发送和接收
- 睡眠模式访问以节省电能(特别适用于电池供电系统)
- RSSI 估计
- 使用简单 :)
成功测试平台:
- F103C8
- F103RE
- F030C8
- F411VE (Discovery 开发板)
- F429ZG
- L476RG (Nucleo-L476RG)
联系方式
Telegram 或 电子邮件: pilot.motlaq@gmail.com
星标历史
硬件
需求
- Ra-02 LoRa 模块(带 SX1278 芯片)
- 433MHz 天线
- STM32 微控制器
接线
接线连接如下:
STM 引脚 | 模块引脚 |
---|---|
SPI MISO | MISO |
SPI MOSI | MOSI |
SPI CLK | CLK |
GPIO 输出(初始为高电平) | NSS |
GPIO 输出(初始为高电平) | RST |
GPIO 输入(EXTI - 上升沿) | DIO0 |
3.3v | 3.3v |
GND | GND |
安装
下载或复制 LoRa.c 和 LoRa.h,将它们导入到你的项目中,然后在 main.c 中包含 LoRa.h:
#include "LoRa.h"
初始配置
首先,你需要创建一个 LoRa 对象:
LoRa myLoRa;
然后在你的 main 函数中调用它的构造函数:
myLoRa = newLoRa();
现在,默认设置已经设置在 myLoRa
中,但你必须设置 7 个重要参数:
- NSS 引脚
- NSS 端口
- Reset 引脚
- Reset 端口
- DIO0 端口
- DIO0 引脚
- 用于通信的 SPI
myLoRa.CS_port = NSS_GPIO_Port;
myLoRa.CS_pin = NSS_Pin;
myLoRa.reset_port = RESET_GPIO_Port;
myLoRa.reset_pin = RESET_Pin;
myLoRa.DIO0_port = DIO0_GPIO_Port;
myLoRa.DIO0_pin = DIO0_Pin;
myLoRa.hSPIx = &hspi3;
现在,调用 LoRa_init()
将把这些设置写入模块的内存。
LoRa_init(&myLoRa);
此函数返回一个"状态码"来表示模块响应状态。 状态码如下:
200
: LORA_OK - 一切正常。404
: LORA_NOT_FOUND - 你的微控制器无法与 LoRa 模块通信并读取 RegVersion。503
: LORA_UNAVAILABLE - LoRa 设置中的某些内容(如 NSS 端口/引脚、RESET 端口/引脚或 SPI 处理程序)不正确。
其他状态码:
413
: LORA_LARGE_PAYLOAD - 你的数据大于 255 字节。
示例
#include "stdio.h"
#include "string.h"
.
.
.
char send_data[200];
uint16_t LoRa_status = LoRa_init(&myLoRa);
memset(send_data,NULL,200);
如果LoRa状态为LORA_OK,则执行以下操作:
将"LoRa正在运行... :)"的消息格式化存储到send_data中。
使用LoRa_transmit函数通过LoRa发送该消息。
通过调试UART发送该消息。
否则,执行以下操作:
将"LoRa失败 :( 错误代码:[错误代码]"的消息格式化存储到send_data中。
通过调试UART发送该消息。
其他参数设置如下:
频率:434 MHz
扩频因子:SF_9
带宽:BW_250KHz
编码率:CR_4_8
功率:POWER_17db
过流保护:130 mA
前导码:10
扩频因子取值范围为7到12。
带宽取值包括7.8 KHz到500 KHz的多个选项。
编码率取值包括4/5、4/6、4/7和4/8。
功率增益取值包括11db、14db、17db和20db。
过流保护的最大电流值必须是5的倍数(如果小于120 mA)或10的倍数(如果大于120 mA)。最小值为45 mA,最大值为240 mA。
发送数据:
使用LoRa_transmit函数可以发送一组字节:
LoRa_transmit(_LoRa, data, length, timeout)
注意:调用此函数后,FiFo数据缓冲区将被清空。这意味着所有接收到的数据包都将被删除。如果您想在发送后立即读取数据,应该添加一个延迟。
参数:
_LoRa:您的LoRa对象
data:要发送的数据指针
length:数据大小(字节)
timeOut:超时时间(毫秒)
返回值:
成功返回1,超时返回0
### 示例:
1.
```C
char* send_data;
send_data = "Hello world!";
LoRa_transmit(&myLoRa, (uint8_t*)send_data, 12, 100);
char* send_data;
send_data = "Hello world!";
if(LoRa_transmit(&myLoRa, (uint8_t*)send_data, 12, 100) == 1){
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
}
接收数据
LoRa模块有两种接收模式:
- 单次
- 连续
该库仅支持"连续模式"。
首先,你需要启用数据接收:
LoRa_startReceiving(&myLoRa);
此函数将操作模式从STANDBY更改为RXCONTINUOUS,之后你可以通过调用LoRa_receive
将最后接收的数据包存储在变量中。你可以在定时器中断回调(推荐)或主循环中调用LoRa_receive
。
uint8_t LoRa_receive(LoRa* _LoRa, uint8_t* data, uint8_t length)
参数:
_LoRa
:你的LoRa对象data
:指向你想写入接收字节的数组的指针length
:你想读取的字节数
返回值:
- 接收到的数据包大小(以字节为单位)
示例:
LoRa_startReceiving(&myLoRa);
uint8_t received_data[10];
uint8_t packet_size = 0;
while(1){
packet_size = LoRa_receive(&myLoRa, received_data, 10);
Hal_Delay(500);
}
信号功率估计
SX127x系列可以测量最后接收到的数据包的功率。LoRa_getRSSI(...)
函数可以实现这一功能。
int LoRa_getRSSI(LoRa* _LoRa)
参数:
_LoRa
:你的LoRa对象
返回值:
- 表示功率的整数,单位为dBm。例如-43。