用于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)设备:省电和发送结构化数据 - 第五部分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java】文件上传及下载、限制文件大小
- 下一篇: 双十一怎样开直通车,开直通车需要注意的六