Turinys:

„LoRa“nuo 3 km iki 8 km belaidis ryšys su mažomis sąnaudomis E32 (sx1278/sx1276) „Arduino“, Esp8266 arba Esp32 įrenginys: 15 žingsnių
„LoRa“nuo 3 km iki 8 km belaidis ryšys su mažomis sąnaudomis E32 (sx1278/sx1276) „Arduino“, Esp8266 arba Esp32 įrenginys: 15 žingsnių

Video: „LoRa“nuo 3 km iki 8 km belaidis ryšys su mažomis sąnaudomis E32 (sx1278/sx1276) „Arduino“, Esp8266 arba Esp32 įrenginys: 15 žingsnių

Video: „LoRa“nuo 3 km iki 8 km belaidis ryšys su mažomis sąnaudomis E32 (sx1278/sx1276) „Arduino“, Esp8266 arba Esp32 įrenginys: 15 žingsnių
Video: Lora water meter wireless handheld controller 2024, Liepa
Anonim
„LoRa“nuo 3 km iki 8 km belaidis ryšys su mažomis sąnaudomis E32 (sx1278/sx1276) „Arduino“, „Esp8266“arba „Esp32“įrenginys
„LoRa“nuo 3 km iki 8 km belaidis ryšys su mažomis sąnaudomis E32 (sx1278/sx1276) „Arduino“, „Esp8266“arba „Esp32“įrenginys

Aš sukuriu biblioteką, skirtą valdyti EBYTE E32, remdamasis „LoRa“įrenginio „Semtech“serija, labai galingu, paprastu ir pigiu įrenginiu.

3Km versiją rasite čia, 8Km versiją čia

Jie gali dirbti 3000–8000 m atstumu, jie turi daug funkcijų ir parametrų. Taigi aš sukuriu šią biblioteką, kad supaprastinčiau naudojimą.

Tai sprendimas norint gauti duomenis iš didmiesčių jutiklių arba valdyti droną.

Prekės

Arduino UNO

„Wemos D1 mini“

„LoRa E32 TTL 100 3Km“versija

„LoRa E32 TTL 1W 8Km“versija

1 žingsnis: biblioteka

Biblioteka
Biblioteka

Mano biblioteką rasite čia.

Atsisiųsti.

Viršutiniame dešiniajame kampe spustelėkite mygtuką ATSISIŲSTI, pervardykite nesuspaustą aplanką LoRa_E32.

Patikrinkite, ar „LoRa_E32“aplanke yra „LoRa_E32.cpp“ir „LoRa_E32.h“.

Įdėkite „LoRa_E32“bibliotekos aplanką į savo / libraries / aplanką. Jums gali tekti sukurti bibliotekų pakatalogį, jei tai jūsų pirmoji biblioteka.

Iš naujo paleiskite IDE.

2 žingsnis: „Pinout“

Pinout
Pinout
Pinout
Pinout
Pinout
Pinout

Kaip matote, galite nustatyti įvairius režimus naudodami M0 ir M1 kaiščius.

Yra keletas kaiščių, kuriuos galima naudoti statiškai, bet jei prijungsite jį prie mikrovaldiklio ir sukonfigūruosite juos bibliotekoje, gausite našumą ir galėsite valdyti visus režimus naudodami programinę įrangą, tačiau toliau paaiškinsime geriau.

3 žingsnis: AUX kaištis

AUX kaištis
AUX kaištis
AUX kaištis
AUX kaištis
AUX kaištis
AUX kaištis

Kaip jau sakiau, nėra svarbu prijungti visą kaištį prie mikrovaldiklio išvesties, galite nustatyti M0 ir M1 kaiščius į AUKŠTĄ arba ŽEMĄ, kad gautumėte išsamią konfigūraciją, o jei neprijungsite AUX, biblioteka nustatys pagrįstą atidėjimą kad operacija baigta.

AUX kaištis

Kai perduodami duomenys gali būti naudojami pažadinti išorinį MCU ir grįžti HIGH po duomenų perdavimo pabaigos.

Kai AUX gaunamas žemas ir grįžta HIGH, kai buferis yra tuščias.

Jis taip pat naudojamas savikontrolei, kad būtų atkurtas normalus veikimas (įjungus ir miego/programos režimu).

4 žingsnis: visiškai prijungta schema Esp8266

Visiškai prijungta schema Esp8266
Visiškai prijungta schema Esp8266
Visiškai prijungta schema Esp8266
Visiškai prijungta schema Esp8266

esp8266 ryšio schema yra paprastesnė, nes ji veikia esant vienodai loginės komunikacijos įtampai (3.3v).

Norint gauti gerą stabilumą, svarbu pridėti ištraukiamąjį rezistorių (4, 7Kohm).

5 veiksmas: visiškai prijungta „Arduino“schema

Visiškai prijungta „Arduino“schema
Visiškai prijungta „Arduino“schema
Visiškai prijungta „Arduino“schema
Visiškai prijungta „Arduino“schema

„Arduino“darbinė įtampa yra 5 V, todėl, norėdami išvengti žalos, turime pridėti įtampos skirstytuvą prie „LoRa“modulio RX kaiščio M0 ir M1, daugiau informacijos rasite čia. Įtampos skirstytuvas: skaičiuotuvas ir programa.

Galite naudoti 2Kohm rezistorių GND ir 1Km nuo signalo, nei sudėti į RX.

6 žingsnis: biblioteka: konstruktorius

Aš sukūriau gana daug konstruktorių, nes galime turėti daugiau galimybių ir situacijų, kurias galime valdyti.

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

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

Pirmasis konstruktorių rinkinys yra sukurtas, kad serijinių ir kitų kaiščių valdymas būtų perduotas bibliotekai.

„rxPin“ir „txPin“yra jungtis prie UART ir jie yra privalomi.

„auxPin“yra smeigtukas, kuris tikrina veikimą, perdavimą ir priėmimą (toliau paaiškinsime geriau), tas kaištis Tai nėra privaloma, jei nenustatysite jos, aš uždelsiu, kad operacija būtų užbaigta (su vėlavimu).

„m0pin“ir „m1Pin“yra kaiščiai, skirti keisti režimą MODE (žr. lentelės viršuje), manau, kad šie „gamybos“kaiščiai bus tiesiogiai sujungti HIGH arba LOW, tačiau bandymui juos naudinga valdyti bibliotekai.

„bpsRate“yra „SoftwareSerial“budratas, paprastai yra 9600 (vienintelė duomenų perdavimo sparta programmin/miego režimu)

Paprastas pavyzdys yra

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

Mes galime tiesiogiai naudoti „SoftwareSerial“su kitu konstruktoriumi

„LoRa_E32“(„HardwareSerial*“serija, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 („HardwareSerial*“serija, baitas auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 („HardwareSerial*“serija, baitas auxPin, baitas m0Pin, baitas m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

Viršutinis šio konstruktoriaus pavyzdys gali būti padarytas taip.

#include #include "LoRa_E32.h"

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

LoRa_E32 e32ttl100 (& mySerial);

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

Paskutinis konstruktoriaus rinkinys yra leisti naudoti „HardwareSerial“, o ne „SoftwareSerial“.

„LoRa_E32“(„SoftwareSerial*“serija, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 („SoftwareSerial*“serija, baitas auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 („SoftwareSerial*“serija, baitas auxPin, baitas m0Pin, baitas m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

7 žingsnis: pradėkite

Pradėti komanda naudojama paleisti seriją ir kaiščius įvesties ir išvesties režimu.

void begin ();

vykdant yra

// Paleiskite visus kaiščius ir UART

e32ttl100.begin ();

8 veiksmas: konfigūravimas ir informacijos metodas

Yra metodų rinkinys, skirtas valdyti konfigūraciją ir gauti informaciją apie įrenginį.

ResponseStructContainer getConfiguration ();

„ResponseStatus setConfiguration“(konfigūracijos konfigūracija, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

ResponseStructContainer getModuleInformation ();

void printParameters (struktūros konfigūracijos konfigūracija);

ResponseStatus resetModule ();

9 veiksmas: atsako talpykla

Kad supaprastintumėte atsakymo valdymą, sukuriu sudėtinių rodinių rinkinį, kuris man labai naudingas klaidoms valdyti ir bendriems duomenims grąžinti.

„ResponseStatus“

Tai būsenos talpykla ir turi 2 paprastus įėjimo taškus, su kuriais galite gauti būsenos kodą ir būsenos kodo aprašymą

Serial.println (c.getResponseDescription ()); // Kodo aprašymas

Serial.println (c.code); // 1 jei sėkmė

Kodas yra

SĖKMĖ = 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“

Šis sudėtinis rodinys sukurtas valdyti eilutės atsaką ir turi 2 įėjimo taškus.

duomenys su eilute grąžinami iš pranešimo ir būsenos „RepsonseStatus“egzempliorius.

ResponseContainer rs = e32ttl.receptMessage ();

Eilutės pranešimas = rs.data;

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

Serial.println (pranešimas);

„ResponseStructContainer“

Tai sudėtingesnis konteineris, aš jį naudoju struktūrai valdyti. Jis turi tą patį „ResponseContainer“įėjimo tašką, tačiau duomenys yra tuštumos žymeklis sudėtingai struktūrai valdyti.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Svarbu gauti konfigūracijos žymeklį prieš visas kitas operacijas

Konfigūracijos konfigūracija = *(Konfigūracija *) c.data;

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

Serial.println (c.status.code);

getConfiguration ir setConfiguration

Pirmasis metodas yra „getConfiguration“, kurį galite naudoti norėdami atkurti visus įrenginyje saugomus duomenis.

ResponseStructContainer getConfiguration ();

Štai naudojimo pavyzdys.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Svarbu gauti konfigūracijos žymeklį prieš visas kitas operacijas

Konfigūracijos konfigūracija = *(Konfigūracija *) c.data;

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

Serial.println (c.status.code);

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

Konfigūracijos struktūroje yra visi nustatymų duomenys, ir aš pridedu funkcijų seriją, kad gaučiau visų atskirų duomenų aprašymą.

konfigūracija. ADDL = 0x0; // Pirmoji adreso konfigūracijos dalis. ADDH = 0x1; // Antroji adreso konfigūracijos dalis. CHAN = 0x19; // Kanalo konfigūracija. OPTION.fec = FEC_0_OFF; // Persiųsti klaidų taisymo jungiklio konfigūraciją. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // Perdavimo režimo konfigūracija. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // Pull-up valdymo konfigūracija. OPTION.transmissionPower = POWER_17; // dBm perdavimo galios konfigūracija. OPTION.wirelessWakeupTime = WAKE_UP_1250; // Palaukite pabudimo konfigūracijos laiką. SPED.airDataRate = AIR_DATA_RATE_011_48; // Oro duomenų perdavimo greičio konfigūracija. SPED.uartBaudRate = UART_BPS_115200; // Ryšio perdavimo spartos konfigūracija. SPED.uartParity = MODE_00_8N1; // Paritetas

Turite lygiavertę funkciją visiems atributams, kad gautumėte visą aprašymą:

Serial.print (F ("Chan:")); Serial.print (konfigūracija. 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 ());

Tuo pačiu būdu setConfiguration nori konfigūracijos struktūros, todėl manau, kad geriausias būdas valdyti konfigūraciją yra nuskaityti esamą, pritaikyti vienintelį reikalingą pakeitimą ir jį nustatyti iš naujo.

„ResponseStatus setConfiguration“(konfigūracijos konfigūracija, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

Konfigūracija yra iš anksto parodyta, „SaveType“leidžia jums pasirinkti, ar pakeitimas visam laikui bus taikomas tik dabartinei sesijai.

„ResponseStructContainer“c; c = e32ttl100.getConfiguration (); // Svarbu gauti konfigūracijos žymeklį prieš visas kitas operacijas Configuration configuration = *(Configuration *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfigūracija); konfigūracija. ADDL = 0x0; konfigūracija. ADDH = 0x1; konfigūracija. 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; // Nustatyta konfigūracija pakeista ir nenurodyta konfigūracija ResponseStatus rs = e32ttl100.setConfiguration (konfigūracija, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfigūracija);

Visi parametrai valdomi kaip pastovūs:

10 veiksmas: pagrindinė konfigūracijos parinktis

Pagrindinė konfigūracijos parinktis
Pagrindinė konfigūracijos parinktis

11 veiksmas: siųskite gavimo pranešimą

Pirmiausia turime pristatyti paprastą, bet naudingą metodą, kaip patikrinti, ar kažkas yra priimančiame buferyje

int prieinamas ();

Tiesiog grąžinkite, kiek baitų turite dabartiniame sraute.

12 veiksmas: įprastas perdavimo režimas

Įprastas perdavimo režimas
Įprastas perdavimo režimas

Įprastas/skaidrus perdavimo režimas naudojamas pranešimams siųsti į visus įrenginius tuo pačiu adresu ir kanalu.

Yra daug būdų siųsti/gauti pranešimą, mes išsamiai paaiškinsime:

„ResponseStatus“sendMessage (const eilutės pranešimas);

ResponseContainer ReceiveMessage ();

Pirmasis metodas yra sendMessage ir naudojamas eilutei siųsti į įrenginį įprastu režimu.

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

Kitas įrenginys tiesiog atlieka kilpą

if (e32ttl.available ()> 1) {ResponseContainer rs = e32ttl.receptMessage (); Eilutės pranešimas = rs.data; // Pirmą kartą gaukite duomenis Serial.println (rs.status.getResponseDescription ()); Serial.println (pranešimas); }

13 žingsnis: valdykite struktūrą

Jei norite išsiųsti sudėtingą struktūrą, galite naudoti šį metodą

ResponseStatus sendMessage (const void *message, const uint8_t size); ResponseStructContainer ReceiveMessage (const uint8_t size);

Jis naudojamas norint siųsti „strucutre“, pavyzdžiui:

struktura Messaggione {char tipas [5]; char pranešimas [8]; bool mitico; }; struktura Messaggione messaggione = {"TEMP", "Peple", tiesa}; ResponseStatus rs = e32ttl.sendMessage (& messaggione, sizeof (Messaggione)); Serial.println (rs.getResponseDescription ());

o kitoje pusėje galite priimti pranešimą taip

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

Skaitykite dalinę struktūrą

Jei norite perskaityti pirmąją pranešimo dalį ir valdyti daugiau tipų šablonų, galite naudoti šį metodą.

ResponseContainer ReceiveInitialMessage (const uint8_t size);

Sukuriu jį, kad gaučiau eilutę, kurios tipas ar kitas nurodytų įkeltiną struktūrą.

structure Messaggione {// Dalinis strucutre be rašomosios žinutės [8]; bool mitico; }; char tipas [5]; // pirmoji struktūros dalis ResponseContainer rs = e32ttl.receptInitialMessage (sizeof (type)); // Įdėkite eilutę į char masyvą (nereikia) memcpy (type, rs.data.c_str (), sizeof (type)); Serial.println ("SKAITYTI TIPĄ:"); Serial.println (rs.status.getResponseDescription ()); Serial.println (tipas); // Skaityti likusią struktūros dalį ResponseStructContainer rsc = e32ttl.receptMessage (sizeof („Messaggione“)); struktura Messaggione messaggione = *(Messaggione *) rsc.data;

14 žingsnis: Fiksuotas režimas vietoj įprasto režimo

Tuo pačiu būdu sukuriu metodų rinkinį, kurį reikia naudoti su fiksuotu perdavimu

Fiksuota transmisija

Turite pakeisti tik siuntimo būdą, nes paskirties įrenginys negauna preambulės su adreso ir kanalo quando settato arba fiksuotu režimu.

Taigi String žinutei

ResponseStatus sendFixedMessage (baitas ADDL, baitas ADDH, baitas CHAN, const eilutės pranešimas); ResponseStatus sendBroadcastFixedMessage (baitas CHAN, const eilutės pranešimas);

ir dėl jūsų turimos struktūros

ResponseStatus sendFixedMessage (baitas ADDL, baitas ADDH, baitas CHAN, const void *pranešimas, const uint8_t dydis); ResponseStatus sendBroadcastFixedMessage (baitas CHAN, const void *pranešimas, const uint8_t dydis);

Štai paprastas pavyzdys

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

Fiksuotas perdavimas turi daugiau scenarijų

Jei siunčiate į konkretų įrenginį (antrasis scenarijus Fiksuotas perdavimas), turite pridėti ADDL, ADDH ir CHAN, kad tiesiogiai identifikuotumėte.

ResponseStatus rs = e32ttl.sendFixedMessage (2, 2, 0x17, "Pranešimas įrenginiui");

Jei norite išsiųsti pranešimą visiems nurodyto kanalo įrenginiams, galite naudoti šį metodą.

ResponseStatus rs = e32ttl.sendBroadcastFixedMessage (0x17, "Pranešimas kanalo įrenginiams");

Jei norite gauti visus tinklo pranešimus, turite nustatyti ADDH ir ADDL naudodami BROADCAST_ADDRESS.

„ResponseStructContainer“c; c = e32ttl100.getConfiguration (); // Svarbu gauti konfigūracijos žymeklį prieš visas kitas operacijas Configuration configuration = *(Configuration *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfigūracija); configuration. ADDL = BROADCAST_ADDRESS; konfigūracija. ADDH = BROADCAST_ADDRESS; // Nustatyta konfigūracija pakeista ir nenurodyta konfigūracija ResponseStatus rs = e32ttl100.setConfiguration (konfigūracija, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfigūracija);

15 žingsnis: ačiū

Dabar jūs turite visą informaciją savo darbui atlikti, bet manau, kad svarbu parodyti keletą realių pavyzdžių, kad geriau suprastumėte visas galimybes.

  1. „LoRa E32“įrenginys, skirtas „Arduino“, esp32 arba esp8266: nustatymai ir pagrindinis naudojimas
  2. „LoRa E32“įrenginys, skirtas „Arduino“, esp32 arba esp8266: biblioteka
  3. „LoRa E32“įrenginys, skirtas „Arduino“, esp32 arba esp8266: konfigūracija
  4. „LoRa E32“įrenginys, skirtas „Arduino“, esp32 arba esp8266: fiksuota transmisija
  5. „LoRa E32“įrenginys, skirtas „Arduino“, esp32 arba esp8266: energijos taupymas ir struktūrinių duomenų siuntimas

Rekomenduojamas: