สารบัญ:

LoRa 3Km ถึง 8Km การสื่อสารไร้สายด้วยอุปกรณ์ E32 (sx1278/sx1276) ราคาประหยัดสำหรับ Arduino, Esp8266 หรือ Esp32: 15 ขั้นตอน
LoRa 3Km ถึง 8Km การสื่อสารไร้สายด้วยอุปกรณ์ E32 (sx1278/sx1276) ราคาประหยัดสำหรับ Arduino, Esp8266 หรือ Esp32: 15 ขั้นตอน

วีดีโอ: LoRa 3Km ถึง 8Km การสื่อสารไร้สายด้วยอุปกรณ์ E32 (sx1278/sx1276) ราคาประหยัดสำหรับ Arduino, Esp8266 หรือ Esp32: 15 ขั้นตอน

วีดีโอ: LoRa 3Km ถึง 8Km การสื่อสารไร้สายด้วยอุปกรณ์ E32 (sx1278/sx1276) ราคาประหยัดสำหรับ Arduino, Esp8266 หรือ Esp32: 15 ขั้นตอน
วีดีโอ: มีถ้ำลึกลับอยู่ตรงกลางหน้าผาและไม่มีใครเข้ามาเป็นเวลาหลายสิบปี 2024, กรกฎาคม
Anonim
LoRa 3Km ถึง 8Km การสื่อสารไร้สายด้วยอุปกรณ์ E32 (sx1278/sx1276) ราคาประหยัดสำหรับ Arduino, Esp8266 หรือ Esp32
LoRa 3Km ถึง 8Km การสื่อสารไร้สายด้วยอุปกรณ์ E32 (sx1278/sx1276) ราคาประหยัดสำหรับ Arduino, Esp8266 หรือ Esp32

ฉันสร้างห้องสมุดเพื่อจัดการ EBYTE E32 โดยใช้อุปกรณ์ LoRa ของ Semtech ซึ่งเป็นอุปกรณ์ที่มีประสิทธิภาพมาก เรียบง่าย และราคาถูก

คุณสามารถค้นหาเวอร์ชัน 3Km ได้ที่นี่ เวอร์ชัน 8Km ได้ที่นี่

พวกเขาสามารถทำงานได้ในระยะทาง 3,000 ม. ถึง 8000 ม. และมีคุณสมบัติและพารามิเตอร์มากมาย ดังนั้นฉันจึงสร้างห้องสมุดนี้เพื่อทำให้การใช้งานง่ายขึ้น

เป็นโซลูชันสำหรับการดึงข้อมูลจากเซ็นเซอร์ในเมืองใหญ่หรือเพื่อควบคุมเสียงพึมพำ

เสบียง

Arduino UNO

Wemos D1 mini

LoRa E32 TTL 100 รุ่น 3Km

LoRa E32 TTL รุ่น 1W 8Km

ขั้นตอนที่ 1: ห้องสมุด

ห้องสมุด
ห้องสมุด

คุณสามารถหาห้องสมุดของฉันได้ที่นี่

ดาวน์โหลด.

คลิกปุ่มดาวน์โหลดที่มุมบนขวา เปลี่ยนชื่อโฟลเดอร์ที่ไม่บีบอัด LoRa_E32

ตรวจสอบว่าโฟลเดอร์ LoRa_E32 มี LoRa_E32.cpp และ LoRa_E32.h

วางโฟลเดอร์ไลบรารี LoRa_E32 ของคุณ /libraries/ โฟลเดอร์ คุณอาจต้องสร้างโฟลเดอร์ย่อยของไลบรารีหากเป็นไลบรารีแรกของคุณ

รีสตาร์ท IDE

ขั้นตอนที่ 2: Pinout

Pinout
Pinout
Pinout
Pinout
Pinout
Pinout

อย่างที่คุณเห็น คุณสามารถตั้งค่าโหมดต่างๆ ผ่านหมุด M0 และ M1

มีพินบางตัวที่สามารถใช้งานได้แบบคงที่ แต่ถ้าคุณเชื่อมต่อกับไมโครคอนโทรลเลอร์และกำหนดค่าเหล่านี้ในไลบรารี คุณจะได้รับประสิทธิภาพและคุณสามารถควบคุมโหมดทั้งหมดผ่านซอฟต์แวร์ได้ แต่เราจะอธิบายให้ดีกว่านี้ต่อไป

ขั้นตอนที่ 3: AUX Pin

AUX Pin
AUX Pin
AUX Pin
AUX Pin
AUX Pin
AUX Pin

อย่างที่ฉันพูดไปแล้ว การเชื่อมต่อพินทั้งหมดกับเอาต์พุตของไมโครคอนโทรลเลอร์ไม่สำคัญ คุณสามารถใส่พิน M0 และ M1 ไปที่ HIGH หรือ LOW เพื่อรับการกำหนดค่าที่ต้องการ และถ้าคุณไม่เชื่อมต่อ AUX ไลบรารีจะตั้งค่าการหน่วงเวลาที่เหมาะสมเพื่อให้แน่ใจ ว่าการดำเนินการเสร็จสิ้น

หมุด AUX

เมื่อส่งข้อมูลสามารถใช้เพื่อปลุก MCU ภายนอกและคืนค่า HIGH เมื่อการถ่ายโอนข้อมูลเสร็จสิ้น

เมื่อรับ AUX ไปที่ LOW และคืนค่า HIGH เมื่อบัฟเฟอร์ว่างเปล่า

นอกจากนี้ยังใช้สำหรับการตรวจสอบตัวเองเพื่อเรียกคืนการทำงานปกติ (เมื่อเปิดเครื่องและโหมดสลีป/โปรแกรม)

ขั้นตอนที่ 4: Schema Esp8266 ที่เชื่อมต่ออย่างสมบูรณ์

สคีมาที่เชื่อมต่ออย่างสมบูรณ์ Esp8266
สคีมาที่เชื่อมต่ออย่างสมบูรณ์ Esp8266
สคีมาที่เชื่อมต่ออย่างสมบูรณ์ Esp8266
สคีมาที่เชื่อมต่ออย่างสมบูรณ์ Esp8266

สคีมาการเชื่อมต่อ esp8266 นั้นง่ายกว่าเพราะทำงานที่แรงดันไฟฟ้าเดียวกันของการสื่อสารเชิงตรรกะ (3.3v)

สิ่งสำคัญคือต้องเพิ่มตัวต้านทานแบบดึงขึ้น (4, 7Kohm) เพื่อให้ได้ความเสถียรที่ดี

ขั้นตอนที่ 5: เชื่อมต่อ Schema Arduino อย่างสมบูรณ์

สคีมา Arduino ที่เชื่อมต่ออย่างสมบูรณ์
สคีมา Arduino ที่เชื่อมต่ออย่างสมบูรณ์
สคีมา Arduino ที่เชื่อมต่ออย่างสมบูรณ์
สคีมา Arduino ที่เชื่อมต่ออย่างสมบูรณ์

แรงดันไฟทำงานของ Arduino คือ 5v ดังนั้นเราจึงจำเป็นต้องเพิ่มตัวแบ่งแรงดันบน RX pin M0 และ M1 ของโมดูล LoRa เพื่อป้องกันความเสียหาย คุณสามารถรับข้อมูลเพิ่มเติมได้ที่นี่ ตัวแบ่งแรงดัน: เครื่องคิดเลขและแอปพลิเคชัน

คุณสามารถใช้ตัวต้านทาน 2Kohm กับ GND และ 1Kohm จากสัญญาณแทนที่จะรวมกันบน RX

ขั้นตอนที่ 6: ไลบรารี: ตัวสร้าง

ฉันสร้างชุดของตัวสร้างจำนวนมาก เนื่องจากเราสามารถมีตัวเลือกและสถานการณ์มากขึ้นในการจัดการ

LoRa_E32 (ไบต์ rxPin, ไบต์ txPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (ไบต์ rxPin, ไบต์ txPin, ไบต์ auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600); LoRa_E32 (ไบต์ rxPin, ไบต์ txPin, ไบต์ auxPin, ไบต์ m0Pin, ไบต์ m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

คอนสตรัคเตอร์ชุดแรกถูกสร้างขึ้นเพื่อมอบหมายการจัดการ Serial และพินอื่นๆ ให้กับไลบรารี

rxPin และ txPin เป็นพินสำหรับเชื่อมต่อกับ UART และจำเป็น

auxPin เป็นพินที่ตรวจสอบการทำงาน สถานะการส่งและรับ (เราจะอธิบายต่อไปดีกว่า) พินนั้น ไม่จำเป็น ถ้าคุณไม่ตั้งค่า ฉันจะใช้การหน่วงเวลาเพื่อให้การดำเนินการเสร็จสิ้นเอง (ด้วยเวลาแฝง)

m0pin และ m1Pin เป็นหมุดสำหรับเปลี่ยนโหมดการทำงาน (ดูตารางด้านบน) ฉันคิดว่าหมุดนี้ใน "การผลิต" จะเชื่อมต่อโดยตรงในระดับสูงหรือต่ำ แต่สำหรับการทดสอบ ไลบรารีเหล่านี้มีประโยชน์ในการจัดการ

bpsRate เป็น boudrate ของ SoftwareSerial ปกติคือ 9600 (อัตรา baud เดียวในโหมด programmin/sleep)

ตัวอย่างง่ายๆคือ

#รวม "LoRa_E32.h"LoRa_E32 e32ttl100(2, 3); // RX, TX // LoRa_E32 e32ttl100 (2, 3, 5, 6, 7); // RX, TX

เราสามารถใช้ SoftwareSerial โดยตรงกับตัวสร้างอื่นได้

LoRa_E32 (ฮาร์ดแวร์ซีเรียล* อนุกรม UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (ฮาร์ดแวร์ซีเรียล* ซีเรียล, ไบต์ auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (ฮาร์ดแวร์ซีเรียล* ซีเรียล, ไบต์ auxPin, ไบต์ m0Pin, ไบต์ m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

ตัวอย่างด้านบนด้วยตัวสร้างนี้สามารถทำเช่นนั้นได้

#รวม #รวม "LoRa_E32.h"

ซอฟต์แวร์Serial mySerial(2, 3); // RX, TX

LoRa_E32 e32ttl100(&mySerial);

// LoRa_E32 e32ttl100(&mySerial, 5, 7, 6);

คอนสตรัคเตอร์ชุดสุดท้ายคือการอนุญาตให้ใช้ HardwareSerial แทน SoftwareSerial

LoRa_E32 (SoftwareSerial* อนุกรม UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (SoftwareSerial* serial, ไบต์ auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (SoftwareSerial* serial, ไบต์ auxPin, ไบต์ m0Pin, ไบต์ m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

ขั้นตอนที่ 7: เริ่ม

คำสั่งเริ่มต้นใช้เพื่อเริ่มต้น Serial และพินในโหมดอินพุตและเอาต์พุต

เป็นโมฆะเริ่มต้น ();

ในการดำเนินการคือ

// เริ่มต้นพินทั้งหมดและ UART

e32ttl100.begin();

ขั้นตอนที่ 8: วิธีการกำหนดค่าและข้อมูล

มีชุดวิธีการสำหรับจัดการการกำหนดค่าและรับข้อมูลของอุปกรณ์

ResponseStructContainer รับการกำหนดค่า ();

ResponseStatus setConfiguration(การกำหนดค่าคอนฟิก PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

ResponseStructContainer getModuleInformation();

ถือเป็นโมฆะ printParameters (การกำหนดค่าโครงสร้างการกำหนดค่า);

ResponseStatus resetModule();

ขั้นตอนที่ 9: คอนเทนเนอร์ตอบกลับ

เพื่อให้การจัดการการตอบสนองง่ายขึ้น ฉันสร้างชุดคอนเทนเนอร์ สำหรับฉันในการจัดการข้อผิดพลาดและส่งคืนข้อมูลทั่วไปมีประโยชน์มาก

สถานะการตอบกลับ

นี่คือคอนเทนเนอร์สถานะและมีจุดเริ่มต้นง่ายๆ 2 จุด ด้วยสิ่งนี้ คุณจะได้รับรหัสสถานะและคำอธิบายของรหัสสถานะ

Serial.println(c.getResponseDescription()); // คำอธิบายของรหัส

Serial.println (รหัส c.); // 1 ถ้าสำเร็จ

รหัสคือ

ความสำเร็จ = 1, ERR_UNKNOWN, ERR_NOT_SUPPORT, ERR_NOT_IMPLEMENT, ERR_NOT_INITIAL, ERR_INVALID_PARAM, ERR_DATA_SIZE_NOT_MATCH, ERR_BUF_TOO_SMALL, ERR_TIMEOUT, ERR_HARDWARE, ERR_HEAD_NOT_RECOGNIZED

ตอบกลับคอนเทนเนอร์

คอนเทนเนอร์นี้สร้างขึ้นเพื่อจัดการการตอบสนองของสตริงและมีจุดเริ่มต้น 2 จุด

ข้อมูลที่มีสตริงที่ส่งคืนจากข้อความและสถานะอินสแตนซ์ของ RepsonseStatus

ResponseContainer rs = e32ttl.receiveMessage();

ข้อความสตริง = rs.data;

Serial.println(rs.status.getResponseDescription());

Serial.println (ข้อความ);

ResponseStructContainer

นี่คือคอนเทนเนอร์ที่ "ซับซ้อน" มากกว่า ฉันใช้สิ่งนี้เพื่อจัดการโครงสร้าง มันมีจุดเริ่มต้นเหมือนกันของ ResponseContainer แต่ข้อมูลเป็นตัวชี้เป็นโมฆะเพื่อจัดการโครงสร้างที่ซับซ้อน

ResponseStructContainer ค;

c = e32ttl100.getConfiguration();// รับตัวชี้การกำหนดค่าก่อนการดำเนินการอื่น ๆ ทั้งหมด

การกำหนดค่าการกำหนดค่า = *(การกำหนดค่า*) c.data;

Serial.println(c.status.getResponseDescription());

Serial.println (c.status.code);

getConfiguration และ setConfiguration

วิธีแรกคือ getConfiguration คุณสามารถใช้เพื่อดึงข้อมูลทั้งหมดที่จัดเก็บไว้ในอุปกรณ์

ResponseStructContainer รับการกำหนดค่า ();

นี่คือตัวอย่างการใช้งาน

ResponseStructContainer ค;

c = e32ttl100.getConfiguration();// รับตัวชี้การกำหนดค่าก่อนการดำเนินการอื่น ๆ ทั้งหมด

การกำหนดค่าการกำหนดค่า = *(การกำหนดค่า*) c.data;

Serial.println(c.status.getResponseDescription());

Serial.println (c.status.code);

Serial.println(configuration. SPED.getUARTBaudRate());

โครงสร้างการกำหนดค่ามีข้อมูลการตั้งค่าทั้งหมด และฉันเพิ่มชุดฟังก์ชันเพื่อรับคำอธิบายทั้งหมดของข้อมูลเดียว

การกำหนดค่า ADDL = 0x0; // ส่วนแรกของ addressconfiguration. ADDH = 0x1; // ส่วนที่สองของการกำหนดค่าที่อยู่ CHAN = 0x19; // Channel configuration. OPTION.fec = FEC_0_OFF; // ส่งต่อการกำหนดค่าสวิตช์แก้ไขข้อผิดพลาด OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // การกำหนดค่าโหมดการส่ง OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // การกำหนดค่าการจัดการแบบดึงขึ้น OPTION.transmissionPower = POWER_17; // การกำหนดค่ากำลังส่ง dBm. OPTION.wirelessWakeupTime = WAKE_UP_1250; // รอเวลาสำหรับการตั้งค่าการปลุก SPED.airDataRate = AIR_DATA_RATE_011_48; // การกำหนดค่าอัตราข้อมูลทางอากาศ SPED.uartBaudRate = UART_BPS_115200; // การกำหนดค่าอัตราบอดการสื่อสาร SPED.uartParity = MODE_00_8N1; // พาริตี้บิต

คุณมีฟังก์ชันเทียบเท่าสำหรับแอตทริบิวต์ทั้งหมดเพื่อรับคำอธิบายทั้งหมด:

Serial.print(F("จันทร์:")); Serial.print(configuration. CHAN ธ.ค.); Serial.print(" -> "); Serial.println(configuration.getChannelDescription());Serial.println(F(" ")); 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());

ในทำนองเดียวกัน setConfiguration ต้องการโครงสร้างการกำหนดค่า ดังนั้นฉันคิดว่าวิธีที่ดีกว่าในการจัดการการกำหนดค่าคือการดึงข้อมูลปัจจุบัน ใช้การเปลี่ยนแปลงเพียงอย่างเดียวที่คุณต้องการและตั้งค่าอีกครั้ง

ResponseStatus setConfiguration(การกำหนดค่าคอนฟิก PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

การกำหนดค่าเป็นโครงสร้างที่แสดงไว้ก่อนหน้านี้ saveType อนุญาตให้คุณเลือกได้หากการเปลี่ยนแปลงกลายเป็นถาวรสำหรับเซสชันปัจจุบันเท่านั้น

ResponseStructContainer c;c = e32ttl100.getConfiguration(); // สิ่งสำคัญคือต้องได้รับตัวชี้การกำหนดค่าก่อนการดำเนินการอื่นๆ การกำหนดค่าการกำหนดค่า = *(การกำหนดค่า*) c.data; Serial.println(c.status.getResponseDescription()); Serial.println (c.status.code); printParameters (การกำหนดค่า); การกำหนดค่า ADDL = 0x0; การกำหนดค่า ADDH = 0x1; configuration. CHAN = 0x19; configuration. OPTION.fec = FEC_0_OFF; configuration. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; การกำหนดค่า OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; configuration. OPTION.transmissionPower = POWER_17; configuration. OPTION.wirelessWakeupTime = WAKE_UP_1250; configuration. SPED.airDataRate = AIR_DATA_RATE_011_48; การกำหนดค่าSPED.uartBaudRate = UART_BPS_115200; configuration. SPED.uartParity = MODE_00_8N1; // ตั้งค่าการเปลี่ยนแปลงและตั้งค่าให้ไม่เก็บการกำหนดค่า ResponseStatus rs = e32ttl100.setConfiguration(configuration, WRITE_CFG_PWR_DWN_LOSE); Serial.println(rs.getResponseDescription()); Serial.println(rs.code); printParameters (การกำหนดค่า);

พารามิเตอร์ทั้งหมดได้รับการจัดการเป็นค่าคงที่:

ขั้นตอนที่ 10: ตัวเลือกการกำหนดค่าพื้นฐาน

ตัวเลือกการกำหนดค่าพื้นฐาน
ตัวเลือกการกำหนดค่าพื้นฐาน

ขั้นตอนที่ 11: ส่งข้อความรับ

ก่อนอื่นเราต้องแนะนำวิธีง่ายๆ แต่มีประโยชน์เพื่อตรวจสอบว่ามีบางอย่างอยู่ในบัฟเฟอร์การรับหรือไม่

int พร้อมใช้งาน ();

เป็นการส่งคืนจำนวนไบต์ที่คุณมีในสตรีมปัจจุบัน

ขั้นตอนที่ 12: โหมดการส่งสัญญาณปกติ

โหมดการส่งสัญญาณปกติ
โหมดการส่งสัญญาณปกติ

โหมดการส่งข้อมูลปกติ/โปร่งใสใช้เพื่อส่งข้อความไปยังอุปกรณ์ทั้งหมดที่มีที่อยู่และช่องสัญญาณเดียวกัน

มีหลายวิธีในการส่ง/รับข้อความ เราจะอธิบายโดยละเอียด:

ResponseStatus sendMessage (ข้อความ const String);

ResponseContainer รับข้อความ ();

วิธีแรกคือ sendMessage และใช้เพื่อส่งสตริงไปยังอุปกรณ์ในโหมดปกติ

ResponseStatus rs = e32ttl.sendMessage("Prova");Serial.println(rs.getResponseDescription()); สถานะการตอบกลับ rs = e32ttl.sendMessage("Prova");

อีกเครื่องก็ทำแบบวนซ้ำ

ถ้า (e32ttl.available() > 1){ResponseContainer rs = e32ttl.receiveMessage(); ข้อความสตริง = rs.data; // ก่อนได้รับข้อมูล Serial.println(rs.status.getResponseDescription()); Serial.println (ข้อความ); }

ขั้นตอนที่ 13: จัดการโครงสร้าง

หากคุณต้องการส่งโครงสร้างที่ซับซ้อน คุณสามารถใช้วิธีนี้

ResponseStatus sendMessage (const void *ข้อความ ขนาด const uint8_t); ResponseStructContainer รับข้อความ (ขนาด const uint8_t);

ใช้สำหรับส่ง strucutre เช่น:

struct Messaggione {ประเภทถ่าน[5]; ข้อความถ่าน[8]; บูลไมติโก; }; struct Messaggione messaggione = {"ชั่วคราว", "Peple", จริง}; ResponseStatus rs = e32ttl.sendMessage(&messaggione, sizeof(Messaggione)); Serial.println(rs.getResponseDescription());

และอีกด้านหนึ่งคุณสามารถรับข้อความได้ดังนั้น

ResponseStructContainer rsc = e32ttl.receiveMessage(sizeof(Messaggione));struct Messaggione messaggione = *(Messaggione*) rsc.data; Serial.println (messaggione.message); Serial.println(messaggione.mitico);

อ่านโครงสร้างบางส่วน

ถ้าคุณต้องการอ่านส่วนแรกของข้อความเพื่อจัดการ strucutre ประเภทต่างๆ มากขึ้น คุณสามารถใช้วิธีนี้ได้

ResponseContainer receiveInitialMessage (ขนาด const uint8_t);

ฉันสร้างมันเพื่อรับสตริงที่มีประเภทหรืออื่น ๆ เพื่อระบุโครงสร้างที่จะโหลด

struct Messaggione {// โครงสร้างบางส่วนที่ไม่มีข้อความ typechar[8]; บูลไมติโก; }; ประเภทถ่าน[5]; // ส่วนแรกของโครงสร้าง ResponseContainer rs = e32ttl.receiveInitialMessage(sizeof(type)); // ใส่สตริงในอาร์เรย์ถ่าน (ไม่จำเป็น) memcpy (ประเภท, rs.data.c_str(), sizeof(ประเภท)); Serial.println("อ่านประเภท: "); Serial.println(rs.status.getResponseDescription()); Serial.println (ประเภท); // อ่านส่วนที่เหลือของโครงสร้าง ResponseStructContainer rsc = e32ttl.receiveMessage(sizeof(Messaggione)); struct Messaggione ข้อความ = *(Messaggione*) rsc.data;

ขั้นตอนที่ 14: โหมดคงที่แทนโหมดปกติ

ในลักษณะเดียวกัน ฉันสร้างชุดวิธีการเพื่อใช้กับการส่งแบบตายตัว

เกียร์ธรรมดา

คุณต้องเปลี่ยนเฉพาะวิธีการส่ง เนื่องจากอุปกรณ์ปลายทางไม่ได้รับคำนำที่มีที่อยู่และโหมดคงที่ของช่อง

ดังนั้นสำหรับข้อความสตริงที่คุณมี

ResponseStatus sendFixedMessage (ไบต์ ADDL, ไบต์ ADDH, ไบต์ CHAN, ข้อความสตริง const);ResponseStatus sendBroadcastFixedMessage (ไบต์ CHAN, ข้อความสตริง const);

และสำหรับโครงสร้างที่คุณมี

ResponseStatus sendFixedMessage (ไบต์ ADDL, ไบต์ ADDH, ไบต์ CHAN, const void *ข้อความ, ขนาด const uint8_t);ResponseStatus sendBroadcastFixedMessage (ไบต์ CHAN, const void *ข้อความ, ขนาด const uint8_t);

นี่คือตัวอย่างง่ายๆ

ResponseStatus rs = e32ttl.sendFixedMessage(0, 0, 0x17, &messaggione, sizeof (Messaggione)); // ResponseStatus rs = e32ttl.sendFixedMessage(0, 0, 0x17, "Ciao");

การส่งคงที่มีสถานการณ์มากขึ้น

หากคุณส่งไปยังอุปกรณ์เฉพาะ (สถานการณ์ที่สอง การส่งคงที่) คุณต้องเพิ่ม ADDL, ADDH และ CHAN เพื่อระบุโดยตรง

ResponseStatus rs = e32ttl.sendFixedMessage(2, 2, 0x17, "ข้อความไปยังอุปกรณ์");

หากคุณต้องการส่งข้อความไปยังอุปกรณ์ทั้งหมดใน Channel ที่ระบุ คุณสามารถใช้วิธีนี้ได้

ResponseStatus rs = e32ttl.sendBroadcastFixedMessage(0x17, "ข้อความไปยังอุปกรณ์ของช่อง");

หากคุณต้องการรับข้อความออกอากาศทั้งหมดในเครือข่าย คุณต้องตั้งค่า ADDH และ ADDL ของคุณด้วย BROADCAST_ADDRESS

ResponseStructContainer c;c = e32ttl100.getConfiguration(); // สิ่งสำคัญคือต้องได้รับตัวชี้การกำหนดค่าก่อนการดำเนินการอื่นๆ การกำหนดค่าการกำหนดค่า = *(การกำหนดค่า*) c.data; Serial.println(c.status.getResponseDescription()); Serial.println (c.status.code); printParameters (การกำหนดค่า); การกำหนดค่า ADDL = BROADCAST_ADDRESS; การกำหนดค่า ADDH = BROADCAST_ADDRESS; // ตั้งค่าการเปลี่ยนแปลงและตั้งค่าให้ไม่เก็บการกำหนดค่า ResponseStatus rs = e32ttl100.setConfiguration(configuration, WRITE_CFG_PWR_DWN_LOSE); Serial.println(rs.getResponseDescription()); Serial.println(rs.code); printParameters (การกำหนดค่า);

ขั้นตอนที่ 15: ขอบคุณ

ตอนนี้คุณมีข้อมูลทั้งหมดในการทำงานแล้ว แต่ฉันคิดว่าการแสดงตัวอย่างที่เป็นจริงเป็นสิ่งสำคัญเพื่อทำความเข้าใจความเป็นไปได้ทั้งหมดให้ดีขึ้น

  1. อุปกรณ์ LoRa E32 สำหรับ Arduino, esp32 หรือ esp8266: การตั้งค่าและการใช้งานพื้นฐาน
  2. อุปกรณ์ LoRa E32 สำหรับ Arduino, esp32 หรือ esp8266: library
  3. อุปกรณ์ LoRa E32 สำหรับ Arduino, esp32 หรือ esp8266: configuration
  4. อุปกรณ์ LoRa E32 สำหรับ Arduino, esp32 หรือ esp8266: การส่งสัญญาณคงที่
  5. อุปกรณ์ LoRa E32 สำหรับ Arduino, esp32 หรือ esp8266: การประหยัดพลังงานและการส่งข้อมูลที่มีโครงสร้าง

แนะนำ: