ESP32和LoRa SX1278通讯


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就结束。

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

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于ESP32和SX1268芯片的LoRa网关的完整idf代码示例: ```c #include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" #include "driver/spi_master.h" #include "sx126x.h" #include "lora_gateway.h" #define TAG "LoRa" // SX1268芯片的SPI引脚定义 #define PIN_NUM_MISO 19 #define PIN_NUM_MOSI 23 #define PIN_NUM_CLK 18 #define PIN_NUM_CS 5 #define PIN_NUM_BUSY 4 #define PIN_NUM_RST 21 #define PIN_NUM_DIO1 36 // LoRa网关的参数定义 #define LORA_FREQUENCY 868000000 #define LORA_BANDWIDTH 125000 #define LORA_SPREADING_FACTOR 7 #define LORA_CODING_RATE 1 #define LORA_SYNC_WORD 0x12 #define LORA_TX_POWER 14 #define LORA_PREAMBLE_LENGTH 8 #define LORA_HEADER_MODE SX126X_LORA_PACKET_VARIABLE_LENGTH #define LORA_PAYLOAD_LENGTH 255 #define LORA_RX_TIMEOUT 0 static spi_device_handle_t spi; // SX1268芯片的SPI总线初始化函数 static void sx126x_spi_init(void) { spi_bus_config_t bus_config = { .miso_io_num = PIN_NUM_MISO, .mosi_io_num = PIN_NUM_MOSI, .sclk_io_num = PIN_NUM_CLK, .quadwp_io_num = -1, .quadhd_io_num = -1, .max_transfer_sz = 0 }; spi_device_interface_config_t dev_config = { .command_bits = 0, .address_bits = 0, .dummy_bits = 0, .mode = 0, .duty_cycle_pos = 0, .cs_ena_pretrans = 0, .cs_ena_posttrans = 0, .clock_speed_hz = 10000000, .input_delay_ns = 0, .spics_io_num = PIN_NUM_CS, .flags = 0, .queue_size = 1 }; spi_bus_initialize(HSPI_HOST, &bus_config, 1); spi_bus_add_device(HSPI_HOST, &dev_config, &spi); } // LoRa网关的初始化函数 void lora_gateway_init(void) { // 初始化SPI总线和SX1268芯片 sx126x_spi_init(); sx126x_init(spi, PIN_NUM_BUSY, PIN_NUM_RST, PIN_NUM_DIO1); // 配置LoRa参数 sx126x_set_standby(); sx126x_set_channel(LORA_FREQUENCY); sx126x_set_lora_modem(); sx126x_set_lora_bandwidth(LORA_BANDWIDTH); sx126x_set_lora_spreading_factor(LORA_SPREADING_FACTOR); sx126x_set_lora_coding_rate(LORA_CODING_RATE); sx126x_set_lora_sync_word(LORA_SYNC_WORD); sx126x_set_tx_power(LORA_TX_POWER); sx126x_set_lora_preamble_length(LORA_PREAMBLE_LENGTH); sx126x_set_lora_header_mode(LORA_HEADER_MODE); sx126x_set_lora_payload_length(LORA_PAYLOAD_LENGTH); sx126x_set_lora_rx_timeout(LORA_RX_TIMEOUT); // 进入待机状态 sx126x_set_standby(); } // LoRa网关的发送数据函数 void lora_gateway_send_data(const uint8_t *data, uint8_t size) { // 配置SX1268芯片为发送模式 sx126x_set_standby(); sx126x_set_lora_tx(); // 将数据发送到SX1268芯片 sx126x_write_buffer(data, size); // 等待发送完成 sx126x_wait_for_tx_done(); } // LoRa网关的接收数据函数 uint8_t lora_gateway_receive_data(uint8_t *data, uint8_t size) { // 配置SX1268芯片为接收模式 sx126x_set_standby(); sx126x_set_lora_rx(); // 等待接收完成 if (sx126x_wait_for_rx_done() == SX126X_STATUS_OK) { // 从SX1268芯片读取接收到的数据 uint8_t received_size = sx126x_read_buffer(data, size); return received_size; } else { return 0; } } void app_main(void) { // 初始化LoRa网关 lora_gateway_init(); while (1) { // 接收LoRa数据 uint8_t received_data[LORA_PAYLOAD_LENGTH]; uint8_t received_size = lora_gateway_receive_data(received_data, LORA_PAYLOAD_LENGTH); if (received_size > 0) { ESP_LOGI(TAG, "Received %d bytes of data", received_size); // 处理接收到的数据 // ... } // 发送LoRa数据 uint8_t send_data[] = {0x01, 0x02, 0x03, 0x04}; lora_gateway_send_data(send_data, sizeof(send_data)); ESP_LOGI(TAG, "Sent data: %02x %02x %02x %02x", send_data[0], send_data[1], send_data[2], send_data[3]); // 等待一段时间 vTaskDelay(1000 / portTICK_PERIOD_MS); } } ``` 需要注意的是,这个示例代码中的LoRa参数是根据868MHz频段和125kHz带宽进行配置的,使用时需要根据实际情况进行修改。同时,还需要进行相关的硬件连接和配置,如SX1268芯片的SPI引脚定义、硬件连接等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值