采用Arduino IDE编制软件,Arduino IDE的非商务用途的软件可以通过Arduino找到相应的库,并且在相应的库里面下载相应的库函数,非常方便,不像采用Github那样有那麽多的麻烦事。在Arduino库中输入LoRa,我们会发现有一大批关于LoRa的库存在:
可以看到以前提到过的印度人编写的库,这次我选择了一个不知道是那个国家的Jan Gromes编写的LoRaLib库。版本号:8.2.0
选择了LoRa库,分分钟就完成下载,一切就搞定。下面是实现的关键。
首先要更改Module.cpp文件,使我们可以使用正确的SPI端口。默认的SPI端口是使用的哪一个看不出来,下载的文件如下:
void Module::init(uint8_t interface, uint8_t gpio) {
// select interface
switch(interface) {
case USE_SPI:
pinMode(_cs, OUTPUT);
digitalWrite(_cs, HIGH);
_spi->begin();
break;
case USE_UART:
break;
case USE_I2C:
break;
}
注意,这里使用的是_spi->begin(), 在这里我们将程序更改为:
_spi->begin(SCK, MISO, MOSI, NSS);
再在库函数的头文件中定义:
添加:
#define SCK 14
#define MISO 12
#define MOSI 13
#define NSS 15
#if defined(ESP32) || defined(ESP8266)
#define LORALIB_DEFAULT_SPI_CS 15
#else
// all other architectures
#define LORALIB_DEFAULT_SPI_CS 10
#endif
在程序中需要定义和配置:
#include <LoRaLib.h>
SX1278 lora = new LoRa(15, 26, 25);
// 这里使用了15,26和25,含义分别为
// 15 - SX1278_NSS
// 26 - SX1278_DIO0 这个端子必须连接,不然无法收到信息,发送会有错误码
// 25 - SX1278_DIO1
void setup()
{
pinMode(reset, OUTPUT);
pinMode(o_led01, OUTPUT);
digitalWrite(o_led01, HIGH);
Serial.begin(115200);
Serial.printf("ESP32 chip revision : %d\r\n", (int16_t)ESP.getChipRevision());
Serial.printf("ESP32 SDK Version : %s\r\n", ESP.getSdkVersion());
Serial.printf("ESP32 Speed : %u MHz\r\n", ESP.getCpuFreqMHz());
Serial.println("Reset lora chip");
digitalWrite(reset, HIGH);
delay(400);
digitalWrite(reset, LOW);
delay(200);
Serial.print(F("Initializing ... "));
int state = lora.begin(484.001216, // float freq
125.0, // float bw
12, // uint8_t sf
6); // uint8_t cr
if(state == ERR_NONE)
{
Serial.println(F("success!"));
}
else
{
Serial.print(F("failed, code "));
Serial.println(state);
switch(state)
{
case ERR_CHIP_NOT_FOUND :
Serial.println(F("Error, CHIP not found"));
break;
default :
break;
}
while(true);
}
}
上面的程序就完成了与LoRa的设置,收到了success!说明初始化完成了。下面要测试我们的LoRa通讯了。我采用了接收通讯来测试,原有设备是用STC编制的应用,通讯设置的是484MHz,详细情况如上面的设置,其他的保持为默认。
void loop()
{
int xState = lora.receive(n1, 0x14);
if ( xState == ERR_NONE)
{
digitalWrite(o_led01, LOW);
Serial.println(F("success!"));
Serial.print(F("HUB Address(0-6):\t\t"));
Serial.printf("%02X %02X %02X %02X %02X %02X %02X\r\n",
(uint16_t)n1[0],
(uint16_t)n1[1],
(uint16_t)n1[2],
(uint16_t)n1[3],
(uint16_t)n1[4],
(uint16_t)n1[5],
(uint16_t)n1[6]);
}
}
使用库非常方便,可以快速的上手,收到效果。有一点小小的遗憾:
小小的遗憾,但瑕不掩瑜。希望我们的国人,高手们能做一个我们能够使用的库函数,不要让外国人在网上整天说我们只会索取,不会奉献!