用于Arduino、esp32或esp8266的Ebyte LoRa E32(SX1278)设备:省电和发送结构化数据 - 第五部分
原作者:renzo mischianti - 2019年12月3日发布 - 2021年6月21日更新
现在我们将了解如何使用基于流行的SX1276/SX1278无线模块的E32 UART LoRa设备来发送复杂的结构和管理节电。
如果你有像冻结设备的麻烦,你必须把一个上拉的4.7k电阻或更好的连接到设备AUX引脚。
另一个有趣的功能是省电配置,你可以设置M0和M1,在省电模式下从一个设备到另一个设备进行唤醒。
所以我们需要在唤醒模式下连接发送设备(如果你完全连接了设备,库就会为你做所有模式):
同时接收设备处于省电模式(如果你完全连接了设备,库为你做所有模式)。
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)设备:省电和发送结构化数据 - 第五部分相关推荐
- 用于Arduino、esp32或esp8266的Ebyte LoRa E32(SX1278)设备:库 - 第二部分
原作者:renzo mischianti - 2019年10月21日出版 - 2021年6月21日更新 我创建了一个库来管理基于Semtech系列的LoRa设备的EBYTE E32,该设备非常强大,简 ...
- Arduino ESP32深度睡眠触摸唤醒(触摸唤醒)
Arduino ESP32深度睡眠触摸唤醒(触摸唤醒) 通过D4–GPIO4引脚触摸感应,触发唤醒功能. 睡眠模式下,触摸中断响应流程图 实例代码 /*深度睡眠触摸唤醒(触摸T0唤醒) */#defi ...
- Arduino ESP32 获取网络时间并同步本地RTC时钟
Arduino ESP32 获取网络时间并同步本地RTC时钟 相关篇<Arduino ESP32 最简单直接获取网络时间方法> 在 ArduinoESP32核心支持库当中已经包含相关的获取 ...
- Arduino ESP32利用PWM实现板载LED呼吸灯效果
Arduino ESP32利用PWM实现板载LED呼吸灯效果 LEDC简介 LED控制(LEDC)外围设备主要用于控制LED的强度,尽管它也可以用于生成PWM信号用于其他目的.它具有16个通道,可以生 ...
- Arduino+esp32+blinker第一课点灯
Arduino+esp32+blinker第一课点灯 文章目录 Arduino+esp32+blinker第一课点灯 前言 一.开发环境搭建 二.开发第一个点灯程序 1.添加设备 2.载入示例 3.代 ...
- arduino UNO R3/ESP8266连接MCP2515 CAN
arduino UNO R3/ESP8266连接MCP2515 CAN CAN接收: // demo: CAN-BUS Shield, receive data with interrupt mode ...
- Arduino ESP32 flash数据存储结构
Arduino ESP32 flash数据存储结构 分区表官方文档:<分区表> 想了解ESP32 flash数据存储结构需要从分区表开始了解.一点类似一台电脑上挂载的硬盘一样. 分区表保存 ...
- 基于USR-WiFi模块的 ESP32,ESP8266 Thonny调试器
简 介: 本文给出了基于WiFi模块 USR-WiFi232 设置无线调试ESP32,ESP8266 MicroPython开发的环境. 关键词: ESP32,ESP8266,Thonny,Micro ...
- 两款带有WiFI的MicroPython模块:ESP32,ESP8266
文章目录 ▌01 两款WiFi开发板 1.ESP32开发板 (1)焊接模块的接口插针 (2)加电测试 3.刷新ESP32固件 2.ESP8266开发板 (1)接入微机USB (2)连接Thonny ▌ ...
最新文章
- 人工智能都沸腾3年了,现在就业情况还乐观吗?
- [LeetCode] Combinations
- Python爬虫应用实战-如何对爬取的数据进行数据存储?
- java 序列化 原理解析
- MySQL 数据库常用存储引擎的特点
- gcc编译器命令使用详解
- mysql INFORMATION_SCHEMA COLUMNS 解释
- vue请求封装,http-接口部分(文档笔记)
- android 单元测试 多线程,多线程之单元测试(Junit)
- centos6 查看SELinux状态 关闭SELinux
- sed个人习惯用法总结
- 破解sourceInsight4
- 系统设计和机器学习算法
- 将Sublime打造成超强前端IDE
- php电商开发系统shopnc,shopnc二次开发(一),shopnc二次开发(_PHP教程
- 鸿蒙阴阳星辰塔,第1298章鸿蒙星辰塔的新能力
- (一)、跨服务器自动备份
- 利用Python导入股票列表
- Linux配置Redis主从
- Java实现网页浏览次数