INHOUDSOPGAWE:

LoRa 3 tot 8 km draadlose kommunikasie met lae koste E32 (sx1278/sx1276) -toestel vir Arduino, Esp8266 of Esp32: 15 stappe
LoRa 3 tot 8 km draadlose kommunikasie met lae koste E32 (sx1278/sx1276) -toestel vir Arduino, Esp8266 of Esp32: 15 stappe

Video: LoRa 3 tot 8 km draadlose kommunikasie met lae koste E32 (sx1278/sx1276) -toestel vir Arduino, Esp8266 of Esp32: 15 stappe

Video: LoRa 3 tot 8 km draadlose kommunikasie met lae koste E32 (sx1278/sx1276) -toestel vir Arduino, Esp8266 of Esp32: 15 stappe
Video: Disparate Pieces | Critical Role: THE MIGHTY NEIN | Episode 4 2024, Julie
Anonim
LoRa 3 tot 8 km draadlose kommunikasie met lae koste E32 (sx1278/sx1276) -apparaat vir Arduino, Esp8266 of Esp32
LoRa 3 tot 8 km draadlose kommunikasie met lae koste E32 (sx1278/sx1276) -apparaat vir Arduino, Esp8266 of Esp32

Ek skep 'n biblioteek om EBYTE E32 te bestuur, gebaseer op die Semtech -reeks LoRa -toestelle, 'n baie kragtige, eenvoudige en goedkoop toestel.

U kan die weergawe van 3 km hier vind, die weergawe van 8 km hier

Hulle kan oor 'n afstand van 3000m tot 8000m werk, en hulle het baie funksies en parameters. Ek skep dus hierdie biblioteek om die gebruik te vereenvoudig.

Dit is 'n oplossing om data van metropolitaanse sensors op te haal of om drone te beheer.

Voorrade

Arduino UNO

Wemos D1 mini

LoRa E32 TTL 100 weergawe van 3 km

LoRa E32 TTL 1W 8Km weergawe

Stap 1: Biblioteek

Biblioteek
Biblioteek

U kan my biblioteek hier vind.

Om af te laai.

Klik op die DOWNLOADS -knoppie in die regter boonste hoek, hernoem die ongekomprimeerde gids LoRa_E32.

Kontroleer of die gids LoRa_E32 LoRa_E32.cpp en LoRa_E32.h bevat.

Plaas die biblioteekvouer LoRa_E32 in u / biblioteke / gids. Miskien moet u die biblioteek se submap skep as dit u eerste biblioteek is.

Herbegin die IDE.

Stap 2: Pinout

Pinout
Pinout
Pinout
Pinout
Pinout
Pinout

Soos u kan sien, kan u verskillende modusse instel via M0- en M1 -penne.

Daar is 'n paar penne wat op 'n statiese manier gebruik kan word, maar as u dit aan die mikrobeheerder koppel en dit in die biblioteek konfigureer, kry u meer prestasie en kan u die hele modus via sagteware beheer, maar ons sal dit later beter verduidelik.

Stap 3: AUX -pen

AUX -pen
AUX -pen
AUX -pen
AUX -pen
AUX -pen
AUX -pen

Soos ek alreeds gesê het Dit is nie belangrik om alle pen aan die uitvoer van die mikrobeheerder te koppel nie, maar u kan die M0- en M1 -penne op HIGH of LOW sit om die gewenste konfigurasie te kry, en as u nie AUX koppel nie, stel die biblioteek 'n redelike vertraging in om seker te wees dat die operasie voltooi is.

AUX -pen

By die oordrag van data kan dit gebruik word om die eksterne MCU wakker te maak en HOOG terug te keer na die oordrag van data.

By die ontvangs van AUX gaan LOW en keer HIGH terug as die buffer leeg is.

Dit word ook gebruik vir selfkontrole om die normale werking te herstel (tydens aan- en slaap-/programmodus).

Stap 4: Ten volle gekoppelde skema Esp8266

Ten volle gekoppelde skema Esp8266
Ten volle gekoppelde skema Esp8266
Ten volle gekoppelde skema Esp8266
Ten volle gekoppelde skema Esp8266

esp8266 -verbindingskema is eenvoudiger, want dit werk met dieselfde spanning van logiese kommunikasie (3.3v).

Dit is belangrik om 'n optrekweerstand (4, 7Kohm) by te voeg om goeie stabiliteit te verkry.

Stap 5: Ten volle gekoppelde skema Arduino

Ten volle gekoppelde skema Arduino
Ten volle gekoppelde skema Arduino
Ten volle gekoppelde skema Arduino
Ten volle gekoppelde skema Arduino

Die werkspanning van Arduino is 5v, so ons moet 'n spanningsverdeler byvoeg op die RX -pen M0 en M1 van die LoRa -module om skade te voorkom. U kan hier meer inligting kry: Spanningsverdeler: sakrekenaar en toepassing.

U kan 'n 2Kohm -weerstand teen GND en 1Kohm van sein gebruik as saamgestel op RX.

Stap 6: Biblioteek: Konstrukteur

Ek het 'n groot aantal konstrukteurs gemaak, want ons kan meer opsies en situasies hê om te bestuur.

LoRa_E32 (byte rxPin, byte txPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (byte rxPin, byte txPin, byte auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600); LoRa_E32 (byte rxPin, byte txPin, byte auxPin, byte m0Pin, byte m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

Die eerste stel konstruktore is gemaak om die bestuur van Serial en ander penne na die biblioteek te delegeer.

rxPin en txPin is die pen om aan UART te koppel, en dit is verpligtend.

auxPin is 'n pen wat die werking, transmissie en ontvangstatus nagaan (ons gaan dit later beter verduidelik), dit is nie verpligtend nie, as u dit nie stel nie, pas ek 'n vertraging toe sodat die operasie self kan voltooi (met vertraging).

m0pin en m1Pin is die penne om die modus te verander (sien die tabel bo), ek dink dat die penne in die "produksie" direk HIGH of LOW sal aansluit, maar om dit te toets, sal dit nuttig deur die biblioteek bestuur kan word.

bpsRate is die boudrate van SoftwareSerial wat normaalweg 9600 is (die enigste baud -tempo in programmin/slaapmodus)

'N Eenvoudige voorbeeld is

#sluit "LoRa_E32.h" LoRa_E32 e32ttl100 (2, 3) in; // RX, TX // LoRa_E32 e32ttl100 (2, 3, 5, 6, 7); // RX, TX

Ons kan direk 'n SoftwareSerial met 'n ander konstruktor gebruik

LoRa_E32 (HardwareSerial* serial, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (HardwareSerial* serial, byte auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (HardwareSerial* serial, byte auxPin, byte m0Pin, byte m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

Die voorbeeld bo met hierdie konstruktor kan so wees.

#include #include "LoRa_E32.h"

SoftwareSerial mySerial (2, 3); // RX, TX

LoRa_E32 e32ttl100 (& mySerial);

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

Die laaste stel konstruktore is om 'n HardwareSerial in plaas van SoftwareSerial te gebruik.

LoRa_E32 (SoftwareSerial* serial, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (SoftwareSerial* serial, byte auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (SoftwareSerial* serial, byte auxPin, byte m0Pin, byte m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

Stap 7: Begin

Die begin -opdrag word gebruik om Serial te begin en penne in die invoer- en uitvoermodus.

leegte begin ();

in uitvoering is

// Begin alle penne en UART

e32ttl100.begin ();

Stap 8: Opset- en inligtingsmetode

Daar is 'n stel metodes om die konfigurasie te bestuur en inligting oor die toestel te kry.

ResponseStructContainer getConfiguration ();

ResponseStatus setConfiguration (konfigurasie -opset, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

ResponseStructContainer getModuleInformation ();

void printParameters (struktuurkonfigurasie -opset);

ResponseStatus resetModule ();

Stap 9: Reaksiehouer

Om die bestuur van reaksies te vereenvoudig, skep ek 'n stel houers, vir my baie nuttig om foute te bestuur en generiese data terug te gee.

ReaksieStatus

Dit is 'n statushouer en het 2 eenvoudige ingangspunte, waarmee u die statuskode en die beskrywing van die statuskode kan kry

Serial.println (c.getResponseDescription ()); // Beskrywing van kode

Serial.println (c.code); // 1 as Sukses

Die kode is

SUKSES = 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

Reaksie Houer

Hierdie houer is geskep om String -reaksie te bestuur en het 2 ingangspunte.

data met die string teruggestuur uit die boodskap en status 'n voorbeeld van RepsonseStatus.

ResponseContainer rs = e32ttl.receiveMessage ();

Stringboodskap = rs.data;

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

Serial.println (boodskap);

ResponseStructContainer

Dit is die meer "komplekse" houer; ek gebruik dit om struktuur te bestuur. Dit het dieselfde ingangspunt van ResponseContainer, maar data is 'n leidraad om komplekse struktuur te bestuur.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Dit is belangrik om die konfigurasiewyser voor alle ander operasies te kry

Opsetkonfigurasie = *(Konfigurasie *) c.data;

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

Serial.println (c.status.code);

getConfiguration en setConfiguration

Die eerste metode is getConfiguration, u kan dit gebruik om alle data wat op die toestel gestoor is, op te haal.

ResponseStructContainer getConfiguration ();

Hier is 'n voorbeeld van gebruik.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Dit is belangrik om die konfigurasiewyser voor alle ander operasies te kry

Opsetkonfigurasie = *(Konfigurasie *) c.data;

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

Serial.println (c.status.code);

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

Die konfigurasie -struktuur bevat alle data van die instellings, en ek voeg 'n reeks funksies by om alle beskrywings van enkele data te kry.

konfigurasie. ADDL = 0x0; // Eerste deel van adreskonfigurasie. ADDH = 0x1; // Tweede deel van adreskonfigurasie. CHAN = 0x19; // Kanaalkonfigurasie. OPTION.fec = FEC_0_OFF; // Konfigurasie van die skakelaar vir die regstelling van foute. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // Konfigurasie van die transmissiemodus. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // Opstelbestuurskonfigurasie. OPTION.transmissionPower = POWER_17; // konfigurasie van transmissiekrag van dBm. OPTION.wirelessWakeupTime = WAKE_UP_1250; // Wagtyd vir wakker konfigurasie. SPED.airDataRate = AIR_DATA_RATE_011_48; // Konfigurasie van lugdatatempo. SPED.uartBaudRate = UART_BPS_115200; // Opset van kommunikasie baud rate. SPED.uartParity = MODE_00_8N1; // Pariteit bietjie

U het die ekwivalente funksie vir alle kenmerke om alle beskrywings te kry:

Serial.print (F ("Chan:")); Serial.print (konfigurasie. CHAN, DEC); Serial.print (" ->"); Serial.println (configuration.getChannelDescription ()); Serial.println (F ("")); Serial.print (F ("SpeedParityBit:")); Serial.print (konfigurasie. SPED.uartParity, BIN); Serial.print (" ->"); Serial.println (konfigurasie. SPED.getUARTParityDescription ()); Serial.print (F ("SpeedUARTDatte:")); Serial.print (configuration. SPED.uartBaudRate, BIN); Serial.print (" ->"); Serial.println (konfigurasie. 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 (konfigurasie. OPTION.getFixedTransmissionDescription ()); Serial.print (F ("OptionPullup:")); Serial.print (configuration. OPTION.ioDriveMode, BIN); Serial.print (" ->"); Serial.println (konfigurasie. OPTION.getIODroveModeDescription ()); Serial.print (F ("OptionWakeup:")); Serial.print (configuration. OPTION.wirelessWakeupTime, BIN); Serial.print (" ->"); Serial.println (konfigurasie. OPTION.getWirelessWakeUPTimeDescription ()); Serial.print (F ("OptionFEC:")); Serial.print (konfigurasie. OPTION.fec, BIN); Serial.print (" ->"); Serial.println (konfigurasie. OPTION.getFECDescription ()); Serial.print (F ("OptionPower:")); Serial.print (configuration. OPTION.transmissionPower, BIN); Serial.print (" ->"); Serial.println (konfigurasie. OPTION.getTransmissionPowerDescription ());

Op dieselfde manier wil setConfiguration 'n konfigurasie -struktuur hê, so ek dink die beter manier om die konfigurasie te bestuur, is om die huidige een op te haal, die enigste verandering toe te pas wat u benodig en dit weer in te stel.

ResponseStatus setConfiguration (konfigurasie -opset, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

konfigurasie is die struktuur wat voorheen gewys word, behalwe as u die tipe opsie permanent vir die huidige sessie kies, behalwe as u 'n permanente wysiging van die verandering het.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Dit is belangrik om die konfigurasie -wyser te kry voor alle ander operasies Configuration -konfigurasie = *(Configuration *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (opset); konfigurasie. ADDL = 0x0; konfigurasie. ADDH = 0x1; konfigurasie. CHAN = 0x19; konfigurasie. OPTION.fec = FEC_0_OFF; konfigurasie. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; konfigurasie. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; konfigurasie. OPTION.transmissionPower = POWER_17; konfigurasie. OPTION.wirelessWakeupTime = WAKE_UP_1250; configuration. SPED.airDataRate = AIR_DATA_RATE_011_48; configuration. SPED.uartBaudRate = UART_BPS_115200; configuration. SPED.uartParity = MODE_00_8N1; // Stel konfigurasie verander en stel in dat die konfigurasie nie ResponseStatus rs = e32ttl100.setConfiguration (konfigurasie, WRITE_CFG_PWR_DWN_LOSE) bevat nie; Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (opset);

Die parameter word almal as konstant bestuur:

Stap 10: Basiese konfigurasie -opsie

Basiese konfigurasie -opsie
Basiese konfigurasie -opsie

Stap 11: Stuur ontvangsboodskap

Eerstens moet ons 'n eenvoudige, maar nuttige metode bekendstel om te kyk of daar iets in die ontvangbuffer is

int beskikbaar ();

Dit gee eenvoudig hoeveel grepe u in die huidige stroom het.

Stap 12: Normale transmissiemodus

Normale transmissiemodus
Normale transmissiemodus

Normale/deursigtige transmissiemodus word gebruik om boodskappe na alle toestelle met dieselfde adres en kanaal te stuur.

Daar is baie metodes om 'n boodskap te stuur/te ontvang; ons gaan in detail verduidelik:

ResponseStatus sendMessage (const String -boodskap);

ResponseContainer ontvangMessage ();

Die eerste metode is sendMessage en word gebruik om 'n string na 'n toestel in die normale modus te stuur.

ResponseStatus rs = e32ttl.sendMessage ("Prova"); Serial.println (rs.getResponseDescription ());

Die ander toestel doen eenvoudig op die lus

as (e32ttl.available ()> 1) {ResponseContainer rs = e32ttl.receiveMessage (); Stringboodskap = rs.data; // Kry eers die data Serial.println (rs.status.getResponseDescription ()); Serial.println (boodskap); }

Stap 13: Bestuur struktuur

As u 'n komplekse struktuur wil stuur, kan u hierdie metode gebruik

ResponseStatus sendMessage (const void *boodskap, const uint8_t grootte); ResponseStructContainer ontvangMessage (const uint8_t grootte);

Dit word gebruik om strucutre te stuur, byvoorbeeld:

struct Messaggione {tipe tipe [5]; char boodskap [8]; bool mitico; }; struct Messaggione messaggione = {"TEMP", "Peple", waar}; ResponseStatus rs = e32ttl.sendMessage (& messaggione, sizeof (Messaggione)); Serial.println (rs.getResponseDescription ());

en aan die ander kant kan u die boodskap so ontvang

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

Lees gedeeltelike struktuur

As u die eerste deel van die boodskap wil lees om meer tipe strukture te bestuur, kan u hierdie metode gebruik.

ResponseContainer ontvangInitialMessage (const uint8_t size);

Ek skep dit om 'n string met tipe of ander te ontvang om die struktuur wat ons moet laai te identifiseer.

struct Messaggione {// Gedeeltelike struktuur sonder tikboodskap [8]; bool mitico; }; char tipe [5]; // eerste deel van die struktuur ResponseContainer rs = e32ttl.receiveInitialMessage (sizeof (tipe)); // Sit string in 'n char array (nie nodig nie) memcpy (type, rs.data.c_str (), sizeof (type)); Serial.println ("LEES TIPE:"); Serial.println (rs.status.getResponseDescription ()); Serial.println (tipe); // Lees die res van die struktuur ResponseStructContainer rsc = e32ttl.receiveMessage (sizeof (Messaggione)); struct Messaggione messaggione = *(Messaggione *) rsc.data;

Stap 14: Vaste modus in plaas van normale modus

Op dieselfde manier skep ek 'n stel metodes vir vaste transmissie

Vaste transmissie

U hoef slegs die stuurmetode te verander, omdat die bestemmingsapparaat nie die aanhef met die adres en die kanaalmodus in vaste modus ontvang nie.

U het dus 'n string boodskap

ResponseStatus sendFixedMessage (byte ADDL, byte ADDH, byte CHAN, const String boodskap); ResponseStatus sendBroadcastFixedMessage (byte CHAN, const String boodskap);

en vir die struktuur wat u het

ResponseStatus sendFixedMessage (byte ADDL, byte ADDH, byte CHAN, const void *boodskap, const uint8_t grootte); ResponseStatus sendBroadcastFixedMessage (byte CHAN, const void *boodskap, const uint8_t grootte);

Hier is 'n eenvoudige voorbeeld

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

Vaste transmissie het meer scenario's

As u na 'n spesifieke toestel stuur (tweede scenario's Vaste transmissie), moet u ADDL, ADDH en CHAN byvoeg om dit direk te identifiseer.

ResponseStatus rs = e32ttl.sendFixedMessage (2, 2, 0x17, "Boodskap aan 'n toestel");

As u 'n boodskap na alle toestelle in 'n gespesifiseerde kanaal wil stuur, kan u hierdie metode gebruik.

ResponseStatus rs = e32ttl.sendBroadcastFixedMessage (0x17, "Boodskap aan 'n toestel van 'n kanaal");

As u alle uitsendingsboodskappe in die netwerk wil ontvang, moet u u ADDH en ADDL met BROADCAST_ADDRESS instel.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Dit is belangrik om die konfigurasie -wyser te kry voor alle ander operasies Configuration -konfigurasie = *(Configuration *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (opset); konfigurasie. ADDL = BROADCAST_ADDRESS; konfigurasie. ADDH = BROADCAST_ADDRESS; // Stel konfigurasie verander en stel dat die konfigurasie nie ResponseStatus rs = e32ttl100.setConfiguration (konfigurasie, WRITE_CFG_PWR_DWN_LOSE) bevat nie; Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (opset);

Stap 15: Dankie

Nou het u alle inligting om u werk te verrig, maar ek dink dit is belangrik om 'n paar realistiese voorbeelde te toon om die moontlikheid beter te verstaan.

  1. LoRa E32 -toestel vir Arduino, esp32 of esp8266: instellings en basiese gebruik
  2. LoRa E32 -toestel vir Arduino, esp32 of esp8266: biblioteek
  3. LoRa E32 -toestel vir Arduino, esp32 of esp8266: opset
  4. LoRa E32 -toestel vir Arduino, esp32 of esp8266: vaste transmissie
  5. LoRa E32 -toestel vir Arduino, esp32 of esp8266: energiebesparing en die stuur van gestruktureerde data

Aanbeveel: