Sadržaj:

LoRa bežična komunikacija od 3 do 8 km s niskim troškovima E32 (sx1278/sx1276) uređaj za Arduino, Esp8266 ili Esp32: 15 koraka
LoRa bežična komunikacija od 3 do 8 km s niskim troškovima E32 (sx1278/sx1276) uređaj za Arduino, Esp8266 ili Esp32: 15 koraka

Video: LoRa bežična komunikacija od 3 do 8 km s niskim troškovima E32 (sx1278/sx1276) uređaj za Arduino, Esp8266 ili Esp32: 15 koraka

Video: LoRa bežična komunikacija od 3 do 8 km s niskim troškovima E32 (sx1278/sx1276) uređaj za Arduino, Esp8266 ili Esp32: 15 koraka
Video: Lora water meter wireless handheld controller 2024, Juli
Anonim
LoRa bežična komunikacija od 3 do 8 km s jeftinim E32 (sx1278/sx1276) uređajem za Arduino, Esp8266 ili Esp32
LoRa bežična komunikacija od 3 do 8 km s jeftinim E32 (sx1278/sx1276) uređajem za Arduino, Esp8266 ili Esp32

Kreiram biblioteku za upravljanje EBYTE E32 baziranom na Semtech seriji LoRa uređaja, vrlo moćnom, jednostavnom i jeftinom uređaju.

Ovdje možete pronaći verziju od 3 km, verziju od 8 km ovdje

Mogu raditi na udaljenosti od 3000m do 8000m, a imaju mnogo mogućnosti i parametara. Zato stvaram ovu biblioteku kako bih pojednostavio upotrebu.

To je rješenje za preuzimanje podataka sa gradskih senzora ili za upravljanje dronom.

Supplies

Arduino UNO

Wemos D1 mini

LoRa E32 TTL 100 3Km verzija

Verzija LoRa E32 TTL 1W 8Km

Korak 1: Biblioteka

Biblioteka
Biblioteka

Moju biblioteku možete pronaći ovdje.

Preuzimanje.

Pritisnite dugme DOWNLOADS u gornjem desnom kutu, preimenujte nekomprimiranu mapu LoRa_E32.

Proverite da li fascikla LoRa_E32 sadrži LoRa_E32.cpp i LoRa_E32.h.

Postavite mapu biblioteke LoRa_E32 u vašu / knjižnice / mapu. Možda ćete morati stvoriti podmapu biblioteka ako je to vaša prva biblioteka.

Ponovo pokrenite IDE.

Korak 2: Pinout

Pinout
Pinout
Pinout
Pinout
Pinout
Pinout

Kao što vidite, možete postaviti različite načine rada pomoću pinova M0 i M1.

Postoje neki pinovi koji se mogu koristiti na statički način, ali ako ga povežete s mikrokontrolerom i konfigurirate ih u biblioteci, dobit ćete performanse i možete kontrolirati sav način rada putem softvera, ali sljedeće ćemo objasniti bolje.

Korak 3: AUX pin

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

Kao što sam već rekao Nije važno spojiti sve pinove na izlaz mikrokontrolera, možete postaviti pinove M0 i M1 na HIGH ili LOW kako biste dobili željenu konfiguraciju, a ako ne povežete AUX, biblioteka postavlja razumno kašnjenje kako bi bili sigurni da je operacija završena.

AUX pin

Prilikom prijenosa podataka može se koristiti za buđenje vanjskog MCU -a i vraćanje HIGH na kraju prijenosa podataka.

Pri primanju AUX -a ide NIZO i vraća se VISOKO kada je bafer prazan.

Koristi se i za samoprovjeru za vraćanje normalnog rada (pri uključivanju i mirovanju/programskom načinu rada).

Korak 4: Potpuno povezana shema Esp8266

Potpuno povezana shema Esp8266
Potpuno povezana shema Esp8266
Potpuno povezana shema Esp8266
Potpuno povezana shema Esp8266

Shema povezivanja esp8266 je jednostavnija jer radi na istom naponu logičke komunikacije (3,3 V).

Važno je dodati otpornik (4, 7Kohm) kako biste postigli dobru stabilnost.

Korak 5: Potpuno povezana shema Arduino

Potpuno povezana shema Arduino
Potpuno povezana shema Arduino
Potpuno povezana shema Arduino
Potpuno povezana shema Arduino

Radni napon Arduina je 5v, pa moramo dodati razdjelnik napona na RX pinove M0 i M1 LoRa modula kako bismo spriječili oštećenja. Više informacija možete dobiti ovdje Volter razdjelnik: kalkulator i aplikacija.

Možete upotrijebiti 2Kohm otpornik za GND i 1Kohm od signala nego spojiti na RX.

Korak 6: Biblioteka: Konstruktor

Napravio sam niz prilično brojnih konstruktora, jer možemo imati više opcija i situacija 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);

Prvi skup konstruktora je kreiran za delegiranje upravljanja serijskim i drugim pinovima u biblioteku.

rxPin i txPin su pin za povezivanje na UART i oni su obavezni.

auxPin je pin koji provjerava stanje rada, prijenosa i primanja (dalje ćemo objasniti bolje), taj pin nije obavezan, ako ga ne postavite, primjenjujem odgodu da dozvolim da se operacija dovrši sama (sa kašnjenjem).

m0pin i m1Pin su pinovi za promjenu načina rada (pogledajte gornju tablicu), mislim da će se ti pinovi u "produkciji" povezati izravno VISOKO ili NISKO, ali za testiranje njima korisno upravlja biblioteka.

bpsRate je prijenos SoftwareSerial -a normalno 9600 (jedina brzina prijenosa u programskom režimu/načinu mirovanja)

Jednostavan primjer je

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

Možemo izravno koristiti SoftwareSerial s drugim konstruktorom

LoRa_E32 (Hardverski serijski* 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);

Gornji primjer s ovim konstruktorom može se učiniti ovako.

#include #include "LoRa_E32.h"

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

LoRa_E32 e32ttl100 (& mojaSerijska);

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

Posljednji skup konstruktora dopušta upotrebu HardwareSerial umjesto 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);

Korak 7: Počnite

Komanda begin se koristi za pokretanje serijskog i pinova u načinu ulaza i izlaza.

void begin ();

u izvršenju je

// Pokretanje svih pinova i UART -a

e32ttl100.begin ();

Korak 8: Konfiguracija i način informiranja

Postoji skup metoda za upravljanje konfiguracijom i dobivanje informacija o uređaju.

ResponseStructContainer getConfiguration ();

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

ResponseStructContainer getModuleInformation ();

void printParameters (konfiguracija konfiguracije konstrukcije);

ResponseStatus resetModule ();

Korak 9: Spremnik za odgovore

Da bih pojednostavio upravljanje odgovorom, stvaram skup spremnika, za mene vrlo korisno za upravljanje greškama i vraćanje generičkih podataka.

ResponseStatus

Ovo je spremnik statusa i ima 2 jednostavne ulazne točke, pomoću kojih možete dobiti statusni kod i opis statusnog koda

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

Serial.println (c.code); // 1 ako uspjeh

Kod su

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

Ovaj spremnik je kreiran za upravljanje String odgovorom i ima 2 ulazne točke.

podaci sa nizom vraćenim iz poruke i statusom instanca RepsonseStatus.

ResponseContainer rs = e32ttl.receiveMessage ();

Niz poruka = rs.data;

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

Serial.println (poruka);

ResponseStructContainer

Ovo je složeniji spremnik, koristim ga za upravljanje strukturom, ima istu ulaznu točku ResponseContainer -a, ali su podaci prazni pokazivač za upravljanje složenom strukturom.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Važno je nabaviti pokazivač konfiguracije prije svih drugih operacija

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

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

Serial.println (c.status.code);

getConfiguration i setConfiguration

Prva metoda je getConfiguration, možete je koristiti za ponovno preuzimanje svih podataka pohranjenih na uređaju.

ResponseStructContainer getConfiguration ();

Evo primjera upotrebe.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Važno je nabaviti pokazivač konfiguracije prije svih drugih operacija

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

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

Serial.println (c.status.code);

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

Struktura konfiguracije ima sve podatke o postavkama, a ja dodajem niz funkcija da dobijem sav opis pojedinačnih podataka.

configuration. ADDL = 0x0; // Prvi dio addressconfiguration. ADDH = 0x1; // Drugi dio konfiguracije adrese. CHAN = 0x19; // Konfiguracija kanala. OPTION.fec = FEC_0_OFF; // Prosljeđivanje konfiguracije prekidača za ispravljanje grešaka. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // Konfiguracija načina prijenosa. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // Pull-up konfiguracija upravljanja. OPTION.transmissionPower = POWER_17; // konfiguracija snage prijenosa dBm. OPTION.wirelessWakeupTime = WAKE_UP_1250; // Vrijeme čekanja za konfiguraciju buđenja. SPED.airDataRate = AIR_DATA_RATE_011_48; // Konfiguracija brzine prijenosa zraka. SPED.uartBaudRate = UART_BPS_115200; // Konfiguracija brzine prijenosa komunikacije. SPED.uartParity = MODE_00_8N1; // Paritetni bit

Imate ekvivalentnu funkciju za sve atribute da biste dobili sav 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 isti način setConfiguration želi konfiguracijsku strukturu, pa mislim da je bolji način za upravljanje konfiguracijom preuzimanje trenutne, primijeniti jedinu promjenu koja vam je potrebna i postaviti je ponovo.

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

konfiguracija je prethodno prikazana struktura, saveType vam dozvoljava da odaberete ako promjena postane trajno samo za trenutnu sesiju.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Važno je dobiti konfiguracijski pokazivač prije svih ostalih operacija Configuration configuration = *(Configuration *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfiguracija); configuration. ADDL = 0x0; configuration. ADDH = 0x1; configuration. 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; // Postavi konfiguraciju promijenjenu i postavi da ne drži konfiguraciju ResponseStatus rs = e32ttl100.setConfiguration (konfiguracija, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfiguracija);

Parametrima se upravlja kao konstantno:

Korak 10: Opcija osnovne konfiguracije

Opcija osnovne konfiguracije
Opcija osnovne konfiguracije

Korak 11: Pošaljite poruku primanja

Prvo moramo uvesti jednostavnu, ali korisnu metodu za provjeru ima li nešto u međuspremniku za prijem

int available ();

To je jednostavno vraćanje koliko bajtova imate u trenutnom toku.

Korak 12: Normalni način prijenosa

Normalni način prijenosa
Normalni način prijenosa

Normalni/transparentni način prijenosa koristi se za slanje poruka na sve uređaje s istom adresom i kanalom.

Postoji mnogo načina slanja/primanja poruke, detaljno ćemo ih objasniti:

ResponseStatus sendMessage (poruka const String);

ResponseContainer receiveMessage ();

Prva metoda je sendMessage i koristi se za slanje niza na uređaj u normalnom načinu rada.

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

Drugi uređaj jednostavno radi na petlji

if (e32ttl.available ()> 1) {ResponseContainer rs = e32ttl.receiveMessage (); Niz poruka = rs.data; // Prvi put nabavite podatke Serial.println (rs.status.getResponseDescription ()); Serial.println (poruka); }

Korak 13: Upravljajte strukturom

Ako želite poslati složenu strukturu, možete koristiti ovu metodu

ResponseStatus sendMessage (poruka const void *, veličina const uint8_t); ResponseStructContainer receiveMessage (veličina const uint8_t);

Koristi se za slanje strucutre, na primjer:

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

a s druge strane možete primiti poruku

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

Pročitajte djelomični strucure

Ako želite pročitati prvi dio poruke za upravljanje više vrsta strukture, možete koristiti ovu metodu.

ResponseContainer receiveInitialMessage (veličina const uint8_t);

Kreirao sam ga za primanje niza s tipom ili drugim za identifikaciju strukture za učitavanje.

struct Messaggione {// Djelomična struktura bez poruke typechar [8]; bool mitico; }; tip char [5]; // prvi dio strukture ResponseContainer rs = e32ttl.receiveInitialMessage (sizeof (type)); // Stavljanje niza u niz znakova (nije potrebno) memcpy (type, rs.data.c_str (), sizeof (type)); Serial.println ("READ TYPE:"); Serial.println (rs.status.getResponseDescription ()); Serial.println (tip); // Pročitajte ostatak strukture ResponseStructContainer rsc = e32ttl.receiveMessage (sizeof (Messaggione)); struct Messaggione messaggione = *(Poruka *) rsc.data;

Korak 14: Fiksni način rada umjesto normalnog načina rada

Na isti način stvaram skup metoda za korištenje sa fiksnim prijenosom

Fiksni prijenos

Morate promijeniti samo način slanja, jer odredišni uređaj ne prima preambulu s postavkama adrese i kanala za fiksni način rada.

Dakle, za string poruku imate

ResponseStatus sendFixedMessage (bajt ADDL, bajt ADDH, bajt CHAN, poruka const String); ResponseStatus sendBroadcastFixedMessage (bajt CHAN, poruka const String);

a za strukturu koju imate

ResponseStatus sendFixedMessage (bajt ADDL, bajt ADDH, bajt CHAN, const void *poruka, const uint8_t veličina); ResponseStatus sendBroadcastFixedMessage (bajt CHAN, const void *poruka, const uint8_t veličina);

Evo jednostavnog primjera

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

Fiksni prijenos ima više scenarija

Ako šaljete na određeni uređaj (drugi scenariji Fiksni prijenos), morate dodati ADDL, ADDH i CHAN da biste ga izravno identificirali.

ResponseStatus rs = e32ttl.sendFixedMessage (2, 2, 0x17, "Poruka uređaju");

Ako želite poslati poruku svim uređajima na određenom kanalu, možete koristiti ovu metodu.

ResponseStatus rs = e32ttl.sendBroadcastFixedMessage (0x17, "Poruka do uređaja kanala");

Ako želite primati sve emitirane poruke na mreži, morate postaviti ADDH i ADDL sa BROADCAST_ADDRESS.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Važno je nabaviti pokazivač konfiguracije prije svih ostalih operacija Configuration configuration = *(Configuration *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfiguracija); configuration. ADDL = BROADCAST_ADDRESS; configuration. ADDH = BROADCAST_ADDRESS; // Postavi konfiguraciju promijenjenu i postavi da ne drži konfiguraciju ResponseStatus rs = e32ttl100.setConfiguration (konfiguracija, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfiguracija);

Korak 15: Hvala

Sada imate sve informacije za obavljanje svog posla, ali mislim da je važno pokazati neke realne primjere kako biste bolje razumjeli sve mogućnosti.

  1. LoRa E32 uređaj za Arduino, esp32 ili esp8266: postavke i osnovna upotreba
  2. LoRa E32 uređaj za Arduino, esp32 ili esp8266: biblioteka
  3. LoRa E32 uređaj za Arduino, esp32 ili esp8266: konfiguracija
  4. LoRa E32 uređaj za Arduino, esp32 ili esp8266: fiksni prijenos
  5. LoRa E32 uređaj za Arduino, esp32 ili esp8266: ušteda energije i slanje strukturiranih podataka

Preporučuje se: