Cuprins:

Comunicare fără fir LoRa de 3Km la 8Km cu dispozitiv E32 (sx1278 / sx1276) low cost pentru Arduino, Esp8266 sau Esp32: 15 pași
Comunicare fără fir LoRa de 3Km la 8Km cu dispozitiv E32 (sx1278 / sx1276) low cost pentru Arduino, Esp8266 sau Esp32: 15 pași

Video: Comunicare fără fir LoRa de 3Km la 8Km cu dispozitiv E32 (sx1278 / sx1276) low cost pentru Arduino, Esp8266 sau Esp32: 15 pași

Video: Comunicare fără fir LoRa de 3Km la 8Km cu dispozitiv E32 (sx1278 / sx1276) low cost pentru Arduino, Esp8266 sau Esp32: 15 pași
Video: Prezentare generală și configurare a modulului EBYTE LoRa 2024, Iulie
Anonim
Comunicare wireless LoRa de 3Km la 8Km cu dispozitiv E32 (sx1278 / sx1276) low cost pentru Arduino, Esp8266 sau Esp32
Comunicare wireless LoRa de 3Km la 8Km cu dispozitiv E32 (sx1278 / sx1276) low cost pentru Arduino, Esp8266 sau Esp32

Creez o bibliotecă pentru gestionarea EBYTE E32 bazată pe seria Semtech de dispozitive LoRa, dispozitiv foarte puternic, simplu și ieftin.

Puteți găsi versiunea de 3 km aici, versiunea de 8 km aici

Pot funcționa pe o distanță de 3000m până la 8000m și au o mulțime de caracteristici și parametri. Așa că am creat această bibliotecă pentru a simplifica utilizarea.

Este o soluție pentru preluarea datelor de la senzorii metropolitani sau pentru controlul dronelor.

Provizii

Arduino UNO

Wemos D1 mini

Versiunea LoRa E32 TTL 100 3Km

Versiunea LoRa E32 TTL 1W 8Km

Pasul 1: Biblioteca

Bibliotecă
Bibliotecă

Puteți găsi biblioteca mea aici.

A descărca.

Faceți clic pe butonul DESCĂRCĂRI din colțul din dreapta sus, redenumiți folderul necomprimat LoRa_E32.

Verificați dacă folderul LoRa_E32 conține LoRa_E32.cpp și LoRa_E32.h.

Plasați folderul de bibliotecă LoRa_E32 / folderul / biblioteci. Poate fi necesar să creați subfolderul bibliotecilor dacă este prima dvs. bibliotecă.

Reporniți IDE-ul.

Pasul 2: Pinout

Pinout
Pinout
Pinout
Pinout
Pinout
Pinout

După cum puteți vedea, puteți seta diferite moduri prin pinii M0 și M1.

Există câțiva pini care pot fi folosiți într-un mod static, dar dacă îl conectați la microcontroler și îl configurați în bibliotecă câștigați în performanță și puteți controla toate modurile prin intermediul software-ului, dar vom explica mai bine în continuare.

Pasul 3: Pin AUX

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

După cum am spus deja, nu este important să conectați toți pinii la ieșirea microcontrolerului, puteți pune pinii M0 și M1 la HIGH sau LOW pentru a obține configurația dorită și, dacă nu conectați AUX, biblioteca a stabilit o întârziere rezonabilă pentru a fi sigur că operațiunea este finalizată.

Pin AUX

Când transmiteți date, puteți folosi pentru a trezi MCU extern și a reveni la HIGH la finalizarea transferului de date.

Când primiți AUX merg LOW și reveniți HIGH când bufferul este gol.

Este, de asemenea, utilizat pentru auto-verificare pentru a restabili funcționarea normală (la pornire și în modul de repaus / program).

Pasul 4: Schema Esp8266 complet conectată

Schema complet conectată Esp8266
Schema complet conectată Esp8266
Schema complet conectată Esp8266
Schema complet conectată Esp8266

schema de conexiune esp8266 este mai simplă, deoarece funcționează la aceeași tensiune a comunicațiilor logice (3.3v).

Este important să adăugați rezistență de tracțiune (4, 7 Kohm) pentru a obține o stabilitate bună.

Pasul 5: Schema Arduino complet conectată

Schema Arduino complet conectată
Schema Arduino complet conectată
Schema Arduino complet conectată
Schema Arduino complet conectată

Tensiunea de lucru Arduino este de 5v, deci trebuie să adăugăm un divizor de tensiune pe pinul RX M0 și M1 al modulului LoRa pentru a preveni deteriorarea, puteți obține mai multe informații aici Divizor de tensiune: calculator și aplicație.

Puteți utiliza un rezistor de 2 Kohm la GND și 1 Kohm de la semnal decât pus împreună pe RX.

Pasul 6: Biblioteca: Constructor

Am creat un set de constructori destul de numeroși, pentru că putem avea mai multe opțiuni și situații de gestionat.

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

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

Primul set de constructori sunt creați pentru a delega administrarea Serial și a altor pini bibliotecii.

rxPin și txPin sunt pinul pentru conectarea la UART și sunt obligatorii.

auxPin este un pin care verifică starea de funcționare, transmisie și recepție (vom explica mai bine în continuare), acel pin Nu este obligatoriu, dacă nu îl setați, aplic o întârziere pentru a permite operațiunea să se finalizeze singură (cu latență).

m0pin și m1Pin sunt pinii pentru a schimba modul de funcționare (vezi tabelul de sus), cred că acei pin-uri din „producție” se vor conecta direct HIGH sau LOW, dar pentru testare, acestea sunt utile pentru a fi gestionate de bibliotecă.

bpsRate este boudrate-ul SoftwareSerial este în mod normal 9600 (singura rată de transmisie în modul programmin / sleep)

Un exemplu simplu este

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

Putem folosi direct un SoftwareSerial cu un alt constructor

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

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

LoRa_E32 (HardwareSerial * serial, octet auxPin, octet m0Pin, octet m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

Exemplul superior cu acest constructor poate fi așa.

#include #include "LoRa_E32.h"

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

LoRa_E32 e32ttl100 (& mySerial);

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

Ultimul set de constructori este de a permite utilizarea unui HardwareSerial în loc de SoftwareSerial.

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

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

LoRa_E32 (SoftwareSerial * serial, octet auxPin, octet m0Pin, octet m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

Pasul 7: Începeți

Comanda begin este utilizată pentru a porni Serial și pinii în modul de intrare și ieșire.

void begin ();

în executare este

// Porniți toți pinii și UART

e32ttl100.begin ();

Pasul 8: Configurare și metodă de informare

Există un set de metode pentru gestionarea configurației și obținerea informațiilor despre dispozitiv.

ResponseStructContainer getConfiguration ();

ResponseStatus setConfiguration (Configurare configurare, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

ResponseStructContainer getModuleInformation ();

void printParameters (struct Configuration configuration);

ResponseStatus resetModule ();

Pasul 9: Container de răspuns

Pentru a simplifica gestionarea răspunsului creez un set de containere, pentru mine foarte util pentru a gestiona erorile și a returna date generice.

ResponseStatus

Acesta este un container de stare și are 2 puncte de intrare simple, cu acesta puteți obține codul de stare și descrierea codului de stare

Serial.println (c.getResponseDescription ()); // Descrierea codului

Serial.println (c.code); // 1 dacă Succes

Codul este

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

Acest container este creat pentru a gestiona răspunsul String și are 2 puncte de intrare.

datele cu șirul au returnat din mesaj și stare o instanță a RepsonseStatus.

ResponseContainer rs = e32ttl.receiveMessage ();

String message = rs.data;

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

Serial.println (mesaj);

ResponseStructContainer

Acesta este containerul mai „complex”, îl folosesc pentru a gestiona structura, are același punct de intrare ca ResponseContainer, dar datele sunt un pointer gol pentru a gestiona structura complexă.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Este important să obțineți indicatorul de configurare înainte de orice altă operațiune

Configurare configurare = * (Configurare *) c.data;

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

Serial.println (c.status.code);

getConfiguration și setConfiguration

Prima metodă este getConfiguration, o puteți folosi pentru a retrage toate datele stocate pe dispozitiv.

ResponseStructContainer getConfiguration ();

Iată un exemplu de utilizare.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Este important să obțineți indicatorul de configurare înainte de orice altă operațiune

Configurare configurare = * (Configurare *) c.data;

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

Serial.println (c.status.code);

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

Structura de configurare are toate datele de setări și adaug o serie de funcții pentru a obține toate descrierile de date unice.

configuration. ADDL = 0x0; // Prima parte a addressconfiguration. ADDH = 0x1; // A doua parte a configurării adresei. CHAN = 0x19; // Configurarea canalului. OPTION.fec = FEC_0_OFF; // Configurarea comutatorului de corectare a erorilor înainte. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // Configurare mod transmisie. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // Configurare de gestionare pull-up. OPTION.transmissionPower = POWER_17; // configurația puterii de transmisie dBm. OPTION.wirelessWakeupTime = WAKE_UP_1250; // Timp de așteptare pentru configurarea trezirii. SPED.airDataRate = AIR_DATA_RATE_011_48; // Configurarea ratei de date aeriene. SPED.uartBaudRate = UART_BPS_115200; // Configurație baud rate de comunicare. SPED.uartParity = MODE_00_8N1; // Bit de paritate

Aveți funcția echivalentă pentru toate atributele pentru a obține toate descrierile:

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

În același mod, setConfiguration dorește o structură de configurare, așa că cred că cel mai bun mod de a gestiona configurația este de a prelua cea curentă, de a aplica singura modificare de care aveți nevoie și de a o seta din nou.

ResponseStatus setConfiguration (Configurare configurare, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

configurația este strucutra afișată în prealabil, saveType vă permite să alegeți dacă modificarea devine permanentă numai pentru sesiunea curentă.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Este important să obțineți indicatorul de configurare înainte de orice altă operațiune Configurare configurație = * (Configurare *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (configurare); 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; // Setați configurația modificată și setați să nu dețină configurația ResponseStatus rs = e32ttl100.setConfiguration (configurație, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (configurare);

Parametrii sunt gestionați ca constanți:

Pasul 10: Opțiune de configurare de bază

Opțiune de configurare de bază
Opțiune de configurare de bază

Pasul 11: Trimiteți mesajul de primire

Mai întâi trebuie să introducem o metodă simplă, dar utilă, pentru a verifica dacă există ceva în tamponul de recepție

int disponibil ();

Pur și simplu returnează câți octeți aveți în fluxul curent.

Pasul 12: Mod normal de transmisie

Mod de transmisie normal
Mod de transmisie normal

Modul de transmisie normal / transparent este utilizat pentru a trimite mesaje către toate dispozitivele cu aceeași adresă și canal.

Există o mulțime de metode pentru a trimite / primi mesaje, vom explica în detaliu:

ResponseStatus sendMessage (mesaj const String);

ResponseContainer receiveMessage ();

Prima metodă este sendMessage și este utilizată pentru a trimite un șir către un dispozitiv în modul normal.

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

Celălalt dispozitiv o face pur și simplu pe buclă

if (e32ttl.available ()> 1) {ResponseContainer rs = e32ttl.receiveMessage (); String message = rs.data; // Mai întâi obțineți datele Serial.println (rs.status.getResponseDescription ()); Serial.println (mesaj); }

Pasul 13: Gestionați structura

Dacă doriți să trimiteți o structură complexă, puteți utiliza această metodă

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

Este folosit pentru a trimite strucutre, de exemplu:

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

iar cealaltă parte puteți primi mesajul astfel

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

Citiți structura parțială

Dacă doriți să citiți prima parte a mesajului pentru a gestiona mai multe tipuri de structuri, puteți utiliza această metodă.

ResponseContainer receiveInitialMessage (dimensiunea const uint8_t);

Îl creez pentru a primi un șir cu un tip sau altul pentru a identifica structura de încărcat.

struct Messaggione {// Structură parțială fără mesaj tipar [8]; bool mitico; }; tip char [5]; // prima parte a structurii ResponseContainer rs = e32ttl.receiveInitialMessage (sizeof (type)); // Puneți șir într-o matrice de caractere (nu este necesar) memcpy (type, rs.data.c_str (), sizeof (type)); Serial.println ("CITIȚI TIP:"); Serial.println (rs.status.getResponseDescription ()); Serial.println (tip); // Citiți restul structurii ResponseStructContainer rsc = e32ttl.receiveMessage (sizeof (Messaggione)); struct Messaggione messaggione = * (Messaggione *) rsc.data;

Pasul 14: Mod fix în loc de modul normal

În același mod, creez un set de metode de utilizat cu transmisie fixă

Transmisie fixă

Trebuie să schimbați doar metoda de trimitere, deoarece dispozitivul de destinație nu primește preambulul cu Adresă și Canal când se stabilește modul fix.

Deci pentru mesajul String aveți

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

iar pentru structură aveți

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

Iată un exemplu simplu

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

Transmisia fixă are mai multe scenarii

Dacă trimiteți la un anumit dispozitiv (al doilea scenariu Transmisie fixă) trebuie să adăugați ADDL, ADDH și CHAN pentru al identifica direct.

ResponseStatus rs = e32ttl.sendFixedMessage (2, 2, 0x17, „Mesaj către un dispozitiv”);

Dacă doriți să trimiteți un mesaj către toate dispozitivele dintr-un canal specificat, puteți utiliza această metodă.

ResponseStatus rs = e32ttl.sendBroadcastFixedMessage (0x17, „Mesaj către un dispozitiv al unui canal”);

Dacă doriți să primiți toate mesajele difuzate în rețea, trebuie să setați ADDH și ADDL cu BROADCAST_ADDRESS.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Este important să obțineți indicatorul de configurare înainte de orice altă operațiune Configurare configurație = * (Configurare *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (configurare); configuration. ADDL = BROADCAST_ADDRESS; configuration. ADDH = BROADCAST_ADDRESS; // Setați configurația modificată și setați să nu dețină configurația ResponseStatus rs = e32ttl100.setConfiguration (configurație, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (configurare);

Pasul 15: Mulțumesc

Acum aveți toate informațiile pentru a vă face treaba, dar cred că este important să arătați câteva exemple realiste pentru a înțelege mai bine toate posibilitățile.

  1. Dispozitiv LoRa E32 pentru Arduino, esp32 sau esp8266: setări și utilizare de bază
  2. Dispozitiv LoRa E32 pentru Arduino, esp32 sau esp8266: bibliotecă
  3. Dispozitiv LoRa E32 pentru Arduino, esp32 sau esp8266: configurare
  4. Dispozitiv LoRa E32 pentru Arduino, esp32 sau esp8266: transmisie fixă
  5. Dispozitiv LoRa E32 pentru Arduino, esp32 sau esp8266: economisirea energiei și trimiterea de date structurate

Recomandat: