欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

用于Arduino、esp32或esp8266的Ebyte LoRa E32(SX1278)设备:省电和发送结构化数据 - 第五部分

发布时间:2024/1/18 40 豆豆
生活随笔 收集整理的这篇文章主要介绍了 用于Arduino、esp32或esp8266的Ebyte LoRa E32(SX1278)设备:省电和发送结构化数据 - 第五部分 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

作者:renzo mischianti - 2019年12月3日发布 - 2021年6月21日更新

现在我们将了解如何使用基于流行的SX1276/SX1278无线模块的E32 UART LoRa设备来发送复杂的结构和管理节电。

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

 

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

另一个有趣的功能是省电配置,你可以设置M0和M1,在省电模式下从一个设备到另一个设备进行唤醒。

 所以我们需要在唤醒模式下连接发送设备(如果你完全连接了设备,库就会为你做所有模式

图 2LoRa E32 Arduino唤醒连接(发射端)

 

图 3LoRa E32 Wemos D1唤醒连接(发射端)

 同时接收设备处于省电模式(如果你完全连接了设备,库为你做所有模式)。

 

图 4LoRa E32 Arduino节电连接(接收端)

 

图 5LoRa E32 Wemos D1省电连接(接收端)

 

1.唤醒时间

一个重要的配置参数是唤醒时间,对发送方来说很重要,因为它在信息中添加了一个长的前奏(长的唤醒时间),接收方使用唤醒时间作为拉动间隔时间检查。

因此,如果接收方每隔250毫秒(唤醒时间)检查一次是否有消息,如果发送方添加了2秒的唤醒时间,可能接收方就会检查消息前言,等待真正的消息到来,读取它并返回到省电模式。

因此,如果你想最大限度地节省电力,你必须把发送方的唤醒时间降到最低,把接收方的唤醒时间降到最高,如果你想提高效率,你必须做相反的事。

射端代码 (如果你不做完全连接,请记住,首先你必须在程序/睡眠模式下设置配置,然后再以指定的方式返回)

 

/** LoRa E32-TTL-100* Send fixed transmission message to a specified point.* https://www.mischianti.org** E32-TTL-100----- Arduino UNO or esp8266* M0 ----- 3.3v (To config) 3.3v (To send) 7 (To dinamically manage)* M1 ----- 3.3v (To config) GND (To send) 6 (To dinamically manage)* TX ----- PIN 2 (PullUP)* RX ----- PIN 3 (PullUP & Voltage divider)* AUX ----- Not connected (5 if you connect)* VCC ----- 3.3v/5v* GND ----- GND**/ #include "Arduino.h" #include "LoRa_E32.h"// ---------- esp8266 pins -------------- //LoRa_E32 e32ttl(D2, D3, D5, D7, D6); //LoRa_E32 e32ttl(D2, D3, D5, D7, D6); // Config without connect AUX and M0 M1 #include <SoftwareSerial.h> SoftwareSerial mySerial(D2, D3); // e32 TX e32 RX LoRa_E32 e32ttl(&mySerial, D5, D7, D6);//#include <SoftwareSerial.h> //SoftwareSerial mySerial(D2, D3); // e32 TX e32 RX //LoRa_E32 e32ttl(&mySerial, D5, D7, D6); // -------------------------------------// ---------- Arduino pins -------------- //LoRa_E32 e32ttl(2, 3, 5, 7, 6); //LoRa_E32 e32ttl(2, 3); // Config without connect AUX and M0 M1//#include <SoftwareSerial.h> //SoftwareSerial mySerial(2, 3); // e32 TX e32 RX //LoRa_E32 e32ttl(&mySerial, 5, 7, 6); // -------------------------------------void printParameters(struct Configuration configuration); void printModuleInformation(struct ModuleInformation moduleInformation); //The setup function is called once at startup of the sketch void setup() {Serial.begin(9600);while (!Serial) {; // wait for serial port to connect. Needed for native USB}delay(100);e32ttl.begin();e32ttl.setMode(MODE_1_WAKE_UP);// After set configuration comment set M0 and M1 to low// and reboot if you directly set HIGH M0 and M1 to programResponseStructContainer c;c = e32ttl.getConfiguration();Configuration configuration = *(Configuration*) c.data;configuration.ADDL = 0x01;configuration.ADDH = 0x00;configuration.CHAN = 0x04;configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;configuration.OPTION.wirelessWakeupTime = WAKE_UP_2000;e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);printParameters(configuration);// --------------------------- }// The loop function is called in an endless loop void loop() {delay(2000);Serial.println("Send message to 00 03 04");ResponseStatus rs = e32ttl.sendFixedMessage(0, 3, 0x04, "Message to 00 03 04 device");Serial.println(rs.getResponseDescription()); }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("----------------------------------------");} 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("----------------------------------------");}

 接收端代码 (如果你不做完全连接,请记住,首先你必须在程序/睡眠模式下设置配置,然后在指定模式下返回。):

/** LoRa E32-TTL-100* Receive fixed transmission message on channel.* https://www.mischianti.org** E32-TTL-100----- Arduino UNO or esp8266* M0 ----- 3.3v (To config) GND (To send) 7 (To dinamically manage)* M1 ----- 3.3v (To config) 3.3v (To send) 6 (To dinamically manage)* TX ----- PIN 2 (PullUP)* RX ----- PIN 3 (PullUP & Voltage divider)* AUX ----- Not connected (5 if you connect)* VCC ----- 3.3v/5v* GND ----- GND**/ #include "Arduino.h" #include "LoRa_E32.h"// ---------- esp8266 pins -------------- //LoRa_E32 e32ttl(D2, D3, D5, D7, D6); //LoRa_E32 e32ttl(D2, D3); // Config without connect AUX and M0 M1//#include <SoftwareSerial.h> //SoftwareSerial mySerial(D2, D3); // e32 TX e32 RX //LoRa_E32 e32ttl(&mySerial, D5, D7, D6); // -------------------------------------// ---------- Arduino pins -------------- //LoRa_E32 e32ttl(2, 3, 5, 7, 6); LoRa_E32 e32ttl(2, 3); // Config without connect AUX and M0 M1//#include <SoftwareSerial.h> //SoftwareSerial mySerial(2, 3); // e32 TX e32 RX //LoRa_E32 e32ttl(&mySerial, 5, 7, 6); // ------------------------------------- void printParameters(struct Configuration configuration); void printModuleInformation(struct ModuleInformation moduleInformation); //The setup function is called once at startup of the sketch void setup() {Serial.begin(9600);while (!Serial) {; // wait for serial port to connect. Needed for native USB}delay(100);e32ttl.begin();e32ttl.setMode(MODE_2_POWER_SAVING);// e32ttl.resetModule();// After set configuration comment set M0 and M1 to low// and reboot if you directly set HIGH M0 and M1 to programResponseStructContainer c;c = e32ttl.getConfiguration();Configuration configuration = *(Configuration*) c.data;configuration.ADDL = 3;configuration.ADDH = 0;configuration.CHAN = 0x04;configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;configuration.OPTION.wirelessWakeupTime = WAKE_UP_250;e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);printParameters(configuration);// ---------------------------Serial.println();Serial.println("Start listening!"); }// The loop function is called in an endless loop void loop() {if (e32ttl.available() > 1){ResponseContainer rs = e32ttl.receiveMessage();// First of all get the dataString message = rs.data;Serial.println(rs.status.getResponseDescription());Serial.println(message);} }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, DEC);Serial.print(F("AddL : ")); Serial.println(configuration.ADDL, DEC);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("----------------------------------------");} 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("----------------------------------------");}

 

2.发送复杂的结构

我们可以使用我们想要的字符串,我们可以使用JSON格式等等,但是如果你想使用本地模式的结构化信息(字节数组),就可以发送它们。

发送的示例代码可以是

struct Message {char type[5] = "TEMP";char message[8] = "Kitchen";byte temperature[4]; } message;*(float*)(message.temperature) = 19.2;ResponseStatus rs = e32ttl.sendFixedMessage(0,3,4,&message, sizeof(Message)); Serial.println(rs.getResponseDescription());

 接受端的示例代码:

if (e32ttl.available() > 1){ResponseStructContainer rsc = e32ttl.receiveMessage(sizeof(Message));struct Message message = *(Message*) rsc.data;Serial.println(message.type);Serial.println(*(float*)(message.temperature));Serial.println(message.message);free(rsc.data); }

 完整的发射端代码:

/** LoRa E32-TTL-100* Send fixed transmission structured message to a specified point.* https://www.mischianti.org** E32-TTL-100----- Arduino UNO or esp8266* M0 ----- 3.3v (To config) GND (To send) 7 (To dinamically manage)* M1 ----- 3.3v (To config) GND (To send) 6 (To dinamically manage)* TX ----- PIN 2 (PullUP)* RX ----- PIN 3 (PullUP & Voltage divider)* AUX ----- Not connected (5 if you connect)* VCC ----- 3.3v/5v* GND ----- GND**/ #include "Arduino.h" #include "LoRa_E32.h"// ---------- esp8266 pins -------------- //LoRa_E32 e32ttl(D2, D3, D5, D7, D6); //LoRa_E32 e32ttl(D2, D3, D5, D7, D6); // Config without connect AUX and M0 M1 #include <SoftwareSerial.h> SoftwareSerial mySerial(D2, D3); // e32 TX e32 RX LoRa_E32 e32ttl(&mySerial, D5, D7, D6);//#include <SoftwareSerial.h> //SoftwareSerial mySerial(D2, D3); // e32 TX e32 RX //LoRa_E32 e32ttl(&mySerial, D5, D7, D6); // -------------------------------------// ---------- Arduino pins -------------- //LoRa_E32 e32ttl(2, 3, 5, 7, 6); //LoRa_E32 e32ttl(2, 3); // Config without connect AUX and M0 M1//#include <SoftwareSerial.h> //SoftwareSerial mySerial(2, 3); // e32 TX e32 RX //LoRa_E32 e32ttl(&mySerial, 5, 7, 6); // -------------------------------------void printParameters(struct Configuration configuration); void printModuleInformation(struct ModuleInformation moduleInformation); //The setup function is called once at startup of the sketch void setup() {Serial.begin(9600);while (!Serial) {; // wait for serial port to connect. Needed for native USB}delay(100);e32ttl.begin();// After set configuration comment set M0 and M1 to low// and reboot if you directly set HIGH M0 and M1 to programResponseStructContainer c;c = e32ttl.getConfiguration();Configuration configuration = *(Configuration*) c.data;configuration.ADDL = 0x01;configuration.ADDH = 0x00;configuration.CHAN = 0x02;configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);printParameters(configuration);// --------------------------- } struct Message {char type[5];char message[8];int temperature; } message;int i = 0; // The loop function is called in an endless loop void loop() {delay(2500);i++;struct Message {char type[5] = "TEMP";char message[8] = "Kitchen";byte temperature[4];} message;*(float*)(message.temperature) = 19.2;ResponseStatus rs = e32ttl.sendFixedMessage(0,3,4,&message, sizeof(Message));Serial.println(rs.getResponseDescription()); }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("----------------------------------------");} 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("----------------------------------------");}

完整的接受端代码:

/** LoRa E32-TTL-100* Receive fixed transmission message on channel.* https://www.mischianti.org** E32-TTL-100----- Arduino UNO or esp8266* M0 ----- 3.3v (To config) GND (To send) 7 (To dinamically manage)* M1 ----- 3.3v (To config) GND (To send) 6 (To dinamically manage)* TX ----- PIN 2 (PullUP)* RX ----- PIN 3 (PullUP & Voltage divider)* AUX ----- Not connected (5 if you connect)* VCC ----- 3.3v/5v* GND ----- GND**/ #include "Arduino.h" #include "LoRa_E32.h"// ---------- esp8266 pins -------------- //LoRa_E32 e32ttl(D2, D3, D5, D7, D6); //LoRa_E32 e32ttl(D2, D3); // Config without connect AUX and M0 M1//#include <SoftwareSerial.h> //SoftwareSerial mySerial(D2, D3); // e32 TX e32 RX //LoRa_E32 e32ttl(&mySerial, D5, D7, D6); // -------------------------------------// ---------- Arduino pins -------------- //LoRa_E32 e32ttl(2, 3, 5, 7, 6); LoRa_E32 e32ttl(2, 3, 4); // Config without connect AUX and M0 M1//#include <SoftwareSerial.h> //SoftwareSerial mySerial(2, 3); // e32 TX e32 RX //LoRa_E32 e32ttl(&mySerial, 5, 7, 6); // ------------------------------------- void printParameters(struct Configuration configuration); void printModuleInformation(struct ModuleInformation moduleInformation); //The setup function is called once at startup of the sketch void setup() {Serial.begin(9600);while (!Serial) {; // wait for serial port to connect. Needed for native USB}delay(100);e32ttl.begin();// e32ttl.resetModule();// After set configuration comment set M0 and M1 to low// and reboot if you directly set HIGH M0 and M1 to programResponseStructContainer c;c = e32ttl.getConfiguration();Configuration configuration = *(Configuration*) c.data;configuration.ADDL = 3;configuration.ADDH = 0;configuration.CHAN = 0x04;configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);printParameters(configuration);// ---------------------------Serial.println();Serial.println("Start listening!");e32ttl.setMode(MODE_2_POWER_SAVING);} struct Message {char type[5];char message[8];byte temperature[4]; };// The loop function is called in an endless loop void loop() {if (e32ttl.available() > 1){ResponseStructContainer rsc = e32ttl.receiveMessage(sizeof(Message));struct Message message = *(Message*) rsc.data;Serial.println(message.type);Serial.println(*(float*)(message.temperature));Serial.println(message.message);free(rsc.data);} }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, DEC);Serial.print(F("AddL : ")); Serial.println(configuration.ADDL, DEC);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("----------------------------------------");} 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("----------------------------------------");}

但现实生活并不那么简单,可能你的home里有多个结构不同的传感器,所以你需要接收多个结构,一个可能的解决方案是读取结构的第一部分,并按你的要求实例化其余部分。

3.读取一段结构

因此,如果你想拥有你要阅读的结构类型

char type[5]; // first part of structure ResponseContainer rs = e32ttl.receiveInitialMessage(sizeof(type));String typeStr = rs.data;

有了这些信息,我们可以从不同的设备中创建指定的结构,例如:

struct Message {char type[5] = "TEMP";char message[8] = "Kitchen";byte temperature[4]; } message;*(float*)(message.temperature) = 19.2;ResponseStatus rs = e32ttl.sendFixedMessage(0,3,4,&message, sizeof(Message)); Serial.println(rs.getResponseDescription());

struct Message {char type[5] = "HUM";char message[8] = "Room";byte humidity; } message;message.humidity = 65;ResponseStatus rs = e32ttl.sendFixedMessage(0,3,4,&message, sizeof(Message)); Serial.println(rs.getResponseDescription());

因此,你可以从接收器中加载指定的结构:

if (e32ttl.available() > 1){char type[5]; // first part of structureResponseContainer rs = e32ttl.receiveInitialMessage(sizeof(type)); // Put string in a char array (not needed) // memcpy ( type, rs.data.c_str(), sizeof(type) );String typeStr = rs.data;Serial.println(typeStr);if (typeStr=="TEMP"){ResponseStructContainer rsc = e32ttl.receiveMessage(sizeof(Message));struct Message message = *(Message*) rsc.data;Serial.println(*(float*)(message.temperature));Serial.println(message.message);free(rsc.data);}else if (typeStr == "HUM"){ResponseStructContainer rsc = e32ttl.receiveMessage(sizeof(MessageHumidity));struct MessageHumidity message = *(MessageHumidity*) rsc.data;Serial.println(message.humidity);Serial.println(message.message);free(rsc.data);}else{Serial.println("Something goes wrong!!");}}

因此,我们有2个发射端代码

1像这样发送浮动的温度:

/** LoRa E32-TTL-100* Send fixed transmission structured message to a specified point.* https://www.mischianti.org** E32-TTL-100----- Arduino UNO or esp8266* M0 ----- 3.3v (To config) GND (To send) 7 (To dinamically manage)* M1 ----- 3.3v (To config) GND (To send) 6 (To dinamically manage)* TX ----- PIN 2 (PullUP)* RX ----- PIN 3 (PullUP & Voltage divider)* AUX ----- Not connected (5 if you connect)* VCC ----- 3.3v/5v* GND ----- GND**/ #include "Arduino.h" #include "LoRa_E32.h"// ---------- esp8266 pins -------------- //LoRa_E32 e32ttl(D2, D3, D5, D7, D6); //LoRa_E32 e32ttl(D2, D3, D5, D7, D6); // Config without connect AUX and M0 M1 #include <SoftwareSerial.h> SoftwareSerial mySerial(D2, D3); // e32 TX e32 RX LoRa_E32 e32ttl(&mySerial, D5, D7, D6);//#include <SoftwareSerial.h> //SoftwareSerial mySerial(D2, D3); // e32 TX e32 RX //LoRa_E32 e32ttl(&mySerial, D5, D7, D6); // -------------------------------------// ---------- Arduino pins -------------- //LoRa_E32 e32ttl(2, 3, 5, 7, 6); //LoRa_E32 e32ttl(2, 3); // Config without connect AUX and M0 M1//#include <SoftwareSerial.h> //SoftwareSerial mySerial(2, 3); // e32 TX e32 RX //LoRa_E32 e32ttl(&mySerial, 5, 7, 6); // -------------------------------------void printParameters(struct Configuration configuration); void printModuleInformation(struct ModuleInformation moduleInformation); //The setup function is called once at startup of the sketch void setup() {Serial.begin(9600);while (!Serial) {; // wait for serial port to connect. Needed for native USB}delay(100);e32ttl.begin();// After set configuration comment set M0 and M1 to low// and reboot if you directly set HIGH M0 and M1 to programResponseStructContainer c;c = e32ttl.getConfiguration();Configuration configuration = *(Configuration*) c.data;configuration.ADDL = 0x01;configuration.ADDH = 0x00;configuration.CHAN = 0x02;configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);printParameters(configuration);// --------------------------- } struct Message {char type[5];char message[8];int temperature; } message;int i = 0; // The loop function is called in an endless loop void loop() {delay(2500);i++;struct Message {char type[5] = "TEMP";char message[8] = "Kitchen";byte temperature[4];} message;*(float*)(message.temperature) = 19.2;ResponseStatus rs = e32ttl.sendFixedMessage(0,3,4,&message, sizeof(Message));Serial.println(rs.getResponseDescription()); }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("----------------------------------------");} 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("----------------------------------------");}

2并像这样发送湿度值:

/** LoRa E32-TTL-100* Send fixed transmission structured message to a specified point.* https://www.mischianti.org** E32-TTL-100----- Arduino UNO or esp8266* M0 ----- 3.3v (To config) GND (To send) 7 (To dinamically manage)* M1 ----- 3.3v (To config) GND (To send) 6 (To dinamically manage)* TX ----- PIN 2 (PullUP)* RX ----- PIN 3 (PullUP & Voltage divider)* AUX ----- Not connected (5 if you connect)* VCC ----- 3.3v/5v* GND ----- GND**/ #include "Arduino.h" #include "LoRa_E32.h"// ---------- esp8266 pins -------------- //LoRa_E32 e32ttl(D2, D3, D5, D7, D6); //LoRa_E32 e32ttl(D2, D3, D5, D7, D6); // Config without connect AUX and M0 M1 #include <SoftwareSerial.h> SoftwareSerial mySerial(D2, D3); // e32 TX e32 RX LoRa_E32 e32ttl(&mySerial, D5, D7, D6);//#include <SoftwareSerial.h> //SoftwareSerial mySerial(D2, D3); // e32 TX e32 RX //LoRa_E32 e32ttl(&mySerial, D5, D7, D6); // -------------------------------------// ---------- Arduino pins -------------- //LoRa_E32 e32ttl(2, 3, 5, 7, 6); //LoRa_E32 e32ttl(2, 3); // Config without connect AUX and M0 M1//#include <SoftwareSerial.h> //SoftwareSerial mySerial(2, 3); // e32 TX e32 RX //LoRa_E32 e32ttl(&mySerial, 5, 7, 6); // -------------------------------------void printParameters(struct Configuration configuration); void printModuleInformation(struct ModuleInformation moduleInformation); //The setup function is called once at startup of the sketch void setup() {Serial.begin(9600);while (!Serial) {; // wait for serial port to connect. Needed for native USB}delay(100);e32ttl.begin();// After set configuration comment set M0 and M1 to low// and reboot if you directly set HIGH M0 and M1 to programResponseStructContainer c;c = e32ttl.getConfiguration();Configuration configuration = *(Configuration*) c.data;configuration.ADDL = 0x02;configuration.ADDH = 0x00;configuration.CHAN = 0x02;configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);printParameters(configuration);// --------------------------- } int i = 0; // The loop function is called in an endless loop void loop() {delay(2500);i++;struct Message {char type[5] = "HUM";char message[8] = "Room";byte humidity;} message;message.humidity = 65;ResponseStatus rs = e32ttl.sendFixedMessage(0,3,4,&message, sizeof(Message));Serial.println(rs.getResponseDescription()); }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("----------------------------------------");} 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("----------------------------------------");}

还有一个管理这两类信息的接收器

/** LoRa E32-TTL-100* Receive fixed transmission structure message and read first part and load the rest of structure.* https://www.mischianti.org** E32-TTL-100----- Arduino UNO or esp8266* M0 ----- 3.3v (To config) GND (To send) 7 (To dinamically manage)* M1 ----- 3.3v (To config) GND (To send) 6 (To dinamically manage)* TX ----- PIN 2 (PullUP)* RX ----- PIN 3 (PullUP & Voltage divider)* AUX ----- Not connected (5 if you connect)* VCC ----- 3.3v/5v* GND ----- GND**/ #include "Arduino.h" #include "LoRa_E32.h"// ---------- esp8266 pins -------------- //LoRa_E32 e32ttl(D2, D3, D5, D7, D6); //LoRa_E32 e32ttl(D2, D3); // Config without connect AUX and M0 M1//#include <SoftwareSerial.h> //SoftwareSerial mySerial(D2, D3); // e32 TX e32 RX //LoRa_E32 e32ttl(&mySerial, D5, D7, D6); // -------------------------------------// ---------- Arduino pins -------------- //LoRa_E32 e32ttl(2, 3, 5, 7, 6); LoRa_E32 e32ttl(2, 3, 4); // Config without connect AUX and M0 M1//#include <SoftwareSerial.h> //SoftwareSerial mySerial(2, 3); // e32 TX e32 RX //LoRa_E32 e32ttl(&mySerial, 5, 7, 6); // ------------------------------------- void printParameters(struct Configuration configuration); void printModuleInformation(struct ModuleInformation moduleInformation); //The setup function is called once at startup of the sketch void setup() {Serial.begin(9600);while (!Serial) {; // wait for serial port to connect. Needed for native USB}delay(100);e32ttl.begin();// e32ttl.resetModule();// After set configuration comment set M0 and M1 to low// and reboot if you directly set HIGH M0 and M1 to programResponseStructContainer c;c = e32ttl.getConfiguration();Configuration configuration = *(Configuration*) c.data;configuration.ADDL = 3;configuration.ADDH = 0;configuration.CHAN = 0x04;configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);printParameters(configuration);// ---------------------------Serial.println();Serial.println("Start listening!");e32ttl.setMode(MODE_2_POWER_SAVING);} struct Message {char message[8];byte temperature[4]; }; struct MessageHumidity {char message[8];byte humidity; };// The loop function is called in an endless loop void loop() {if (e32ttl.available() > 1){char type[5]; // first part of structureResponseContainer rs = e32ttl.receiveInitialMessage(sizeof(type)); // Put string in a char array (not needed) // memcpy ( type, rs.data.c_str(), sizeof(type) );String typeStr = rs.data;Serial.println(typeStr);if (typeStr=="TEMP"){ResponseStructContainer rsc = e32ttl.receiveMessage(sizeof(Message));struct Message message = *(Message*) rsc.data;Serial.println(*(float*)(message.temperature));Serial.println(message.message);free(rsc.data);}else if (typeStr == "HUM"){ResponseStructContainer rsc = e32ttl.receiveMessage(sizeof(MessageHumidity));struct MessageHumidity message = *(MessageHumidity*) rsc.data;Serial.println(message.humidity);Serial.println(message.message);free(rsc.data);}else{Serial.println("Something goes wrong!!");}} }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, DEC);Serial.print(F("AddL : ")); Serial.println(configuration.ADDL, DEC);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("----------------------------------------");} 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("----------------------------------------");}

总结

以上是生活随笔为你收集整理的用于Arduino、esp32或esp8266的Ebyte LoRa E32(SX1278)设备:省电和发送结构化数据 - 第五部分的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。