Përmbajtje:

Komunikim pa tela LoRa 3Km deri në 8Km me kosto të ulët E32 (sx1278/sx1276) Pajisja për Arduino, Esp8266 ose Esp32: 15 hapa
Komunikim pa tela LoRa 3Km deri në 8Km me kosto të ulët E32 (sx1278/sx1276) Pajisja për Arduino, Esp8266 ose Esp32: 15 hapa

Video: Komunikim pa tela LoRa 3Km deri në 8Km me kosto të ulët E32 (sx1278/sx1276) Pajisja për Arduino, Esp8266 ose Esp32: 15 hapa

Video: Komunikim pa tela LoRa 3Km deri në 8Km me kosto të ulët E32 (sx1278/sx1276) Pajisja për Arduino, Esp8266 ose Esp32: 15 hapa
Video: Ebyte 2.4GHz Communication 2.4g NRF24L01 PA LNA Wireless Transceiver Module nRF24L01 2024, Nëntor
Anonim
Komunikim pa tela LoRa 3Km deri në 8Km me kosto të ulët E32 (sx1278/sx1276) Pajisje për Arduino, Esp8266 ose Esp32
Komunikim pa tela LoRa 3Km deri në 8Km me kosto të ulët E32 (sx1278/sx1276) Pajisje për Arduino, Esp8266 ose Esp32

Unë krijoj një bibliotekë për të menaxhuar EBYTE E32 bazuar në serinë Semtech të pajisjes LoRa, pajisje shumë e fuqishme, e thjeshtë dhe e lirë.

Versionin 3Km mund ta gjeni këtu, versionin 8Km këtu

Ato mund të punojnë në një distancë prej 3000m deri 8000m, dhe kanë shumë veçori dhe parametra. Kështu që unë krijoj këtë bibliotekë për të thjeshtuar përdorimin.

Ashtë një zgjidhje për marrjen e të dhënave nga sensorët metropolitanë ose për të kontrolluar dronin.

Furnizimet

Arduino UNO

Wemos D1 mini

Versioni LoRa E32 TTL 100 3Km

Versioni LoRa E32 TTL 1W 8Km

Hapi 1: Biblioteka

Librari
Librari

Këtu mund të gjeni bibliotekën time.

Për të shkarkuar.

Klikoni butonin DOWNLOADS në këndin e sipërm të djathtë, riemërtoni dosjen e pakompresuar LoRa_E32.

Kontrolloni që dosja LoRa_E32 të përmbajë LoRa_E32.cpp dhe LoRa_E32.h.

Vendoseni dosjen e bibliotekës LoRa_E32 në dosjen tuaj / bibliotekat /. Ju mund të keni nevojë të krijoni nën -dosjen e bibliotekave nëse është biblioteka juaj e parë.

Rinisni IDE -në.

Hapi 2: Pinout

Pinout
Pinout
Pinout
Pinout
Pinout
Pinout

Siç mund ta shihni, mund të vendosni mënyra të ndryshme përmes këmbëve M0 dhe M1.

Ka disa kunja që mund të përdoren në një mënyrë statike, por nëse e lidhni atë me mikrokontrolluesin dhe i konfiguroni ato në bibliotekë ju fitoni në performancë dhe ju mund të kontrolloni të gjithë modalitetin përmes softuerit, por ne do të shpjegojmë më mirë në vijim.

Hapi 3: Kunja AUX

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

Siç e thashë tashmë Nuk është e rëndësishme të lidhni të gjithë pin -in me daljen e mikrokontrolluesit, mund t'i vendosni kunjat M0 dhe M1 në HIGH ose LOW për të marrë konfigurimin e dëshiruar, dhe nëse nuk e lidhni AUX biblioteka vendosni një vonesë të arsyeshme për t'u siguruar se operacioni është i plotë.

Kunja AUX

Kur transmetoni të dhëna mund të përdoret për të zgjuar MCU të jashtëm dhe për t'u kthyer LART HIGH në përfundimin e transferimit të të dhënave.

Kur merrni AUX duke shkuar LOW dhe kthehuni HIGH kur tamponi është bosh.

Përdoret gjithashtu për vetëkontroll për të rivendosur funksionimin normal (në ndezjen dhe modalitetin e gjumit/programit).

Hapi 4: Skema e lidhur plotësisht Esp8266

Skema e lidhur plotësisht Esp8266
Skema e lidhur plotësisht Esp8266
Skema e lidhur plotësisht Esp8266
Skema e lidhur plotësisht Esp8266

Skema e lidhjes esp8266 është më e thjeshtë sepse funksionon në të njëjtin tension të komunikimeve logjike (3.3v).

Importantshtë e rëndësishme të shtoni rezistencë tërheqëse (4, 7Kohm) për të marrë stabilitet të mirë.

Hapi 5: Skema Arduino e lidhur plotësisht

Skema Arduino e lidhur plotësisht
Skema Arduino e lidhur plotësisht
Skema Arduino e lidhur plotësisht
Skema Arduino e lidhur plotësisht

Tensioni i punës Arduino është 5v, kështu që ne duhet të shtojmë një ndarës të tensionit në pin RX M0 dhe M1 të modulit LoRa për të parandaluar dëmtimin, mund të merrni më shumë informacion këtu Pjestuesi i tensionit: kalkulator dhe aplikim.

Ju mund të përdorni një rezistencë 2Kohm në GND dhe 1Kohm nga sinjali sesa të vendosni së bashku në RX.

Hapi 6: Biblioteka: Ndërtuesi

Kam bërë një sërë konstruktorësh mjaft të shumtë, sepse mund të kemi më shumë mundësi dhe situata për të menaxhuar.

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

Grupi i parë i konstruktorit janë krijuar për të deleguar menaxhimin e kunjave Serialë dhe të tjera në bibliotekë.

rxPin dhe txPin është kunja për t'u lidhur me UART dhe ato janë të detyrueshme.

auxPin është një kunj që kontrollon funksionimin, transmetimin dhe statusin e marrjes (ne do të shpjegojmë më mirë në vijim), ai pin Nuk është e detyrueshme, nëse nuk e vendosni atë, unë aplikoj një vonesë për të lejuar që operacioni të përfundojë vetë (me vonesë).

m0pin dhe m1Pin janë kunjat për të ndryshuar modalitetin e funksionimit (shiko tabelën e sipërme), mendoj se këto kunja në "prodhim" do të lidhen drejtpërdrejt LART HIGH ose ULET, por për provë ato do të menaxhohen në mënyrë të dobishme nga biblioteka.

bpsRate është boudrati i SoftwareSerial normalisht është 9600 (norma e vetme e baud -it në programmin/mode sleep)

Një shembull i thjeshtë është

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

Ne mund të përdorim drejtpërdrejt një SoftwareSerial me një konstruktor tjetër

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

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

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

Shembulli i sipërm me këtë konstruktor mund të jetë kështu.

#përfshi #përfshi "LoRa_E32.h"

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

LoRa_E32 e32ttl100 (& mySerial);

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

Grupi i fundit i konstruktorit është që të lejojë përdorimin e një HardwareSerial në vend të SoftwareSerial.

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

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

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

Hapi 7: Filloni

Komanda start përdoret për të nisur Serial dhe kunjat në modalitetin e hyrjes dhe daljes.

fillimi i zbrazëtisë ();

në ekzekutim është

// Filloni të gjitha kunjat dhe UART

e32ttl100.filloj ();

Hapi 8: Konfigurimi dhe Metoda e Informacionit

Ka një sërë metodash për menaxhimin e konfigurimit dhe marrjen e informacionit të pajisjes.

ResponseStructContainer getConfiguration ();

ResponseStatus setConfiguration (Konfigurimi i konfigurimit, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

ResponseStructContainer getModuleInformation ();

void printParameters (struktura Konfigurimi i konfigurimit);

ResponseStatus resetModule ();

Hapi 9: Enë e Përgjigjes

Për të thjeshtuar menaxhimin e përgjigjes, unë krijoj një grup enësh, për mua shumë të dobishme për të menaxhuar gabimet dhe për të kthyer të dhëna gjenerike.

Statusi i përgjigjes

Ky është një enë statusi dhe ka 2 pika të thjeshta hyrëse, me të cilat mund të merrni kodin e statusit dhe përshkrimin e kodit të statusit

Serial.println (c.getResponseDescription ()); // Përshkrimi i kodit

Serial.println (c.code); // 1 nëse Suksesi

Kodi janë

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

Përgjigje Container

Ky enë është krijuar për të menaxhuar përgjigjen String dhe të ketë 2 pika hyrëse.

të dhënat me vargun e kthyer nga mesazhi dhe statusi një shembull i RepsonseStatus.

ResponseContainer rs = e32ttl.receiveMessage ();

Mesazh vargu = rs.data;

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

Serial.println (mesazh);

ResponseStructContainer

Ky është ena më "komplekse", e përdor për të menaxhuar strukturën, ka të njëjtën pikë hyrjeje të ResponseContainer, por të dhënat janë një tregues i zbrazët për të menaxhuar strukturën komplekse.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // importantshtë e rëndësishme të merrni treguesin e konfigurimit para të gjitha operacioneve të tjera

Konfigurimi i konfigurimit = *(Konfigurimi *) c.data;

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

Serial.println (c.status.code);

getConfiguration dhe setConfiguration

Metoda e parë është getConfiguration, mund ta përdorni për të tërhequr të gjitha të dhënat e ruajtura në pajisje.

ResponseStructContainer getConfiguration ();

Këtu është një shembull përdorimi.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // importantshtë e rëndësishme të merrni treguesin e konfigurimit para të gjitha operacioneve të tjera

Konfigurimi i konfigurimit = *(Konfigurimi *) c.data;

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

Serial.println (c.status.code);

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

Struktura e konfigurimit ka të gjitha të dhënat e cilësimeve, dhe unë shtoj një seri funksionesh për të marrë të gjithë përshkrimin e të dhënave të vetme.

konfigurimi. ADDL = 0x0; // Pjesa e parë e konfigurimit të adresës. ADDH = 0x1; // Pjesa e dytë e konfigurimit të adresës. CHAN = 0x19; // Konfigurimi i kanalit. OPTION.fec = FEC_0_OFF; // Konfigurimi i kalimit të korrigjimit të gabimit përpara. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // Konfigurimi i mënyrës së transmetimit. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // Konfigurimi i menaxhimit tërheqës. OPTION.transmissionPower = POWER_17; // konfigurimi i fuqisë së transmetimit dBm. OPTION.wirelessWakeupTime = WAKE_UP_1250; // Koha e pritjes për konfigurimin e zgjimit. SPED.airDataRate = AIR_DATA_RATE_011_48; // Konfigurimi i normës së të dhënave të ajrit. SPED.uartBaudRate = UART_BPS_115200; // Konfigurimi i shpejtësisë së komunikimit të komunikimit. SPED.uartParity = MODE_00_8N1; // Pak pariteti

Ju keni funksionin ekuivalent për të gjithë atributin për të marrë të gjithë përshkrimin:

Serial.print (F ("Chan:")); Serial.print (konfigurimi. CHAN, DEC); Serial.print (" ->"); Serial.println (configuration.getChannelDescription ()); Serial.println (F ("")); Serial.print (F ("SpeedParityBit:")); Serial.print (konfigurimi. SPED.uartParity, BIN); Serial.print (" ->"); Serial.println (konfigurimi. SPED.getUARTParityDescription ()); Serial.print (F ("SpeedUARTDatte:")); Serial.print (konfigurimi. SPED.uartBaudRate, BIN); Serial.print (" ->"); Serial.println (konfigurimi. SPED.getUARTBaudRate ()); Serial.print (F ("SpeedAirDataRate:")); Serial.print (konfigurimi. SPED.airDataRate, BIN); Serial.print (" ->"); Serial.println (konfigurimi. SPED.getAirDataRate ()); Serial.print (F ("OptionTrans:")); Serial.print (konfigurimi. OPTION.fixedTransmission, BIN); Serial.print (" ->"); Serial.println (konfigurimi. OPTION.getFixedTransmissionDescription ()); Serial.print (F ("OptionPullup:")); Serial.print (konfigurimi. OPTION.ioDriveMode, BIN); Serial.print (" ->"); Serial.println (konfigurimi. OPTION.getIODroveModeDescription ()); Serial.print (F ("OptionWakeup:")); Serial.print (configuration. OPTION.wirelessWakeupTime, BIN); Serial.print (" ->"); Serial.println (konfigurimi. OPTION.getWirelessWakeUPTimeDescription ()); Serial.print (F ("OptionFEC:")); Serial.print (konfigurimi. OPTION.fec, BIN); Serial.print (" ->"); Serial.println (konfigurimi. OPTION.getFECDescription ()); Serial.print (F ("OptionPower:")); Serial.print (konfigurimi. OPTION.transmissionPower, BIN); Serial.print (" ->"); Serial.println (konfigurimi. OPTION.getTransmissionPowerDescription ());

Në të njëjtën mënyrë setConfiguration dëshiron një strukturë konfigurimi, kështu që unë mendoj se mënyra më e mirë për të menaxhuar konfigurimin është të marrësh atë aktual, të aplikosh ndryshimin e vetëm që të nevojitet dhe ta vendosësh përsëri.

ResponseStatus setConfiguration (Konfigurimi i konfigurimit, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

konfigurimi është strucutre previsiouly show, saveType leje që ju të zgjidhni nëse ndryshimi bëhet përgjithmonë vetëm për sesionin aktual.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // importantshtë e rëndësishme të merrni treguesin e konfigurimit para çdo operacioni tjetër Konfigurimi i konfigurimit = *(Konfigurimi *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfigurimi); konfigurimi. ADDL = 0x0; konfigurimi. ADDH = 0x1; konfigurimi. CHAN = 0x19; konfigurimi. OPTION.fec = FEC_0_OFF; konfigurimi. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; konfigurimi. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; konfigurimi. OPTION.transmissionPower = POWER_17; configuration. OPTION.wirelessWakeupTime = WAKE_UP_1250; konfigurimi. SPED.airDataRate = AIR_DATA_RATE_011_48; configuration. SPED.uartBaudRate = UART_BPS_115200; configuration. SPED.uartParity = MODE_00_8N1; // Konfigurimi i konfiguruar ndryshoi dhe u vendos që të mos mbajë konfigurimin ResponseStatus rs = e32ttl100.setConfiguration (konfigurimi, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfigurimi);

Të gjithë parametrat menaxhohen si konstantë:

Hapi 10: Opsioni bazë i konfigurimit

Opsioni bazë i konfigurimit
Opsioni bazë i konfigurimit

Hapi 11: Dërgoni Merr Mesazh

Së pari ne duhet të prezantojmë një metodë të thjeshtë por të dobishme për të kontrolluar nëse diçka është në tamponin e marrjes

int në dispozicion ();

Thjesht kthehet sa bajt keni në rrjedhën aktuale.

Hapi 12: Mënyra Normale e Transmetimit

Mënyra Normale e Transmetimit
Mënyra Normale e Transmetimit

Mënyra normale/transparente e transmetimit përdoret për të dërguar mesazhe në të gjitha pajisjet me të njëjtën adresë dhe kanal.

Ka shumë metoda për të dërguar/marrë mesazhe, ne do të shpjegojmë në detaje:

ResponseStatus sendMessage (const String message);

ResponseContainer merrniMessage ();

Metoda e parë është sendMessage dhe përdoret për të dërguar një String në një pajisje në modalitetin Normal.

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

Pajisja tjetër thjesht bëni në lak

if (e32ttl.disponueshëm ()> 1) {ResponseContainer rs = e32ttl.receiveMessage (); Mesazh vargu = rs.data; // Së pari merrni të dhënat Serial.println (rs.status.getResponseDescription ()); Serial.println (mesazh); }

Hapi 13: Menaxhoni Strukturën

Nëse dëshironi të dërgoni një strukturë komplekse, mund ta përdorni këtë metodë

ResponseStatus sendMessage (mesazh const void *, const uint8_t size); ResponseStructContainer merrniMessage (madhësia const uint8_t);

Përdoret për të dërguar strucutre, për shembull:

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

dhe në anën tjetër ju mund ta merrni mesazhin kështu

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

Lexoni strukturën e pjesshme

Nëse dëshironi të lexoni pjesën e parë të mesazhit për të menaxhuar më shumë lloj strucutre, mund ta përdorni këtë metodë.

ResponseContainer دریافتInitialMessage (madhësia e konstant uint8_t);

Unë e krijoj atë për të marrë një varg me tip ose tjetër për të identifikuar strukturën për të ngarkuar.

struct Messaggione {// Strucutre e pjesshme pa mesazh tipchar [8]; bool mitico; }; lloji i karbonit [5]; // pjesa e parë e strukturës ResponseContainer rs = e32ttl.receiveInitialMessage (madhësia (lloji)); // Vendos vargun në një grup char (nuk nevojitet) memcpy (lloji, rs.data.c_str (), madhësia (lloji)); Serial.println ("LEXO LLOJIN:"); Serial.println (rs.status.getResponseDescription ()); Serial.println (lloji); // Lexoni pjesën tjetër të strukturës ResponseStructContainer rsc = e32ttl.receiveMessage (madhësia (Messaggione)); struktur Messaggione messaggione = *(Messaggione *) rsc.data;

Hapi 14: Mënyra Fikse në vend të Modalitetit Normal

Në të njëjtën mënyrë unë krijoj një grup metodash për t'u përdorur me transmetim fiks

Transmetim fiks

Ju duhet të ndryshoni vetëm metodën e dërgimit, sepse pajisja e destinacionit nuk merr preambulën me Adresën dhe Kanalin quando settato il mode fikse.

Pra për mesazhin String që keni

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

dhe për strukturën që keni

ResponseStatus sendFixedMessage (byte ADDL, byte ADDH, byte CHAN, const void *message, const uint8_t size); ResponseStatus sendBroadcastFixedMessage (byte CHAN, const void *message, const uint8_t size);

Këtu është një shembull i thjeshtë

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

Transmetimi fiks ka më shumë skenarë

Nëse dërgoni në një pajisje specifike (skenarët e dytë Transmetimi fiks) duhet të shtoni ADDL, ADDH dhe CHAN për ta identifikuar atë drejtpërdrejt.

ResponseStatus rs = e32ttl.sendFixedMessage (2, 2, 0x17, "Mesazh një pajisjeje");

Nëse dëshironi të dërgoni një mesazh në të gjitha pajisjet në një kanal të caktuar, mund ta përdorni këtë metodë.

ResponseStatus rs = e32ttl.sendBroadcastFixedMessage (0x17, "Mesazh për pajisjet e një kanali");

Nëse dëshironi të merrni të gjitha mesazhet e transmetuara në rrjet, duhet të vendosni ADDH dhe ADDL me BROADCAST_ADDRESS.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // importantshtë e rëndësishme të merrni treguesin e konfigurimit para çdo operacioni tjetër Konfigurimi i konfigurimit = *(Konfigurimi *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfigurimi); konfigurimi. ADDL = BROADCAST_ADDRESS; konfigurimi. ADDH = BROADCAST_ADDRESS; // Konfigurimi i konfiguruar ndryshoi dhe u vendos që të mos mbajë konfigurimin ResponseStatus rs = e32ttl100.setConfiguration (konfigurimi, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfigurimi);

Hapi 15: Faleminderit

Tani keni të gjithë informacionin për të bërë punën tuaj, por mendoj se është e rëndësishme të tregoni disa shembuj realistë për të kuptuar më mirë të gjitha mundësitë.

  1. Pajisja LoRa E32 për Arduino, esp32 ose esp8266: cilësimet dhe përdorimi bazë
  2. Pajisja LoRa E32 për Arduino, esp32 ose esp8266: bibliotekë
  3. Pajisja LoRa E32 për Arduino, esp32 ose esp8266: konfigurimi
  4. Pajisja LoRa E32 për Arduino, esp32 ose esp8266: transmetim fiks
  5. Pajisja LoRa E32 për Arduino, esp32 ose esp8266: kursimi i energjisë dhe dërgimi i të dhënave të strukturuara

Recommended: