Obsah:

Bezdrôtová komunikácia LoRa 3 km až 8 km s nízkymi nákladmi na zariadenie E32 (sx1278/sx1276) pre Arduino, Esp8266 alebo Esp32: 15 krokov
Bezdrôtová komunikácia LoRa 3 km až 8 km s nízkymi nákladmi na zariadenie E32 (sx1278/sx1276) pre Arduino, Esp8266 alebo Esp32: 15 krokov

Video: Bezdrôtová komunikácia LoRa 3 km až 8 km s nízkymi nákladmi na zariadenie E32 (sx1278/sx1276) pre Arduino, Esp8266 alebo Esp32: 15 krokov

Video: Bezdrôtová komunikácia LoRa 3 km až 8 km s nízkymi nákladmi na zariadenie E32 (sx1278/sx1276) pre Arduino, Esp8266 alebo Esp32: 15 krokov
Video: Обзор и конфигурация модуля EBYTE LoRa 2024, Júl
Anonim
Bezdrôtová komunikácia LoRa 3 km až 8 km s nízkymi nákladmi na zariadenie E32 (sx1278/sx1276) pre Arduino, Esp8266 alebo Esp32
Bezdrôtová komunikácia LoRa 3 km až 8 km s nízkymi nákladmi na zariadenie E32 (sx1278/sx1276) pre Arduino, Esp8266 alebo Esp32

Vytváram knižnicu na správu EBYTE E32 na základe série Semtech zariadení LoRa, veľmi výkonného, jednoduchého a lacného zariadenia.

Verziu 3 km nájdete tu, verziu 8 km tu

Môžu pracovať na vzdialenosť 3 000 až 8 000 metrov a majú veľa funkcií a parametrov. Vytvoril som preto túto knižnicu, aby som zjednodušil používanie.

Je to riešenie na získavanie údajov z metropolitných senzorov alebo na ovládanie dronov.

Zásoby

Arduino UNO

Wemos D1 mini

Verzia LoRa E32 TTL 100 3 km

Verzia LoRa E32 TTL 1W 8Km

Krok 1: Knižnica

Knižnica
Knižnica

Moju knižnicu nájdete tu.

Stiahnuť.

Kliknite na tlačidlo STIAHNUTIE v pravom hornom rohu, premenujte nekomprimovaný priečinok LoRa_E32.

Skontrolujte, či priečinok LoRa_E32 obsahuje LoRa_E32.cpp a LoRa_E32.h.

Umiestnite priečinok knižnice LoRa_E32 do priečinka / libraries /. Ak je to vaša prvá knižnica, možno budete musieť vytvoriť podpriečinok knižníc.

Reštartujte IDE.

Krok 2: Pinout

Pinout
Pinout
Pinout
Pinout
Pinout
Pinout

Ako vidíte, pomocou kolíkov M0 a M1 môžete nastaviť rôzne režimy.

Existuje niekoľko pinov, ktoré je možné použiť staticky, ale ak ich pripojíte k mikrokontroléru a nakonfigurujete ich v knižnici, získate výkon a pomocou softvéru môžete ovládať všetky režimy, ale ďalej to vysvetlíme lepšie.

Krok 3: Pin AUX

AUX pin
AUX pin
AUX pin
AUX pin
AUX pin
AUX pin

Ako som už povedal Nie je dôležité pripojiť všetky kolíky k výstupu mikrokontroléra, piny M0 a M1 môžete prepnúť na HIGH alebo LOW, aby ste získali požadovanú konfiguráciu, a ak nepripojíte AUX, knižnica nastaví primerané oneskorenie, aby ste si boli istí. že operácia je dokončená.

AUX pin

Pri prenose údajov je možné použiť na prebudenie externého MCU a návrat HIGH po dokončení prenosu údajov.

Pri príjme AUX bude NÍZKY a vráti HIGH, keď je vyrovnávacia pamäť prázdna.

Používa sa tiež na samokontrolu na obnovenie normálnej prevádzky (v režime zapnutia a režimu spánku/programu).

Krok 4: Plne prepojená schéma Esp8266

Plne prepojená schéma Esp8266
Plne prepojená schéma Esp8266
Plne prepojená schéma Esp8266
Plne prepojená schéma Esp8266

Schéma pripojenia esp8266 je jednoduchšia, pretože funguje na rovnakom napätí logickej komunikácie (3,3 V).

Na dosiahnutie dobrej stability je dôležité pridať výsuvný odpor (4, 7Kohm).

Krok 5: Plne prepojená schéma Arduino

Plne prepojená schéma Arduino
Plne prepojená schéma Arduino
Plne prepojená schéma Arduino
Plne prepojená schéma Arduino

Pracovné napätie Arduino je 5v, preto musíme pridať delič napätia na vývody RX M0 a M1 modulu LoRa, aby sme predišli poškodeniu, viac informácií získate tu Delič napätia: kalkulačka a aplikácia.

Môžete použiť odpor 2Kohm na GND a 1Kohm zo signálu, ako dohromady na RX.

Krok 6: Knižnica: Konštruktor

Vytvoril som súbor pomerne početných konštruktérov, pretože môžeme mať viac možností a situácií, ktoré je možné zvládnuť.

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

Prvá sada konštruktorov je vytvorená na delegovanie správy sériových a iných pinov do knižnice.

rxPin a txPin sú kolíky na pripojenie k UART a sú povinné.

auxPin je pin, ktorý kontroluje stav prevádzky, prenosu a príjmu (ďalej to vysvetlíme lepšie). Tento pin Nie je povinný, ak ho nenastavíte, použijem oneskorenie, aby sa operácia mohla dokončiť sama (s latenciou).

m0pin a m1Pin sú kolíky na zmenu režimu REŽIM (pozri tabuľku vyššie), myslím si, že tieto piny vo „výrobe“sa budú spájať priamo VYSOKO alebo NÍZKO, ale na testovanie sú účelne spravované knižnicou.

bpsRate je prúd softvérového servera, ktorý je bežne 9600 (jediná prenosová rýchlosť v režime programmin/spánok)

Jednoduchým príkladom je

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

Môžeme priamo použiť SoftwareSerial s iným konštruktérom

LoRa_E32 (HardwareSerial* sériový, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (HardwareSerial* sériový, bajtový auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (HardwareSerial* sériový, bajt auxPin, bajt m0Pin, bajt m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

Príklad hore s týmto konštruktorom môže byť taký.

#include #include "LoRa_E32.h"

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

LoRa_E32 e32ttl100 (& mySerial);

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

Posledná sada konštruktorov je povolenie používať HardwareSerial namiesto SoftwareSerial.

LoRa_E32 (SoftwareSerial* sériový, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (SoftwareSerial* sériový, bajtový auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (SoftwareSerial* sériový, bajt auxPin, bajt m0Pin, bajt m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

Krok 7: Začnite

Príkaz begin sa používa na spustenie sériového portu a pinov vo vstupnom a výstupnom režime.

neplatné začať ();

v exekúcii je

// Spustite všetky piny a UART

e32ttl100.begin ();

Krok 8: Metóda konfigurácie a informácií

Existuje súbor spôsobov správy konfigurácie a získavania informácií o zariadení.

ResponseStructContainer getConfiguration ();

ResponseStatus setConfiguration (Konfigurácia konfigurácie, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

ResponseStructContainer getModuleInformation ();

void printParameters (konfigurácia konfigurácie štruktúry);

ResponseStatus resetModule ();

Krok 9: Kontajner odpovede

Na zjednodušenie správy odpovedí vytváram sadu kontajnerov, ktoré sú pre mňa veľmi užitočné na správu chýb a vracanie generických údajov.

Status reakcie

Toto je stavový kontajner s dvoma jednoduchými vstupnými bodmi, pomocou ktorých môžete získať stavový kód a popis stavového kódu

Serial.println (c.getResponseDescription ()); // Popis kódu

Serial.println (c.code); // 1 ak úspech

Kódy sú

ÚSPECH = 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

Tento kontajner je vytvorený na správu reakcie reťazca a má 2 vstupné body.

údaje s reťazcom vráteným zo správy a stav inštancie RepsonseStatus.

ResponseContainer rs = e32ttl.receiveMessage ();

Reťazcová správa = rs.data;

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

Serial.println (správa);

ResponseStructContainer

Toto je „komplexnejší“kontajner, ktorý používam na správu štruktúry. Má rovnaký vstupný bod ako ResponseContainer, ale údaje sú prázdnym ukazovateľom na správu komplexnej štruktúry.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Pred všetkými ostatnými operáciami je dôležité získať ukazovateľ konfigurácie

Konfigurácia konfigurácie = *(Konfigurácia *) c.data;

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

Serial.println (c.status.code);

getConfiguration a setConfiguration

Prvá metóda je getConfiguration, pomocou ktorej môžete získať všetky údaje uložené v zariadení.

ResponseStructContainer getConfiguration ();

Tu je príklad použitia.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Pred všetkými ostatnými operáciami je dôležité získať ukazovateľ konfigurácie

Konfigurácia konfigurácie = *(Konfigurácia *) c.data;

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

Serial.println (c.status.code);

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

Štruktúra konfigurácie obsahuje všetky údaje o nastaveniach a pridávam sériu funkcií, aby som získal popis jednotlivých údajov.

configuration. ADDL = 0x0; // Prvá časť addressconfiguration. ADDH = 0x1; // Druhá časť konfigurácie adresy. CHAN = 0x19; // Konfigurácia kanála. OPTION.fec = FEC_0_OFF; // Konfigurácia prepínača korekcie chýb vpred. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // konfigurácia režimu prenosu. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // Konfigurácia správy vyťahovania. OPTION.transmissionPower = POWER_17; // Konfigurácia vysielacieho výkonu dBm. OPTION.wirelessWakeupTime = WAKE_UP_1250; // Čas čakania na konfiguráciu prebudenia. SPED.airDataRate = AIR_DATA_RATE_011_48; // konfigurácia rýchlosti prenosu dát. SPED.uartBaudRate = UART_BPS_115200; // konfigurácia prenosovej rýchlosti komunikácie. SPED.uartParity = MODE_00_8N1; // Paritný bit

Na získanie všetkého popisu máte ekvivalentnú funkciu pre všetky atribúty:

Serial.print (F ("Chan:")); Serial.print (konfigurácia. 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 ());

Rovnako tak setConfiguration chce konfiguráciu Strucutre, takže si myslím, že lepší spôsob, ako spravovať konfiguráciu, je načítať aktuálnu, použiť jedinú potrebnú zmenu a znova ju nastaviť.

ResponseStatus setConfiguration (Konfigurácia konfigurácie, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

konfigurácia je pôvodne ukázaná, saveType vám povoľuje výber, ak sa zmena stane natrvalo iba pre aktuálnu reláciu.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Je dôležité získať konfiguračný ukazovateľ pred všetkými ostatnými operáciami Konfigurácia konfigurácie = *(Konfigurácia *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfigurácia); configuration. ADDL = 0x0; konfigurácia. ADDH = 0x1; konfigurácia. 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; // Nastavená konfigurácia zmenená a nastavená tak, aby konfiguráciu neponechávala ResponseStatus rs = e32ttl100.setConfiguration (konfigurácia, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfigurácia);

Všetky tieto parametre sú spravované ako konštantné:

Krok 10: Základná možnosť konfigurácie

Základná možnosť konfigurácie
Základná možnosť konfigurácie

Krok 11: Odoslať správu na prijatie

Najprv musíme zaviesť jednoduchú, ale užitočnú metódu na kontrolu, či sa niečo nenachádza v prijímacej vyrovnávacej pamäti

int dostupný ();

Jednoducho sa vráti, koľko bajtov máte v aktuálnom streame.

Krok 12: Normálny režim prenosu

Normálny režim prenosu
Normálny režim prenosu

Režim normálneho/transparentného prenosu sa používa na odosielanie správ na všetky zariadenia s rovnakou adresou a rovnakým kanálom.

Existuje mnoho spôsobov odosielania/prijímania správ, ktoré podrobne vysvetlíme:

ResponseStatus sendMessage (konštantná reťazcová správa);

ResponseContainer receiveMessage ();

Prvá metóda je sendMessage a používa sa na odoslanie reťazca do zariadenia v normálnom režime.

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

Druhé zariadenie jednoducho urobí na slučke

if (e32ttl.available ()> 1) {ResponseContainer rs = e32ttl.receiveMessage (); Reťazcová správa = rs.data; // Vôbec prvé získanie údajov Serial.println (rs.status.getResponseDescription ()); Serial.println (správa); }

Krok 13: Správa štruktúry

Ak chcete odoslať komplexnú štruktúru, môžete použiť túto metódu

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

Používa sa na odosielanie strucutre, napríklad:

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

a na druhej strane môžete správu dostať tak

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

Prečítajte si čiastočnú skratku

Ak chcete, aby si prvá časť správy mohla prečítať viac typov štruktúr, môžete použiť túto metódu.

ResponseContainer receiveInitialMessage (konšt. Veľkosť uint8_t);

Vytvorím ho na prijatie reťazca typu alebo iného na identifikáciu štruktúry, ktorá sa má načítať.

struct Messaggione {// Čiastočný strucutre bez správy typechar [8]; bool mitico; }; typ znaku [5]; // prvá časť štruktúry ResponseContainer rs = e32ttl.receiveInitialMessage (sizeof (typ)); // Vložte reťazec do poľa char (nie je potrebné) memcpy (typ, rs.data.c_str (), sizeof (typ)); Serial.println ("READ TYPE:"); Serial.println (rs.status.getResponseDescription ()); Serial.println (typ); // Prečítajte si zvyšok štruktúry ResponseStructContainer rsc = e32ttl.receiveMessage (sizeof (Messaggione)); struct Messaggione messaggione = *(Messaggione *) rsc.data;

Krok 14: Opravený režim namiesto normálneho režimu

Rovnakým spôsobom vytvorím sadu metód na použitie s pevným prenosom

Opravený prenos

Musíte zmeniť iba spôsob odosielania, pretože cieľové zariadenie nedostane preambulu s pevným režimom adries a kanálov.

Takže pre reťazcovú správu máte

ResponseStatus sendFixedMessage (byte ADDL, byte ADDH, byte CHAN, const String správa); ResponseStatus sendBroadcastFixedMessage (byte CHAN, const String správa);

a pre štruktúru, ktorú máte

ResponseStatus sendFixedMessage (bajt ADDL, bajt ADDH, bajt CHAN, const void *správa, veľkosť uint8_t); ResponseStatus sendBroadcastFixedMessage (bajt CHAN, správa const void *, veľkosť uint8_t);

Tu je jednoduchý príklad

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

Pevný prenos má viac scenárov

Ak odosielate na konkrétne zariadenie (druhý scenár Pevný prenos), musíte pridať ADDL, ADDH a CHAN, aby ste ho mohli priamo identifikovať.

ResponseStatus rs = e32ttl.sendFixedMessage (2, 2, 0x17, „Správa do zariadenia“);

Ak chcete odoslať správu na všetky zariadenia v určenom kanáli, môžete použiť túto metódu.

ResponseStatus rs = e32ttl.sendBroadcastFixedMessage (0x17, „Správa pre zariadenia kanála“);

Ak chcete prijímať všetky vysielané správy v sieti, musíte nastaviť ADDH a ADDL na BROADCAST_ADDRESS.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Je dôležité získať konfiguračný ukazovateľ pred všetkými ostatnými operáciami Konfigurácia konfigurácie = *(Konfigurácia *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfigurácia); configuration. ADDL = BROADCAST_ADDRESS; configuration. ADDH = BROADCAST_ADDRESS; // Nastavená konfigurácia zmenená a nastavená tak, aby konfiguráciu neponechávala ResponseStatus rs = e32ttl100.setConfiguration (konfigurácia, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfigurácia);

Krok 15: Ďakujem

Teraz máte všetky informácie potrebné na vykonanie práce, ale myslím si, že je dôležité ukázať niekoľko realistických príkladov, aby ste lepšie porozumeli všetkým možnostiam.

  1. Zariadenie LoRa E32 pre Arduino, esp32 alebo esp8266: nastavenia a základné použitie
  2. Zariadenie LoRa E32 pre Arduino, esp32 alebo esp8266: knižnica
  3. Zariadenie LoRa E32 pre Arduino, esp32 alebo esp8266: konfigurácia
  4. Zariadenie LoRa E32 pre Arduino, esp32 alebo esp8266: pevný prenos
  5. Zariadenie LoRa E32 pre Arduino, esp32 alebo esp8266: úspora energie a odosielanie štruktúrovaných dát

Odporúča: