Kazalo:

Brezžična komunikacija LoRa od 3 do 8 km z nizkocenovno napravo E32 (sx1278/sx1276) za Arduino, Esp8266 ali Esp32: 15 korakov
Brezžična komunikacija LoRa od 3 do 8 km z nizkocenovno napravo E32 (sx1278/sx1276) za Arduino, Esp8266 ali Esp32: 15 korakov

Video: Brezžična komunikacija LoRa od 3 do 8 km z nizkocenovno napravo E32 (sx1278/sx1276) za Arduino, Esp8266 ali Esp32: 15 korakov

Video: Brezžična komunikacija LoRa od 3 do 8 km z nizkocenovno napravo E32 (sx1278/sx1276) za Arduino, Esp8266 ali Esp32: 15 korakov
Video: Обзор и конфигурация модуля EBYTE LoRa 2024, November
Anonim
Brezžična komunikacija LoRa od 3 do 8 km z nizkocenovno napravo E32 (sx1278/sx1276) za Arduino, Esp8266 ali Esp32
Brezžična komunikacija LoRa od 3 do 8 km z nizkocenovno napravo E32 (sx1278/sx1276) za Arduino, Esp8266 ali Esp32

Ustvarjam knjižnico za upravljanje EBYTE E32 na podlagi Semtech serije naprav LoRa, zelo zmogljive, preproste in poceni naprave.

Različico 3 km lahko najdete tukaj, različico 8 km pa tukaj

Delajo lahko na razdalji od 3000m do 8000m in imajo veliko funkcij in parametrov. Zato ustvarim to knjižnico, da poenostavim uporabo.

To je rešitev za pridobivanje podatkov iz metropolitanskih senzorjev ali za upravljanje brezpilotnih letal.

Zaloge

Arduino UNO

Wemos D1 mini

LoRa E32 TTL 100 3 km različica

Različica LoRa E32 TTL 1W 8Km

1. korak: Knjižnica

Knjižnica
Knjižnica

Mojo knjižnico najdete tukaj.

Prenesti.

Kliknite gumb DOWNLOADS v zgornjem desnem kotu in preimenujte nestisnjeno mapo LoRa_E32.

Preverite, ali mapa LoRa_E32 vsebuje LoRa_E32.cpp in LoRa_E32.h.

Mapo knjižnice LoRa_E32 postavite v mapo / libraries /. Morda boste morali ustvariti podmapo knjižnice, če je to vaša prva knjižnica.

Znova zaženite IDE.

2. korak: Pinout

Pinout
Pinout
Pinout
Pinout
Pinout
Pinout

Kot lahko vidite, lahko prek zatičev M0 in M1 nastavite različne načine.

Obstaja nekaj zatičev, ki jih je mogoče uporabiti na statičen način, če pa ga povežete z mikrokrmilnikom in jih konfigurirate v knjižnici, boste pridobili na zmogljivosti in lahko nadzirate ves način prek programske opreme, vendar bomo naslednjič bolje razložili.

3. korak: AUX Pin

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

Kot sem že rekel, ni pomembno, da vse izhode povežete z izhodom mikrokrmilnika, da lahko zatiče M0 in M1 nastavite na VISOKO ali NIZKO, da dobite želeno konfiguracijo, in če ne povežete AUX, knjižnica nastavi razumno zamudo, da se prepričate da je operacija končana.

AUX pin

Pri prenosu podatkov se lahko uporabi za prebujanje zunanjega MCU in vrnitev HIGH na koncu prenosa podatkov.

Pri prejemu AUX gre NIZKO in se vrne VELIKO, ko je medpomnilnik prazen.

Uporablja se tudi za samopreverjanje za obnovitev normalnega delovanja (ob vklopu in načinu mirovanja/programa).

4. korak: Popolnoma povezana shema Esp8266

Popolnoma povezana shema Esp8266
Popolnoma povezana shema Esp8266
Popolnoma povezana shema Esp8266
Popolnoma povezana shema Esp8266

Shema povezave esp8266 je enostavnejša, ker deluje pri isti napetosti logičnih komunikacij (3,3 V).

Za dobro stabilnost je pomembno, da dodate vlečni upor (4, 7Kohm).

5. korak: Popolnoma povezana shema Arduino

Popolnoma povezana shema Arduino
Popolnoma povezana shema Arduino
Popolnoma povezana shema Arduino
Popolnoma povezana shema Arduino

Delovna napetost Arduino je 5V, zato moramo na RX pin M0 in M1 modula LoRa dodati delilnik napetosti, da preprečimo poškodbe. Več informacij lahko dobite tukaj Delilnik napetosti: kalkulator in aplikacija.

Lahko uporabite 2Kohm upor za GND in 1Kohm od signala kot skupaj na RX.

6. korak: Knjižnica: Konstruktor

Naredil sem nabor precej številnih konstruktorjev, saj imamo lahko več možnosti in situacij za upravljanje.

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

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

Ustvarjen je prvi niz konstruktorjev, ki prenesejo upravljanje serijskih in drugih zatičev v knjižnico.

rxPin in txPin sta pin za povezavo z UART in sta obvezna.

auxPin je pin, ki preverja stanje delovanja, prenosa in sprejemanja (v nadaljevanju bomo bolje razložili), ta pin Ni obvezen, če ga ne nastavite, uporabim zakasnitev, da se operacija lahko zaključi (z zakasnitvijo).

m0pin in m1Pin sta nožici za spremembo NAČINA delovanja (glej zgornjo tabelo), mislim, da se bodo ti zatiči v "produkciji" povezali neposredno VISOKO ali NIZKO, vendar jih za preizkus koristno upravlja knjižnica.

bpsRate je pretok SoftwareSerial običajno 9600 (edina hitrost prenosa v načinu programmin/sleep)

Preprost primer je

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

SoftwareSerial lahko uporabimo neposredno z drugim konstruktorjem

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

LoRa_E32 (HardwareSerial* serijski, bajt auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (HardwareSerial* serijski, bajt auxPin, bajt m0Pin, bajt m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

Primer zgornjega dela s tem konstruktorjem lahko naredite tako.

#include #include "LoRa_E32.h"

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

LoRa_E32 e32ttl100 (& mySerial);

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

Zadnji niz konstruktorjev dovoljuje uporabo HardwareSerial namesto SoftwareSerial.

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

LoRa_E32 (SoftwareSerial* serijski, bajt auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (SoftwareSerial* serijski, bajt auxPin, bajt m0Pin, bajt m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

7. korak: Začnite

Ukaz begin se uporablja za zagon zaporedja in zatičev v načinu vnosa in izhoda.

void begin ();

v izvedbi je

// Zagon vseh zatičev in UART

e32ttl100.begin ();

8. korak: Konfiguracija in informacijska metoda

Obstaja nabor metod za upravljanje konfiguracije in pridobivanje informacij o napravi.

ResponseStructContainer getConfiguration ();

ResponseStatus setConfiguration (konfiguracija konfiguracije, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

ResponseStructContainer getModuleInformation ();

void printParameters (konfiguracija konfiguracije strukture);

ResponseStatus resetModule ();

9. korak: Posoda za odzive

Za poenostavitev upravljanja odziva ustvarim nabor vsebnikov, ki so zame zelo koristni za upravljanje napak in vračanje splošnih podatkov.

ResponseStatus

To je vsebnik stanja in ima 2 preprosti vstopni točki, s tem lahko dobite kodo stanja in opis kode stanja

Serial.println (c.getResponseDescription ()); // Opis kode

Serial.println (c.koda); // 1 če uspeh

Koda je

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

ResponseContainer

Ta vsebnik je ustvarjen za upravljanje odziva String in ima 2 vstopni točki.

podatki z nizom, vrnjenim iz sporočila, in status primerek RepsonseStatus.

ResponseContainer rs = e32ttl.receiveMessage ();

Niz sporočilo = rs.data;

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

Serial.println (sporočilo);

ResponseStructContainer

To je bolj "zapleten" vsebnik, ki ga uporabljam za upravljanje strukture, ima isto vstopno točko ResponseContainer, vendar so podatki prazni kazalec za upravljanje kompleksne strukture.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Pomembno je, da dobite konfiguracijski kazalec pred vsemi drugimi operacijami

Konfiguracija konfiguracije = *(Konfiguracija *) c.data;

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

Serial.println (c.status.code);

getConfiguration in setConfiguration

Prvi način je getConfiguration, z njim lahko znova naložite vse podatke, shranjene v napravi.

ResponseStructContainer getConfiguration ();

Tukaj je primer uporabe.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Pomembno je, da dobite konfiguracijski kazalec pred vsemi drugimi operacijami

Konfiguracija konfiguracije = *(Konfiguracija *) c.data;

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

Serial.println (c.status.code);

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

Struktura konfiguracije ima vse podatke o nastavitvah in dodam vrsto funkcij, da dobim ves opis posameznih podatkov.

konfiguracija. ADDL = 0x0; // Prvi del addressconfiguration. ADDH = 0x1; // Drugi del konfiguracije naslova. CHAN = 0x19; // Konfiguracija kanala. OPTION.fec = FEC_0_OFF; // Konfiguracija stikala za odpravljanje napak naprej. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // Konfiguracija načina prenosa. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // konfiguracija za upravljanje izvleka. OPTION.transmissionPower = POWER_17; // konfiguracija moči prenosa dBm. OPTION.wirelessWakeupTime = WAKE_UP_1250; // Čakalni čas za konfiguracijo prebujanja. SPED.airDataRate = AIR_DATA_RATE_011_48; // Konfiguracija hitrosti prenosa zraka. SPED.uartBaudRate = UART_BPS_115200; // Konfiguracija hitrosti prenosa komunikacije. SPED.uartParity = MODE_00_8N1; // paritetni bit

Imate enakovredno funkcijo za vse atribute, da dobite ves opis:

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 ());

Na enak način setConfiguration želi konfiguracijsko strukturo, zato menim, da je boljši način za upravljanje konfiguracije, da pridobite trenutno, uporabite edino potrebno spremembo in jo znova nastavite.

ResponseStatus setConfiguration (konfiguracija konfiguracije, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

konfiguracija je predhodno prikazana struktura, saveType vam dovoljuje izbiro, če sprememba postane trajno samo za trenutno sejo.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Pomembno je, da dobite konfiguracijski kazalec pred vsemi drugimi operacijami Configuration configuration = *(Configuration *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfiguracija); konfiguracija. ADDL = 0x0; konfiguracija. ADDH = 0x1; konfiguracija. CHAN = 0x19; configuration. OPTION.fec = FEC_0_OFF; configuration. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; configuration. 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; configuration. SPED.uartBaudRate = UART_BPS_115200; configuration. SPED.uartParity = MODE_00_8N1; // Nastavitev konfiguracije spremenjena in nastavljena tako, da ne zadrži konfiguracije ResponseStatus rs = e32ttl100.setConfiguration (konfiguracija, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.koda); printParameters (konfiguracija);

Vsi parametri se upravljajo kot konstantni:

10. korak: Možnost osnovne konfiguracije

Možnost osnovne konfiguracije
Možnost osnovne konfiguracije

Korak: Pošljite sporočilo o prejemu

Najprej moramo uvesti preprosto, a uporabno metodo za preverjanje, ali je kaj v sprejemnem medpomnilniku

int na voljo ();

Preprosto vrne, koliko bajtov imate v trenutnem toku.

Korak: Običajen način prenosa

Običajen način prenosa
Običajen način prenosa

Običajen/pregleden način prenosa se uporablja za pošiljanje sporočil vsem napravam z istim naslovom in kanalom.

Obstaja veliko načinov pošiljanja/prejemanja sporočila, ki jih bomo podrobno razložili:

ResponseStatus sendMessage (sporočilo const String);

ResponseContainer acceptMessage ();

Prva metoda je sendMessage in se uporablja za pošiljanje niza na napravo v običajnem načinu.

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

Druga naprava preprosto deluje v zanki

če (e32ttl.available ()> 1) {ResponseContainer rs = e32ttl.receiveMessage (); Niz sporočilo = rs.data; // Najprej dobite podatke Serial.println (rs.status.getResponseDescription ()); Serial.println (sporočilo); }

Korak: Upravljajte strukturo

Če želite poslati kompleksno strukturo, lahko uporabite to metodo

ResponseStatus sendMessage (sporočilo const void *, velikost const uint8_t); ResponseStructContainer receiveMessage (velikost const uint8_t);

Uporablja se za pošiljanje strucutre, na primer:

struct Messaggione {char type [5]; sporočilo char [8]; bool mitico; }; struct Messaggione messaggione = {"TEMP", "Peple", res}; ResponseStatus rs = e32ttl.sendMessage (& messaggione, sizeof (Messaggione)); Serial.println (rs.getResponseDescription ());

in na drugi strani lahko tako prejmete sporočilo

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

Preberite delno strucure

Če želite prebrati prvi del sporočila za upravljanje več vrst struktur, lahko uporabite to metodo.

ResponseContainer receiveInitialMessage (velikost const uint8_t);

Ustvarim ga tako, da prejme niz z vrsto ali drugo za identifikacijo strukture za nalaganje.

struct Messaggione {// Delna struktura brez sporočila typechar [8]; bool mitico; }; tip znakov [5]; // prvi del strukture ResponseContainer rs = e32ttl.receiveInitialMessage (sizeof (type)); // Vstavi niz v niz znakov (ni potreben) memcpy (type, rs.data.c_str (), sizeof (type)); Serial.println ("VRSTA TIPA:"); Serial.println (rs.status.getResponseDescription ()); Serial.println (tip); // Preberite preostanek strukture ResponseStructContainer rsc = e32ttl.receiveMessage (sizeof (Messaggione)); struct Messaggione messaggione = *(Messaggione *) rsc.data;

Korak 14: Fiksni način namesto običajnega

Na enak način ustvarim niz metod za uporabo s fiksnim prenosom

Fiksni prenos

Spremeniti morate samo način pošiljanja, ker ciljna naprava ne prejme preambule z nastavitvami naslova in kanala za fiksni način.

Torej za sporočilo String imate

ResponseStatus sendFixedMessage (bajt ADDL, bajt ADDH, bajt CHAN, sporočilo const String); ResponseStatus sendBroadcastFixedMessage (bajt CHAN, sporočilo const String);

in za strukturo, ki jo imate

ResponseStatus sendFixedMessage (bajt ADDL, bajt ADDH, bajt CHAN, const void *sporočilo, const uint8_t velikost); ResponseStatus sendBroadcastFixedMessage (bajt CHAN, const void *sporočilo, const uint8_t velikost);

Tukaj je preprost primer

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

Fiksni prenos ima več scenarijev

Če pošiljate na določeno napravo (drugi scenariji Fiksni prenos), morate dodati ADDL, ADDH in CHAN za neposredno identifikacijo.

ResponseStatus rs = e32ttl.sendFixedMessage (2, 2, 0x17, "Sporočilo napravi");

Če želite poslati sporočilo vsem napravam v določenem kanalu, lahko uporabite to metodo.

ResponseStatus rs = e32ttl.sendBroadcastFixedMessage (0x17, "Sporočilo napravam kanala");

Če želite prejemati vsa oddajna sporočila v omrežju, morate nastaviti ADDH in ADDL z BROADCAST_ADDRESS.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Pomembno je, da dobite konfiguracijski kazalec pred vsemi drugimi operacijami Configuration configuration = *(Configuration *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfiguracija); konfiguracija. ADDL = BROADCAST_ADDRESS; konfiguracija. ADDH = BROADCAST_ADDRESS; // Nastavitev konfiguracije spremenjena in nastavljena tako, da ne zadrži konfiguracije ResponseStatus rs = e32ttl100.setConfiguration (konfiguracija, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.koda); printParameters (konfiguracija);

Korak 15: Hvala

Zdaj imate vse informacije za svoje delo, vendar mislim, da je pomembno pokazati nekaj realnih primerov, da bi bolje razumeli vse možnosti.

  1. Naprava LoRa E32 za Arduino, esp32 ali esp8266: nastavitve in osnovna uporaba
  2. Naprava LoRa E32 za Arduino, esp32 ali esp8266: knjižnica
  3. Naprava LoRa E32 za Arduino, esp32 ali esp8266: konfiguracija
  4. Naprava LoRa E32 za Arduino, esp32 ali esp8266: stacionarni prenos
  5. Naprava LoRa E32 za Arduino, esp32 ali esp8266: varčevanje z energijo in pošiljanje strukturiranih podatkov

Priporočena: