用于Arduino、esp32或esp8266的Ebyte LoRa E32(SX1278)设备:配置 - 第三部分

原作者:renzo mischianti - 2019年10月29日发布 - 2021年6月21日更新

现在我们要学习的是基于流行的SX1276/SX1278无线模块的E32 UART LoRa设备配置。

图 1Sx1278 Sx1276 无线Lora uart模块 串行3000米arduino 433 rf

正如我已经说明的那样,我为这个设备创建了一个专门的库,因为配置和传输模式的管理不是那么简单。

如果你有像冻结设备的麻烦,你必须把一个上拉的4.7k电阻或更好的连接到设备AUX引脚。

0.1.库

你可以在这里找到我的

xreef/LoRa_E32_Series_Library: Arduino LoRa EBYTE E32 device library complete and tested with Arduino, esp8266 and esp32. sx1278/sx1276 (github.com)

要下载。

点击右上角的DOWNLOADS按钮,重命名未压缩的文件夹LoRa_E32。

检查LoRa_E32文件夹是否包含LoRa_E32.cpp和LoRa_E32.h。

将LoRa_E32库文件夹放在/libraries/文件夹中。

如果是你的第一个库,你可能需要创建libraries子文件夹。

重新启动IDE。

0.2.用于编程的连接模式

对于基本的使用,我们已经使用了Arduino的这个配置,但在这个配置中,你只在 "正常模式 "下工作,我们将只管理所需的引脚动态(RX,TX)以简化过程。

0.2.1.正常配置(透明)

图 2LoRa E32-TTL-100 Arduino面包板(正常模式)

 以及Wemos D1 mini的这个配置

图 3LoRa E32-TTL-100 Wemos D1面包板(正常模式)

 

0.2.2. 用于编程/睡眠模式的接线

要配置它,你必须将M0和M1设置为高电平(记得要用3.3v)。

但是,如果你把所有的引脚都连接起来,库就会根据需要设置高电平或低电平,这是没问题的。

图 4LoRa E32 TTL 100 Wemos D1 编程/睡眠模式

图 5LoRa E32 TTL 100 Arduino编程/睡眠模式

在这种模式下,你可以管理设备的配置

0.3.基本配置选项

你可以在库文章中找到配置选项。

0.3.1.获取配置

Arduino示例代码

/*
 * LoRa E32-TTL-100
 * Get configuration.
 * https://www.mischianti.org
 *
 * E32-TTL-100----- Arduino UNO
 * M0         ----- 3.3v
 * M1         ----- 3.3v
 * TX         ----- PIN 2 (PullUP)
 * RX         ----- PIN 3 (PullUP & Voltage divider)
 * AUX        ----- Not connected
 * VCC        ----- 3.3v/5v
 * GND        ----- GND
 *
 */
#include "Arduino.h"
#include "LoRa_E32.h"
 
LoRa_E32 e32ttl100(2, 3); // e32 TX e32 RX
void printParameters(struct Configuration configuration);
void printModuleInformation(struct ModuleInformation moduleInformation);
 
void setup() {
    Serial.begin(9600);
    delay(500);
 
    // Startup all pins and UART
    e32ttl100.begin();
 
    ResponseStructContainer c;
    c = e32ttl100.getConfiguration();
    // It's important get configuration pointer before all other operation
    Configuration configuration = *(Configuration*) c.data;
    Serial.println(c.status.getResponseDescription());
    Serial.println(c.status.code);
 
    printParameters(configuration);
 
    ResponseStructContainer cMi;
    cMi = e32ttl100.getModuleInformation();
    // It's important get information pointer before all other operation
    ModuleInformation mi = *(ModuleInformation*)cMi.data;
 
    Serial.println(cMi.status.getResponseDescription());
    Serial.println(cMi.status.code);
 
    printModuleInformation(mi);
}
 
void loop() {
 
}
void printParameters(struct Configuration configuration) {
    Serial.println("----------------------------------------");
 
    Serial.print(F("HEAD BIN: "));  Serial.print(configuration.HEAD, BIN);Serial.print(" ");Serial.print(configuration.HEAD, DEC);Serial.print(" ");Serial.println(configuration.HEAD, HEX);
    Serial.println(F(" "));
    Serial.print(F("AddH BIN: "));  Serial.println(configuration.ADDH, BIN);
    Serial.print(F("AddL BIN: "));  Serial.println(configuration.ADDL, BIN);
    Serial.print(F("Chan BIN: "));  Serial.print(configuration.CHAN, DEC); Serial.print(" -> "); Serial.println(configuration.getChannelDescription());
    Serial.println(F(" "));
    Serial.print(F("SpeedParityBit BIN    : "));  Serial.print(configuration.SPED.uartParity, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTParityDescription());
    Serial.print(F("SpeedUARTDataRate BIN : "));  Serial.print(configuration.SPED.uartBaudRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTBaudRate());
    Serial.print(F("SpeedAirDataRate BIN  : "));  Serial.print(configuration.SPED.airDataRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getAirDataRate());
 
    Serial.print(F("OptionTrans BIN       : "));  Serial.print(configuration.OPTION.fixedTransmission, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFixedTransmissionDescription());
    Serial.print(F("OptionPullup BIN      : "));  Serial.print(configuration.OPTION.ioDriveMode, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getIODroveModeDescription());
    Serial.print(F("OptionWakeup BIN      : "));  Serial.print(configuration.OPTION.wirelessWakeupTime, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getWirelessWakeUPTimeDescription());
    Serial.print(F("OptionFEC BIN         : "));  Serial.print(configuration.OPTION.fec, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFECDescription());
    Serial.print(F("OptionPower BIN       : "));  Serial.print(configuration.OPTION.transmissionPower, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getTransmissionPowerDescription());
 
    Serial.println("----------------------------------------");
 
}
void printModuleInformation(struct ModuleInformation moduleInformation) {
    Serial.println("----------------------------------------");
    Serial.print(F("HEAD BIN: "));  Serial.print(moduleInformation.HEAD, BIN);Serial.print(" ");Serial.print(moduleInformation.HEAD, DEC);Serial.print(" ");Serial.println(moduleInformation.HEAD, HEX);
 
    Serial.print(F("Freq.: "));  Serial.println(moduleInformation.frequency, HEX);
    Serial.print(F("Version  : "));  Serial.println(moduleInformation.version, HEX);
    Serial.print(F("Features : "));  Serial.println(moduleInformation.features, HEX);
    Serial.println("----------------------------------------");
 
}

 这里是代码运行的结果

Begin 
Success
1
----------------------------------------
HEAD BIN: 11000000 192 C0
  
AddH BIN: 0 
AddL BIN: 0
Chan BIN: 23 -> 433MHz
  
SpeedParityBit BIN    : 0 -> 8N1 (Default)
SpeedUARTDataRate BIN : 11 -> 9600bps (default)
SpeedAirDataRate BIN  : 10 -> 2.4kbps (default)
OptionTrans BIN       : 0 -> Transparent transmission (default)
OptionPullup BIN      : 1 -> TXD, RXD, AUX are push-pulls/pull-ups
OptionWakeup BIN      : 0 -> 250ms (default)
OptionFEC BIN         : 1 -> Turn on Forward Error Correction Switch (Default)
OptionPower BIN       : 0 -> 20dBm (Default)
----------------------------------------
Success
1
----------------------------------------
HEAD BIN: 11000011 195 C3
Model no.: 32
Version  : 44
Features : 14
----------------------------------------

 如果你用D2、D3改变针脚2、3,你可以用Wemos D1或其他esp8266/esp32做同样的操作。

图 6LoRa E32请求配置逻辑分析器Arduino

 为了获得正确的信息,我添加了一些#define来改变设备类型(同样的#define管理更多的其他设备,为了简单起见,我只为类型创建一个)。

#define E32_TTL_100
#define E32_TTL_500
#define E32_TTL_1W

你只能选择其中之一。 该参数改变传输功率常数,如配置模式中上部所述。

以同样的方式,你可以选择一个参考频率

#define FREQUENCY_433
#define FREQUENCY_170
#define FREQUENCY_470
#define FREQUENCY_868
#define FREQUENCY_915

你只能选择其中之一。 该参数只为显示目的而改变参考频率。

0.3.2.设置配置

当然,当你有一个配置,你想为你的用途改变它,我的想法是,你可以从设备上获得配置,修改你想要的东西,然后设置它。

请注意,saveType参数是保持设备操作的基本参数,

WRITE_CFG_PWR_DWN_LOSE自然会使错误的配置消失,

而WRITE_CFG_PWR_DWN_SAVE则不会使错误的配置消失。

这里有一个Arduino的示例

/*
 * LoRa E32-TTL-100
 * Get configuration.
 * https://www.mischianti.org
 *
 * E32-TTL-100----- Arduino UNO
 * M0         ----- 3.3v
 * M1         ----- 3.3v
 * TX         ----- PIN 2 (PullUP)
 * RX         ----- PIN 3 (PullUP & Voltage divider)
 * AUX        ----- Not connected
 * VCC        ----- 3.3v/5v
 * GND        ----- GND
 *
 */
#include "Arduino.h"
#include "LoRa_E32.h"
 
LoRa_E32 e32ttl100(2, 3); // e32 TX e32 RX
void printParameters(struct Configuration configuration);
void printModuleInformation(struct ModuleInformation moduleInformation);
 
void setup() {
    Serial.begin(9600);
    delay(500);
 
    // Startup all pins and UART
    e32ttl100.begin();
 
    ResponseStructContainer c;
    c = e32ttl100.getConfiguration();
    // It's important get configuration pointer before all other operation
    Configuration configuration = *(Configuration*) c.data;
    Serial.println(c.status.getResponseDescription());
    Serial.println(c.status.code);
 
    printParameters(configuration);
    configuration.ADDL = 0x0;
    configuration.ADDH = 0x1;
    configuration.CHAN = 0x19;
 
    configuration.OPTION.fec = FEC_0_OFF;
    configuration.OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION;
    configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS;
    configuration.OPTION.transmissionPower = POWER_17;
    configuration.OPTION.wirelessWakeupTime = WAKE_UP_1250;
 
    configuration.SPED.airDataRate = AIR_DATA_RATE_011_48;
    configuration.SPED.uartBaudRate = UART_BPS_115200;
    configuration.SPED.uartParity = MODE_00_8N1;
 
    // Set configuration changed and set to not hold the configuration
    ResponseStatus rs = e32ttl100.setConfiguration(configuration, WRITE_CFG_PWR_DWN_LOSE);
    Serial.println(rs.getResponseDescription());
    Serial.println(rs.code);
    printParameters(configuration);
 
}
 
void loop() {
 
}
void printParameters(struct Configuration configuration) {
    Serial.println("----------------------------------------");
 
    Serial.print(F("HEAD : "));  Serial.print(configuration.HEAD, BIN);Serial.print(" ");Serial.print(configuration.HEAD, DEC);Serial.print(" ");Serial.println(configuration.HEAD, HEX);
    Serial.println(F(" "));
    Serial.print(F("AddH : "));  Serial.println(configuration.ADDH, BIN);
    Serial.print(F("AddL : "));  Serial.println(configuration.ADDL, BIN);
    Serial.print(F("Chan : "));  Serial.print(configuration.CHAN, DEC); Serial.print(" -> "); Serial.println(configuration.getChannelDescription());
    Serial.println(F(" "));
    Serial.print(F("SpeedParityBit     : "));  Serial.print(configuration.SPED.uartParity, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTParityDescription());
    Serial.print(F("SpeedUARTDatte  : "));  Serial.print(configuration.SPED.uartBaudRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTBaudRate());
    Serial.print(F("SpeedAirDataRate   : "));  Serial.print(configuration.SPED.airDataRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getAirDataRate());
 
    Serial.print(F("OptionTrans        : "));  Serial.print(configuration.OPTION.fixedTransmission, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFixedTransmissionDescription());
    Serial.print(F("OptionPullup       : "));  Serial.print(configuration.OPTION.ioDriveMode, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getIODroveModeDescription());
    Serial.print(F("OptionWakeup       : "));  Serial.print(configuration.OPTION.wirelessWakeupTime, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getWirelessWakeUPTimeDescription());
    Serial.print(F("OptionFEC          : "));  Serial.print(configuration.OPTION.fec, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFECDescription());
    Serial.print(F("OptionPower        : "));  Serial.print(configuration.OPTION.transmissionPower, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getTransmissionPowerDescription());
 
    Serial.println("----------------------------------------");
 
}

 这里是控制台的结果

Begin 
Success
1
----------------------------------------
HEAD : 11000000 192 C0
  
AddH : 1
AddL : 0
Chan : 23 -> 433MHz
  
SpeedParityBit     : 0 -> 8N1 (Default)
SpeedUARTDatte  : 11 -> 9600bps (default)
SpeedAirDataRate   : 10 -> 2.4kbps (default)
OptionTrans        : 0 -> Transparent transmission (default)
OptionPullup       : 1 -> TXD, RXD, AUX are push-pulls/pull-ups
OptionWakeup       : 0 -> 250ms (default)
OptionFEC          : 1 -> Turn on Forward Error Correction Switch (Default)
OptionPower        : 0 -> 20dBm (Default) 
----------------------------------------
Success
1
----------------------------------------
HEAD : 11000000 192 C0
  
AddH : 1
AddL : 0
Chan : 25 -> 435MHz
  
SpeedParityBit     : 0 -> 8N1 (Default)
SpeedUARTDatte  : 111 -> 115200bps
SpeedAirDataRate   : 11 -> 4.8kbps
OptionTrans        : 0 -> Transparent transmission (default)
OptionPullup       : 1 -> TXD, RXD, AUX are push-pulls/pull-ups
OptionWakeup       : 100 -> 1250ms
OptionFEC          : 0 -> Turn off Forward Error Correction Switch
OptionPower        : 1 -> 17dBm
----------------------------------------

有了这个库就很简单了,但在下一章我们要测试各种设备选项。

0.4.Thanks

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值