Satura rādītājs:

LoRa bezvadu sakari no 3 km līdz 8 km ar zemām izmaksām E32 (sx1278/sx1276) ierīce Arduino, Esp8266 vai Esp32: 15 soļi
LoRa bezvadu sakari no 3 km līdz 8 km ar zemām izmaksām E32 (sx1278/sx1276) ierīce Arduino, Esp8266 vai Esp32: 15 soļi

Video: LoRa bezvadu sakari no 3 km līdz 8 km ar zemām izmaksām E32 (sx1278/sx1276) ierīce Arduino, Esp8266 vai Esp32: 15 soļi

Video: LoRa bezvadu sakari no 3 km līdz 8 km ar zemām izmaksām E32 (sx1278/sx1276) ierīce Arduino, Esp8266 vai Esp32: 15 soļi
Video: 🧨 Подробнейший обзор "пятёрки" BMW F10. Есть ли в ней плюсы? Или одни минусы? 2024, Novembris
Anonim
LoRa bezvadu sakari no 3 līdz 8 km ar zemām izmaksām E32 (sx1278/sx1276) ierīce Arduino, Esp8266 vai Esp32
LoRa bezvadu sakari no 3 līdz 8 km ar zemām izmaksām E32 (sx1278/sx1276) ierīce Arduino, Esp8266 vai Esp32

Es izveidoju bibliotēku, lai pārvaldītu EBYTE E32, pamatojoties uz LoRa ierīces Semtech sēriju, kas ir ļoti jaudīga, vienkārša un lēta ierīce.

Jūs varat atrast 3Km versiju šeit, 8Km versiju šeit

Viņi var strādāt 3000–8000 m attālumā, un tiem ir daudz funkciju un parametru. Tāpēc es izveidoju šo bibliotēku, lai vienkāršotu lietošanu.

Tas ir risinājums, lai izgūtu datus no lielpilsētu sensoriem vai kontrolētu dronu.

Piegādes

Arduino UNO

Wemos D1 mini

LoRa E32 TTL 100 3Km versija

LoRa E32 TTL 1W 8Km versija

1. darbība: bibliotēka

Bibliotēka
Bibliotēka

Manu bibliotēku varat atrast šeit.

Lai lejupielādētu.

Augšējā labajā stūrī noklikšķiniet uz pogas LEJUPIELĀDĒT, pārdēvējiet nesaspiesto mapi LoRa_E32.

Pārbaudiet, vai LoRa_E32 mapē ir LoRa_E32.cpp un LoRa_E32.h.

Ievietojiet LoRa_E32 bibliotēkas mapi savā / libraries / mapē. Jums var būt jāizveido bibliotēku apakšmape, ja tā ir jūsu pirmā bibliotēka.

Restartējiet IDE.

2. darbība

Pinout
Pinout
Pinout
Pinout
Pinout
Pinout

Kā redzat, varat iestatīt dažādus režīmus, izmantojot M0 un M1 tapas.

Ir dažas tapas, kuras var izmantot statiskā veidā, bet, ja jūs pievienojat to mikrokontrolleram un konfigurējat tās bibliotēkā, jūs iegūstat veiktspēju, un jūs varat kontrolēt visu režīmu, izmantojot programmatūru, bet tālāk mēs paskaidrosim labāk.

3. darbība: AUX tapa

AUX tapa
AUX tapa
AUX tapa
AUX tapa
AUX tapa
AUX tapa

Kā es jau saku, nav svarīgi visu tapu pieslēgt pie mikrokontrollera izejas, jūs varat ievietot M0 un M1 tapas HIGH vai LOW, lai iegūtu detalizētu konfigurāciju, un, ja nepievienojat AUX, bibliotēka nosaka saprātīgu kavēšanos ka darbība ir pabeigta.

AUX tapa

Nosūtot datus, var izmantot, lai pamodinātu ārējo MCU un atgrieztos HIGH pēc datu pārsūtīšanas pabeigšanas.

Saņemot AUX, zems un atgriežas HIGH, kad buferis ir tukšs.

To izmanto arī pašpārbaudei, lai atjaunotu normālu darbību (ieslēgšanas un miega/programmas režīmā).

4. darbība: pilnībā savienota shēma Esp8266

Pilnībā savienota shēma Esp8266
Pilnībā savienota shēma Esp8266
Pilnībā savienota shēma Esp8266
Pilnībā savienota shēma Esp8266

esp8266 savienojuma shēma ir vienkāršāka, jo tā darbojas ar tādu pašu loģisko sakaru spriegumu (3.3v).

Lai iegūtu labu stabilitāti, ir svarīgi pievienot pievilkšanas rezistoru (4, 7Kohm).

5. darbība: pilnībā savienota shēma Arduino

Pilnībā savienota shēma Arduino
Pilnībā savienota shēma Arduino
Pilnībā savienota shēma Arduino
Pilnībā savienota shēma Arduino

Arduino darba spriegums ir 5v, tāpēc mums ir jāpievieno sprieguma dalītājs LoRa moduļa RX tapai M0 un M1, lai novērstu bojājumus, šeit varat iegūt vairāk informācijas Sprieguma dalītājs: kalkulators un lietojumprogramma.

Jūs varat izmantot 2Kohm rezistoru GND un 1Kohm no signāla nekā salikt RX.

6. darbība: bibliotēka: konstruktors

Es izveidoju diezgan daudzu konstruktoru komplektu, jo mums var būt vairāk iespēju un situāciju, ko pārvaldīt.

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

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

Pirmais konstruktoru komplekts tiek izveidots, lai bibliotēkai deleģētu sērijas un citu tapu pārvaldību.

rxPin un txPin ir piespraude, lai izveidotu savienojumu ar UART, un tie ir obligāti.

auxPin ir tapa, kas pārbauda darbību, pārraidi un saņemšanas statusu (tālāk mēs paskaidrosim labāk), šī tapa Tas nav obligāti, ja jūs to neiestatāt, es piemēroju aizkavi, lai ļautu darbībai pabeigties (ar latentumu).

m0pin un m1Pin ir tapas, lai mainītu darbības režīmu (skatiet tabulas augšdaļu), es domāju, ka šīs tapas “ražošanā” tieši pieslēgsies HIGH vai LOW, bet pārbaudei tās ir lietderīgi pārvaldīt bibliotēkā.

bpsRate ir programmatūras sērijas budrāts parasti ir 9600 (vienīgais datu pārraides ātrums programmin/miega režīmā)

Vienkāršs piemērs ir

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

Mēs varam tieši izmantot SoftwareSerial ar citu konstruktoru

LoRa_E32 (HardwareSerial* sērijas, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (HardwareSerial* sērijas, baits auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (HardwareSerial* sērijas, baits auxPin, baits m0Pin, baits m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

Augšējais piemērs ar šo konstruktoru var būt šāds.

#include #include "LoRa_E32.h"

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

LoRa_E32 e32ttl100 (& mySerial);

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

Pēdējais konstruktoru komplekts ir atļauts izmantot HardwareSerial, nevis SoftwareSerial.

LoRa_E32 (SoftwareSerial* sērijas, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (SoftwareSerial* sērijas, baits auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (SoftwareSerial* sērija, baits auxPin, baits m0Pin, baits m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

7. solis: sāciet

Komanda start tiek izmantota, lai startēšanas sērijas un tapas ievades un izvades režīmā.

void begin ();

izpildē ir

// Sākt visas tapas un UART

e32ttl100.begin ();

8. darbība: konfigurācijas un informācijas metode

Ir metožu kopums, lai pārvaldītu konfigurāciju un iegūtu informāciju par ierīci.

ResponseStructContainer getConfiguration ();

ResponseStatus setConfiguration (konfigurācijas konfigurācija, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

ResponseStructContainer getModuleInformation ();

void printParameters (struktura konfigurācijas konfigurācija);

ResponseStatus resetModule ();

9. darbība. Atbildes konteiners

Lai vienkāršotu atbildes pārvaldību, es izveidoju konteinera komplektu, kas man ir ļoti noderīgi, lai pārvaldītu kļūdas un atgrieztu vispārīgus datus.

ResponseStatus

Šis ir statusa konteiners, un tam ir 2 vienkārši ievades punkti, ar kuriem jūs varat iegūt statusa kodu un statusa koda aprakstu

Serial.println (c.getResponseDescription ()); // Koda apraksts

Serial.println (c.code); // 1 ja veiksme

Kods ir

VEIKSME = 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 konteiners ir izveidots, lai pārvaldītu virknes atbildi, un tam ir 2 ievades punkti.

dati ar virkni, kas atgriezta no ziņojuma, un statuss ir RepsonseStatus gadījums.

ResponseContainer rs = e32ttl.receptMessage ();

String message = rs.data;

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

Serial.println (ziņojums);

ResponseStructContainer

Šis ir sarežģītāks konteiners, es to izmantoju struktūras pārvaldīšanai. Tam ir tāds pats ResponseContainer ieejas punkts, bet dati ir tukšs rādītājs sarežģītas struktūras pārvaldīšanai.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Pirms jebkuras citas darbības ir svarīgi iegūt konfigurācijas rādītāju

Konfigurācijas konfigurācija = *(Configuration *) c.data;

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

Serial.println (c.status.code);

getConfiguration un setConfiguration

Pirmā metode ir getConfiguration, to varat izmantot, lai atgūtu visus ierīcē saglabātos datus.

ResponseStructContainer getConfiguration ();

Šeit ir lietošanas piemērs.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Pirms jebkuras citas darbības ir svarīgi iegūt konfigurācijas rādītāju

Konfigurācijas konfigurācija = *(Configuration *) c.data;

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

Serial.println (c.status.code);

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

Konfigurācijas struktūrā ir visi iestatījumu dati, un es pievienoju funkciju sēriju, lai iegūtu visu atsevišķu datu aprakstu.

konfigurācija. ADDL = 0x0; // Adreses konfigurācijas pirmā daļa. ADDH = 0x1; // Adreses konfigurācijas otrā daļa. CHAN = 0x19; // Kanāla konfigurācija. OPTION.fec = FEC_0_OFF; // Pārsūtīt kļūdu labošanas slēdža konfigurāciju. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // Pārraides režīma konfigurācija. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // Pull-up pārvaldības konfigurācija. OPTION.transmissionPower = POWER_17; // dBm pārraides jaudas konfigurācija. OPTION.wirelessWakeupTime = WAKE_UP_1250; // Pagaidiet modināšanas konfigurācijas gaidīšanas laiku. SPED.airDataRate = AIR_DATA_RATE_011_48; // Gaisa datu pārraides ātruma konfigurācija. SPED.uartBaudRate = UART_BPS_115200; // Sakaru pārraides ātruma konfigurācija. SPED.uartParity = MODE_00_8N1; // Paritātes bits

Lai iegūtu visu aprakstu, jums ir līdzvērtīga funkcija visiem atribūtiem:

Sērijas nospiedums (F ("Chan:")); Serial.print (konfigurācija. 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 ());

Tādā pašā veidā setConfiguration vēlas konfigurēt konfigurāciju, tāpēc es domāju, ka labāks veids, kā pārvaldīt konfigurāciju, ir izgūt pašreizējo, piemērot vienīgās nepieciešamās izmaiņas un iestatīt to vēlreiz.

ResponseStatus setConfiguration (konfigurācijas konfigurācija, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

Konfigurācija ir iepriekš redzamā, parādīt, SaveType atļauj jums izvēlēties, ja izmaiņas tiek veiktas tikai pašreizējai sesijai.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Pirms visām citām darbībām ir svarīgi iegūt konfigurācijas rādītāju Configuration configuration = *(Configuration *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfigurācija); konfigurācija. ADDL = 0x0; konfigurācija. ADDH = 0x1; konfigurācija. 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; // Iestatītā konfigurācija ir mainīta un iestatīts neturēt konfigurāciju ResponseStatus rs = e32ttl100.setConfiguration (konfigurācija, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfigurācija);

Visi parametri tiek pārvaldīti kā nemainīgi:

10. darbība: pamata konfigurācijas opcija

Pamata konfigurācijas opcija
Pamata konfigurācijas opcija

11. darbība: nosūtiet saņemšanas ziņojumu

Vispirms mums jāievieš vienkārša, bet noderīga metode, lai pārbaudītu, vai kaut kas ir saņēmēja buferī

int pieejams ();

Tas vienkārši atgriež, cik baitu jums ir pašreizējā straumē.

12. solis: normāls pārraides režīms

Normāls pārraides režīms
Normāls pārraides režīms

Parasto/caurspīdīgo pārraides režīmu izmanto, lai nosūtītu ziņas uz visām ierīcēm ar vienu un to pašu adresi un kanālu.

Ziņu nosūtīšanai/saņemšanai ir daudz veidu, mēs detalizēti paskaidrosim:

ResponseStatus sendMessage (konstanta virknes ziņojums);

ResponseContainer ReceiveMessage ();

Pirmā metode ir sendMessage, un to izmanto, lai nosūtītu virkni uz ierīci normālā režīmā.

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

Otra ierīce vienkārši veic cilpu

ja (e32ttl.available ()> 1) {ResponseContainer rs = e32ttl.receptMessage (); String message = rs.data; // Vispirms iegūstiet datus Serial.println (rs.status.getResponseDescription ()); Serial.println (ziņojums); }

13. darbība: pārvaldiet struktūru

Ja vēlaties nosūtīt sarežģītu struktūru, varat izmantot šo metodi

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

To izmanto, lai nosūtītu strucutre, piemēram:

struktūra Messaggione {char tips [5]; char ziņojums [8]; bool mitico; }; struktūra Messaggione messaggione = {"TEMP", "Peple", true}; ResponseStatus rs = e32ttl.sendMessage (& messaggione, sizeof (Messaggione)); Serial.println (rs.getResponseDescription ());

un otrā pusē jūs varat saņemt ziņu tā

ResponseStructContainer rsc = e32ttl.receptMessage (sizeof (Messaggione)); struk Messaggione messaggione = *(Messaggione *) rsc.data; Serial.println (ziņojumapmaiņas ziņojums); Serial.println (messaggione.mitico);

Izlasiet daļēju struktūru

Ja vēlaties izlasīt ziņojuma pirmo daļu, lai pārvaldītu vairāk veidņu, varat izmantot šo metodi.

ResponseContainer ReceiveInitialMessage (const uint8_t size);

Es to izveidoju, lai saņemtu virkni ar tipu vai citu, lai identificētu ielādējamo struktūru.

structure Ziņapmaiņa {// Daļēja strucutre bez rakstzīmju ziņojuma [8]; bool mitico; }; char tips [5]; // struktūras pirmā daļa ResponseContainer rs = e32ttl.receptInitialMessage (sizeof (tips)); // Ievietojiet virkni char masīvā (nav nepieciešams) memcpy (type, rs.data.c_str (), sizeof (type)); Serial.println ("LASĪT TIPU:"); Serial.println (rs.status.getResponseDescription ()); Serial.println (tips); // Lasīt pārējo struktūru ResponseStructContainer rsc = e32ttl.receptMessage (sizeof (Messaggione)); struktūra Messaggione messaggione = *(Messaggione *) rsc.data;

14. darbība. Fiksētais režīms normālā režīma vietā

Tādā pašā veidā es izveidoju metožu kopu, ko izmantot ar fiksētu pārraidi

Fiksēta transmisija

Jums ir jāmaina tikai nosūtīšanas metode, jo mērķa ierīce nesaņem preambulu ar adreses un kanāla quando settato il fiksēto režīmu.

Tātad jums ir String ziņojums

ResponseStatus sendFixedMessage (baits ADDL, baits ADDH, baits CHAN, konst String ziņojums); ResponseStatus sendBroadcastFixedMessage (baits CHAN, const String ziņojums);

un jūsu struktūrai

ResponseStatus sendFixedMessage (baits ADDL, baits ADDH, baits CHAN, const void *ziņojums, const uint8_t lielums); ResponseStatus sendBroadcastFixedMessage (baits CHAN, const void *ziņojums, const uint8_t lielums);

Šeit vienkāršs piemērs

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

Fiksētajai pārraidei ir vairāk scenāriju

Ja sūtāt uz noteiktu ierīci (otrais scenārijs Fiksētā pārraide), jums ir jāpievieno ADDL, ADDH un CHAN, lai to tieši identificētu.

ResponseStatus rs = e32ttl.sendFixedMessage (2, 2, 0x17, "Ziņojums ierīcei");

Ja vēlaties nosūtīt ziņojumu uz visām ierīcēm noteiktā kanālā, varat izmantot šo metodi.

ResponseStatus rs = e32ttl.sendBroadcastFixedMessage (0x17, "Ziņojums kanāla ierīcēm");

Ja vēlaties saņemt visus apraides ziņojumus tīklā, ADDH un ADDL ir jāiestata ar BROADCAST_ADDRESS.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Pirms visām citām darbībām ir svarīgi iegūt konfigurācijas rādītāju Configuration configuration = *(Configuration *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfigurācija); konfigurācija. ADDL = BROADCAST_ADDRESS; konfigurācija. ADDH = BROADCAST_ADDRESS; // Iestatītā konfigurācija ir mainīta un iestatīts neturēt konfigurāciju ResponseStatus rs = e32ttl100.setConfiguration (konfigurācija, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfigurācija);

15. solis: Paldies

Tagad jums ir visa informācija, lai veiktu savu darbu, taču, manuprāt, ir svarīgi parādīt dažus reālus piemērus, lai labāk izprastu visas iespējas.

  1. LoRa E32 ierīce Arduino, esp32 vai esp8266: iestatījumi un pamata lietojums
  2. LoRa E32 ierīce Arduino, esp32 vai esp8266: bibliotēka
  3. LoRa E32 ierīce Arduino, esp32 vai esp8266: konfigurācija
  4. LoRa E32 ierīce Arduino, esp32 vai esp8266: fiksēta pārraide
  5. LoRa E32 ierīce Arduino, esp32 vai esp8266: enerģijas taupīšana un strukturētu datu sūtīšana

Ieteicams: