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, Srpanj
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

Ja stvaram knjižnicu za upravljanje EBYTE E32 na temelju Semtech serije LoRa uređaja, vrlo snažnog, jednostavnog i jeftinog uređaja.

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

Mogu raditi na udaljenosti od 3000m do 8000m, a imaju puno mogućnosti i parametara. Stoga stvaram ovu knjižnicu kako bih pojednostavio upotrebu.

To je rješenje za dohvaćanje podataka sa gradskih senzora ili za upravljanje dronom.

Pribor

Arduino UNO

Wemos D1 mini

Verzija LoRa E32 TTL 100 3 km

Verzija LoRa E32 TTL 1W 8Km

Korak 1: Knjižnica

Knjižnica
Knjižnica

Moju biblioteku možete pronaći ovdje.

Preuzeti.

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

Provjerite sadrži li mapa LoRa_E32 LoRa_E32.cpp i LoRa_E32.h.

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

Ponovo pokrenite IDE.

Korak 2: Pinout

Prikaz izvoda
Prikaz izvoda
Prikaz izvoda
Prikaz izvoda
Prikaz izvoda
Prikaz izvoda

Kao što vidite, možete postaviti različite načine rada preko 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 u knjižnici, dobit ćete performanse i možete upravljati svim načinom rada putem softvera, ali sljedeće ćemo objasniti.

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, knjižnica postavlja razumno kašnjenje kako bi bili sigurni da je operacija dovršena.

AUX pin

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

Prilikom primanja AUX -a ide NIZO i vraća se VISOKO kad je međuspremnik prazan.

Također se koristi 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 jednostavnija je 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 pinu M0 i M1 LoRa modula kako bismo spriječili oštećenja. Više informacija možete dobiti ovdje. Djelitelj napona: kalkulator i aplikacija.

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

Korak 6: Knjižnica: Konstruktor

Napravio sam niz prilično brojnih konstruktora, jer možemo imati više mogućnosti 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 s UART -om i obavezni su.

auxPin je pin koji provjerava rad, prijenos i status primanja (dalje ćemo objasniti bolje), taj pin nije obavezan, ako ga ne postavite, primjenjujem odgodu kako bih dopustio da se operacija dovrši sama (s latencijom).

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

bpsRate je prijenos SoftwareSerial -a normalno 9600 (jedina brzina prijenosa u programskom načinu rada/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

Softversku seriju možemo izravno koristiti s drugim konstruktorom

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

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

#include #include "LoRa_E32.h"

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

LoRa_E32 e32ttl100 (& mySerial);

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

Posljednji skup konstruktora dopušta korištenje 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

Naredba begin koristi se 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 niz 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 struct konfiguracije);

ResponseStatus resetModule ();

Korak 9: Spremnik za odgovore

Kako bih pojednostavio upravljanje odgovorom, stvaram skup spremnika, za mene vrlo korisno za upravljanje pogreš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 (k.kod); // 1 ako je 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 odzivom Stringa i ima 2 ulazne točke.

podaci s 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, ali su podaci prazni pokazivač za upravljanje složenom strukturom.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Važno je nabaviti pokazivač konfiguracije prije svih ostalih 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 ostalih 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 za dobivanje svih opisa pojedinačnih podataka.

konfiguracija. ADDL = 0x0; // Prvi dio konfiguracije adrese. ADDH = 0x1; // Drugi dio konfiguracije adrese. CHAN = 0x19; // Konfiguracija kanala. OPTION.fec = FEC_0_OFF; // Konfiguracija prekidača za ispravljanje pogrešaka prema naprijed. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // Konfiguracija načina prijenosa. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // Pull-up management configuration. 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 upravljanja konfiguracijom dohvaćanje 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 dopušta da odaberete ako promjena postane trajno samo za trenutnu sesiju.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Važno je dobiti pokazivač konfiguracije prije svih ostalih operacija 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; konfiguracija. 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

11. korak: pošaljite poruku primanja

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

int dostupan ();

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 tako

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

Ja ga stvaram 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)); // Stavi niz u niz znakova (nije potreban) 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 = *(Messaggione *) rsc.data;

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

Na isti način stvaram skup metoda za korištenje s 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 poruku string 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 uređajima s kanala");

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

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Važno je dobiti pokazivač konfiguracije prije svih ostalih operacija 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; // 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 svoj posao, 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: knjižnica
  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čeni: