引入库
#include
LoRa初始化
指定频率初始化库。
LoRa.begin(frequency);
frequency-频率可以是 (433E6, 868E6, 915E6)Hz
1成功返回,0失败返回。
设置NSS
设置之前必须先调用LoRa.begin()。
覆盖库使用的默认NSS,NRESET和DIO0引脚。
LoRa.setPins(ss, reset, dio0); **
ss -默认为 10
reset 默认为 9
dio0-默认为2。
必须可以通过attachInterrupt(…)进行中断。
该调用是可选的,仅在需要更改使用的默认引脚时才需要使用。
没有MCU控制的复位引脚
为了节省更多的引脚,可以将MCU的复位引脚与无线电的复位引脚相连,从而仅在启动期间进行复位。
reset-设置-1为忽略此引脚
引脚dio0中断回调
dio0引脚可用于传输完成回调和/或接收回调,检查onTxDone和onReceive。
-LoRa.setPins(ss, reset, dio0);这个函数
设置SPI接口
覆盖库使用的默认SPI接口。必须先调用LoRa.begin()。
LoRa.setSPI(spi);
spi -要使用的新SPI接口,默认为 SPI
该调用是可选的,仅在您需要更改使用的默认SPI接口时才需要使用,如果您的Arduino(或兼容)板具有多个SPI接口。
设置SPI频率
覆盖库使用的默认SPI频率10 MHz。必须先调用LoRa.begin()。
LoRa.setSPIFrequency(frequency);
frequency -要使用的新SPI频率,默认为 8E6
该调用是可选的,仅在需要更改使用的默认SPI频率时才需要使用。某些逻辑电平转换器不能支持8 MHz之类的高速,因此可以通过选择较低的SPI频率。
初始化结束
LoRa.end()
LoRa发包
开始发送数据包的顺序。
LoRa.beginPacket(); LoRa.beginPacket(implicitHeader);
implicitHeader-(可选)
true启用隐式头模式
false启用显式头模式(默认)
返回1无线电是否准备好发送,0繁忙还是失败。
写入包
将数据写入数据包。每个数据包最多可包含255个字节。
LoRa.write(byte); LoRa.write(buffer, length);
byte -单字节写入数据包
或
buffer -数据写入数据包
length -要写入的数据大小
返回写入的字节数。
注意:其他Arduino Print API也可用于将数据写入数据包
结束包
结束发送数据包的顺序。
LoRa.endPacket(); LoRa.endPacket(async);
async-(可选)
true启用非阻塞模式
false等待传输完成(默认)
1成功返回,0失败返回。
完成发送
警告:TxDone回调使用dio0检查setPins功能上的中断引脚!
-LoRa.setPins(ss, reset, dio0);这个函数
注册回调
为数据包传输完成时注册一个回调函数。
LoRa.onTxDone(onTxDone);
void onTxDone() {
// …
}
onTxDone -数据包传输结束时调用的函数。
接收包
解析包
检查是否接收到数据包。
int packetSize = LoRa.parsePacket(); int packetSize = LoRa.parsePacket(size);
size-(可选)如果>0启用隐式标头模式并使用预期的size字节包,则默认模式为显式标头模式
返回数据包大小(以字节为单位)或0是否未收到数据包。
连续接收模式
警告:接收回调使用dio0,检查setPins功能上的中断引脚!
注册回调
为收到数据包注册一个回调函数。
LoRa.onReceive(onReceive);
void onReceive(int packetSize) {
// …
}
onReceive -接收数据包时调用的功能。
接收方式
将接收机置于连续接收模式。
LoRa.receive(); LoRa.receive(int size);
size-(可选)如果> 0启用隐式标头模式并使用预期的size字节包,则默认模式为显式标头模式
在onReceive接收到数据包时,回调会被调用。
RSSI
分组RSSI
int rssi = LoRa.packetRssi();
返回最后接收到的数据包的平均RSSI(dBm)。
分组信噪比
float snr = LoRa.packetSnr();
返回以dB为单位的接收数据包的估计SNR。
RSSI
int rssi = LoRa.rssi();
返回无线电的当前RSSI(dBm)。RSSI可以随时读取(无论是否接收数据包)
封包频率错误
long freqErr = LoRa.packetFrequencyError();
返回以Hz为单位的接收数据包的频率误差。频率误差是接收机中心频率和输入LoRa信号的中心频率之间的频率偏移。
现有数据
int availableBytes = LoRa.available()
返回可读取的字节数。
窥探
窥视包中的下一个字节。
byte b = LoRa.peek();
返回数据包中的下一个字节,或者-1如果没有可用字节,则返回该字节。
阅读
从数据包中读取下一个字节。
byte b = LoRa.read();
返回数据包中的下一个字节,或者-1如果没有可用字节,则返回该字节
注意:其他Arduino Stream API也可以用于从数据包中读取数据
其他无线电模式
空闲模式
将收音机置于空闲(待机)模式。
LoRa.idle();
睡眠模式
将收音机置于睡眠模式。
LoRa.sleep();
发送功率参数
发射功率
更改无线电的发射功率。
LoRa.setTxPower(txPower); LoRa.setTxPower(txPower, outputPin);
txPower -TX功率,以dB为单位,默认为 17
outputPin-(可选)PA输出引脚
支持的值为PA_OUTPUT_RFO_PIN和PA_OUTPUT_PA_BOOST_PIN,默认为PA_OUTPUT_PA_BOOST_PIN。
支持的值是2至20的PA_OUTPUT_PA_BOOST_PIN,并0至14对PA_OUTPUT_RFO_PIN。
大多数模块的PA输出引脚都连接到PA BOOST,
频率
更改接收频率。
LoRa.setFrequency(frequency);
frequency-频率 (433E6, 868E6, 915E6)Hz
传播因子
更改无线电的扩频因子。
LoRa.setSpreadingFactor(spreadingFactor);
spreadingFactor -扩展因子,默认为 7
支持的值在6和之间12。如果将扩展因子设置为6,则必须使用隐式报头模式来发送和接收数据包。
信号带宽
更改无线电的信号带宽。
LoRa.setSignalBandwidth(signalBandwidth);
signalBandwidth-以Hz为单位的信号带宽,默认为125E3。
支持的值是(7.8E3, 10.4E3, 15.6E3, 20.8E3, 31.25E3, 41.7E3, 62.5E3, 125E3, 250E3, and 500E3)
编码率
更改无线电的编码率。
LoRa.setCodingRate4(codingRateDenominator);
codingRateDenominator -编码率的分母,默认为 5
支持的值介于5和8,它们分别对应于编码率4/5和4/8。编码率分子固定为4。
前导码长度
更改无线电的前同步码长度。
LoRa.setPreambleLength(preambleLength);
preambleLength -前导码长度(以符号表示),默认为 8
支持的值在6至65535之间。
同步字
更改接收机的同步字。
LoRa.setSyncWord(syncWord);
syncWord -用作同步字的字节值,默认为 0x12
CRC
启用或禁用CRC使用,默认情况下不使用CRC。
LoRa.enableCrc(); LoRa.disableCrc();
反转IQ信号
启用或禁用反转LoRa I和Q信号,默认情况下不使用invertIQ。
LoRa.enableInvertIQ(); LoRa.disableInvertIQ();
LNA增益
设置LNA增益以获得更好的RX灵敏度,默认情况下使用AGC(自动增益控制),不使用LNA增益。
LoRa.setGain(gain);
gain -LNA增益
支持的值在0和之间6。如果增益为0,则将启用AGC,并且将不使用LNA增益。否则,如果增益为1到6,则将禁用AGC并使用LNA增益。
其他功能
随机字节
根据宽带RSSI测量,生成一个随机字节。
byte b = LoRa.random();
返回随机字节。
参考案例
发送数据
#include <LoRa.h>
#include <SPI.h>
//Lora初始化
#define ss 5
#define rst 14
#define dio0 2
#define BAND 433E6//lora信号 433MHz
int counter = 0;
void setup()
{
Serial.begin(9600);//9600串口
while (!Serial);
Serial.println("LoRa Sender");
LoRa.setPins(ss, rst, dio0); //设置lora引脚
while (!LoRa.begin(BAND))
{
Serial.println(".");
delay(500);
}
Serial.println("LoRa Initializing OK!");
//--------这里是通信的信道,------
LoRa.setSyncWord(0xA5);//接受来自信道0xA5的信号包,不写的话就是接收所有的数据包!
LoRa.setTxPower(20);
}
void loop()
{
Serial.print("Sending packet: ");
Serial.println(counter);
LoRa.beginPacket(); //发送数据包
LoRa.print("hello ");
LoRa.print(counter);
LoRa.endPacket();//终止接收包
counter++;
delay(5000);
}
接收数据
#include <SPI.h>
#include <LoRa.h>
//Lora初始化
#define SS 5
#define RST 14
#define DI0 2
#define BAND 433E6
void setup() {
Serial.begin(9600);//9600串口
while (!Serial);
LoRa.setPins(SS, RST, DI0); //设置lora引脚
Serial.println("LoRa Receiver");
//--------检查ra-01是否连接成功------
if (!LoRa.begin(BAND)) {
Serial.println("Starting LoRa failed!");
while (1);
}
//--------这里是通信的信道,------
LoRa.setSyncWord(0xA5);//接受来自信道0xA5的信号消息
LoRa.setTxPower(20);
}
void loop() {
//尝试解析数据包
int packetSize = LoRa.parsePacket();
if (packetSize) {
// 收到包
Serial.print("Received packet '");
// 读取包
while (LoRa.available()) {
Serial.print((char)LoRa.read());
}
// 打印数据包数据的RSSI值
//------RSSI---------
Serial.println(LoRa.packetRssi());
Serial.print("' with RSSI ");
LoRa.endPacket();//收包结束
}
}