ESP32和LoRa SX1278通讯

ESP32与SX1278通讯实现LoRa和无线的互联


ESP32和LoRa-R02都是安信可的产品。希望通过这两个产品实现LoRa到无线网的通讯。

1. 选择LoRa库

采用Arduino IDE编制软件,Arduino IDE的非商务用途的软件可以通过Arduino找到相应的库,并且在相应的库里面下载相应的库函数,非常方便,不像采用Github那样有那麽多的麻烦事。在Arduino库中输入LoRa,我们会发现有一大批关于LoRa的库存在:

在这里插入图片描述

可以看到以前提到过的印度人编写的库,这次我选择了一个不知道是那个国家的Jan Gromes编写的LoRaLib库。版本号:8.2.0
在这里插入图片描述

2. 实现LoRa库

选择了LoRa库,分分钟就完成下载,一切就搞定。下面是实现的关键。

2.1 更改库函数

首先要更改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

3. 程序编制

在程序中需要定义和配置:

#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]);
           }
 }

4. 运行结果

在这里插入图片描述

使用库非常方便,可以快速的上手,收到效果。有一点小小的遗憾:

  1. 通过二进制接收收据,不能确定收到数据的长度,要每次事先知道收到数据的字节长度。
  2. 用字符串方式接收,一遇到0就结束。

小小的遗憾,但瑕不掩瑜。希望我们的国人,高手们能做一个我们能够使用的库函数,不要让外国人在网上整天说我们只会索取,不会奉献!

猜你喜欢

转载自blog.csdn.net/weixin_44481398/article/details/103935575