引入库
#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();

返回随机字节。

参考案例

发送数据

  1. #include <LoRa.h>
  2. #include <SPI.h>
  3. //Lora初始化
  4. #define ss 5
  5. #define rst 14
  6. #define dio0 2
  7. #define BAND 433E6//lora信号 433MHz
  8. int counter = 0;
  9. void setup()
  10. {
  11. Serial.begin(9600);//9600串口
  12. while (!Serial);
  13. Serial.println("LoRa Sender");
  14. LoRa.setPins(ss, rst, dio0); //设置lora引脚
  15. while (!LoRa.begin(BAND))
  16. {
  17. Serial.println(".");
  18. delay(500);
  19. }
  20. Serial.println("LoRa Initializing OK!");
  21. //--------这里是通信的信道,------
  22. LoRa.setSyncWord(0xA5);//接受来自信道0xA5的信号包,不写的话就是接收所有的数据包!
  23. LoRa.setTxPower(20);
  24. }
  25. void loop()
  26. {
  27. Serial.print("Sending packet: ");
  28. Serial.println(counter);
  29. LoRa.beginPacket(); //发送数据包
  30. LoRa.print("hello ");
  31. LoRa.print(counter);
  32. LoRa.endPacket();//终止接收包
  33. counter++;
  34. delay(5000);
  35. }

接收数据

  1. #include <SPI.h>
  2. #include <LoRa.h>
  3. //Lora初始化
  4. #define SS 5
  5. #define RST 14
  6. #define DI0 2
  7. #define BAND 433E6
  8. void setup() {
  9. Serial.begin(9600);//9600串口
  10. while (!Serial);
  11. LoRa.setPins(SS, RST, DI0); //设置lora引脚
  12. Serial.println("LoRa Receiver");
  13. //--------检查ra-01是否连接成功------
  14. if (!LoRa.begin(BAND)) {
  15. Serial.println("Starting LoRa failed!");
  16. while (1);
  17. }
  18. //--------这里是通信的信道,------
  19. LoRa.setSyncWord(0xA5);//接受来自信道0xA5的信号消息
  20. LoRa.setTxPower(20);
  21. }
  22. void loop() {
  23. //尝试解析数据包
  24. int packetSize = LoRa.parsePacket();
  25. if (packetSize) {
  26. // 收到包
  27. Serial.print("Received packet '");
  28. // 读取包
  29. while (LoRa.available()) {
  30. Serial.print((char)LoRa.read());
  31. }
  32. // 打印数据包数据的RSSI值
  33. //------RSSI---------
  34. Serial.println(LoRa.packetRssi());
  35. Serial.print("' with RSSI ");
  36. LoRa.endPacket();//收包结束
  37. }
  38. }

参考资料

Arduino LoRa API