Sisällysluettelo:

LoRa 3–8 km: n langaton tiedonsiirto edullisilla E32 -laitteilla (sx1278/sx1276) Arduino-, Esp8266- tai Esp32 -laitteille: 15 vaihetta
LoRa 3–8 km: n langaton tiedonsiirto edullisilla E32 -laitteilla (sx1278/sx1276) Arduino-, Esp8266- tai Esp32 -laitteille: 15 vaihetta

Video: LoRa 3–8 km: n langaton tiedonsiirto edullisilla E32 -laitteilla (sx1278/sx1276) Arduino-, Esp8266- tai Esp32 -laitteille: 15 vaihetta

Video: LoRa 3–8 km: n langaton tiedonsiirto edullisilla E32 -laitteilla (sx1278/sx1276) Arduino-, Esp8266- tai Esp32 -laitteille: 15 vaihetta
Video: NRF905 433868915MHz Wireless Module w Antenna - Green (2.7~3.3V) 2024, Marraskuu
Anonim
LoRa 3–8 km: n langaton tiedonsiirto edullisilla E32 (sx1278/sx1276) -laitteilla Arduinolle, Esp8266: lle tai Esp32: lle
LoRa 3–8 km: n langaton tiedonsiirto edullisilla E32 (sx1278/sx1276) -laitteilla Arduinolle, Esp8266: lle tai Esp32: lle

Luon kirjaston EBYTE E32: n hallintaan perustuen LoRa -laitteen Semtech -sarjaan, joka on erittäin tehokas, yksinkertainen ja halpa laite.

Löydät 3 km: n version täältä, 8 km: n version täältä

Ne voivat työskennellä 3000–8000 metrin etäisyydellä, ja niillä on paljon ominaisuuksia ja parametreja. Joten luon tämän kirjaston käytön yksinkertaistamiseksi.

Se on ratkaisu tietojen hakuun pääkaupunkiseudun antureista tai dronin hallintaan.

Tarvikkeet

Arduino UNO

Wemos D1 mini

LoRa E32 TTL 100 3Km versio

LoRa E32 TTL 1W 8Km versio

Vaihe 1: Kirjasto

Kirjasto
Kirjasto

Kirjastoni löydät täältä.

Ladata.

Napsauta LATAA -painiketta oikeassa yläkulmassa ja nimeä pakkaamaton kansio uudelleen LoRa_E32.

Tarkista, että LoRa_E32 -kansio sisältää LoRa_E32.cpp ja LoRa_E32.h.

Aseta LoRa_E32 -kirjastokansio / libraries / kansio. Sinun on ehkä luotava kirjastojen alikansio, jos se on ensimmäinen kirjasto.

Käynnistä IDE uudelleen.

Vaihe 2: Pinout

Sokka irti
Sokka irti
Sokka irti
Sokka irti
Sokka irti
Sokka irti

Kuten näet, voit asettaa erilaisia tiloja M0- ja M1 -nastojen kautta.

Joitakin nastoja voidaan käyttää staattisella tavalla, mutta jos liität sen mikrokontrolleriin ja määrität ne kirjastossa, saat suorituskykyä ja voit hallita kaikkia tiloja ohjelmiston avulla, mutta aiomme selittää paremmin seuraavaksi.

Vaihe 3: AUX -nasta

AUX -nasta
AUX -nasta
AUX -nasta
AUX -nasta
AUX -nasta
AUX -nasta

Kuten jo sanon, ei ole tärkeää liittää kaikkia nastaja mikrokontrollerin lähtöön, voit laittaa M0- ja M1 -nastat HIGH- tai LOW -asentoon, jotta saat halutun kokoonpanon, ja jos et liitä AUX: ta, kirjasto asettaa kohtuullisen viiveen varmistaaksesi, että että toimenpide on valmis.

AUX -nasta

Lähetettäessä dataa voidaan käyttää ulkoisen MCU: n herättämiseen ja palauttamiseen HIGH tiedonsiirron päätyttyä.

Vastaanotettaessa AUX -toimintoa MATALA ja palaa KORKEA, kun puskuri on tyhjä.

Sitä käytetään myös itsetarkistukseen normaalin toiminnan palauttamiseksi (käynnistettäessä ja lepotilassa/ohjelmointitilassa).

Vaihe 4: Täysin yhdistetty malli Esp8266

Täysin yhdistetty kaava Esp8266
Täysin yhdistetty kaava Esp8266
Täysin yhdistetty kaava Esp8266
Täysin yhdistetty kaava Esp8266

esp8266 -kytkentäkaavio on yksinkertaisempi, koska se toimii samalla loogisen viestinnän jännitteellä (3.3v).

On tärkeää lisätä vetovastus (4, 7Kohm) hyvän vakauden saavuttamiseksi.

Vaihe 5: Täysin yhdistetty skeema Arduino

Täysin yhdistetty skeema Arduino
Täysin yhdistetty skeema Arduino
Täysin yhdistetty skeema Arduino
Täysin yhdistetty skeema Arduino

Arduinon käyttöjännite on 5 V, joten meidän on lisättävä jännitteenjakaja LoRa -moduulin RX -nastalle M0 ja M1 vaurioiden estämiseksi, saat lisätietoja täältä Jännitteenjakaja: laskin ja sovellus.

Voit käyttää 2Kohmin vastusta GND: hen ja 1Kohm signaalista kuin koota RX: ssä.

Vaihe 6: Kirjasto: Rakentaja

Tein joukon melkoisia rakentajia, koska meillä voi olla enemmän vaihtoehtoja ja tilanteita hallittavaksi.

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

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

Ensimmäinen joukko konstruktoreita luodaan siirtämään sarja- ja muiden nastojen hallinta kirjastoon.

rxPin ja txPin ovat UART -yhteyden muodostustappi, ja ne ovat pakollisia.

auxPin on nasta, joka tarkistaa toiminnan, lähetyksen ja vastaanoton tilan (aiomme selittää paremmin seuraavaksi), että pin Se ei ole pakollista, jos et määritä sitä, käytän viivettä, jotta toiminto voi suorittaa itsensä loppuun (viiveellä).

m0pin ja m1Pin ovat tapoja muuttaa toimintatilaa (katso taulukon yläosa), luulen, että nämä "tuotannon" nastat yhdistävät suoraan HIGH tai LOW, mutta testin vuoksi ne ovat hyödyllisiä kirjaston hallinnassa.

bpsRate on SoftwareSerialin boudraatti normaalisti 9600 (ainoa tiedonsiirtonopeus programmin/lepotilassa)

Yksinkertainen esimerkki on

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

Voimme käyttää SoftwareSerialia suoraan toisen valmistajan kanssa

LoRa_E32 (HardwareSerial* -sarja, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (HardwareSerial* -sarja, tavu auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (HardwareSerial* -sarja, tavu auxPin, tavu m0Pin, tavu m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

Ylempi esimerkki tällä konstruktorilla voi tehdä näin.

#Sisällytä #Sisällytä "LoRa_E32.h"

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

LoRa_E32 e32ttl100 (& mySerial);

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

Viimeinen rakentajajoukko sallii HardwareSerialin käytön SoftwareSerialin sijaan.

LoRa_E32 (SoftwareSerial* -sarja, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (SoftwareSerial* -sarja, tavu auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (SoftwareSerial* -sarja, tavu auxPin, tavu m0Pin, tavu m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

Vaihe 7: Aloita

Käynnistyskomentoa käytetään sarja- ja nastien käynnistämiseen tulo- ja tulostustilassa.

mitätön alku ();

toteutuksessa on

// Käynnistä kaikki nastat ja UART

e32ttl100.begin ();

Vaihe 8: Kokoonpano- ja tietomenetelmä

Siellä on joukko menetelmiä kokoonpanon hallintaan ja laitteen tietojen hankkimiseen.

ResponseStructContainer getConfiguration ();

ResponseStatus setConfiguration (Kokoonpanomääritykset, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

ResponseStructContainer getModuleInformation ();

void printParameters (strukturointiasetusten määritys);

ResponseStatus resetModule ();

Vaihe 9: Vastaussäiliö

Vastauksen hallinnan yksinkertaistamiseksi luon säilön, joka on erittäin hyödyllinen virheiden hallintaan ja yleisten tietojen palauttamiseen.

ResponseStatus

Tämä on tilasäiliö ja siinä on 2 yksinkertaista syöttöpistettä, joiden avulla saat tilakoodin ja tilakoodin kuvauksen

Serial.println (c.getResponseDescription ()); // Koodin kuvaus

Serial.println (c.code); // 1 jos menestys

Koodit ovat

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

Tämä säilö on luotu hallitsemaan merkkijonovastausta ja sillä on kaksi syöttöpistettä.

tiedot, joiden merkkijono on palautettu viestistä ja tilasta, RepsonseStatus -ilmentymä.

ResponseContainer rs = e32ttl.receptMessage ();

Merkkijonoviesti = rs.data;

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

Serial.println (viesti);

ResponseStructContainer

Tämä on "monimutkaisempi" säilö, käytän tätä rakenteen hallintaan, sillä on sama ResponseContainerin aloituspiste, mutta data on tyhjä osoitin monimutkaisen rakenteen hallintaan.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // On tärkeää saada määritysosoitin ennen kaikkia muita toimintoja

Kokoonpanon määritykset = *(Kokoonpano *) c.data;

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

Serial.println (c.status.code);

getConfiguration ja setConfiguration

Ensimmäinen menetelmä on getConfiguration, jonka avulla voit hakea kaikki laitteelle tallennetut tiedot.

ResponseStructContainer getConfiguration ();

Tässä esimerkki käytöstä.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // On tärkeää saada määritysosoitin ennen kaikkia muita toimintoja

Kokoonpanon määritykset = *(Kokoonpano *) c.data;

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

Serial.println (c.status.code);

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

Kokoonpanon rakenteessa on kaikki asetustiedot, ja lisään sarjan toimintoja, jotta saan kaiken yksittäisten tietojen kuvauksen.

kokoonpano. ADDL = 0x0; // Osoiteasetusten ensimmäinen osa. ADDH = 0x1; // Osoitekokoonpanon toinen osa. CHAN = 0x19; // Kanavan määritys. OPTION.fec = FEC_0_OFF; // Välitä virheenkorjauskytkimen kokoonpano. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // Lähetystilan määritys. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // Pull-up-hallintamääritykset. OPTION.transmissionPower = POWER_17; // dBm lähetystehon kokoonpano. OPTION.wirelessWakeupTime = WAKE_UP_1250; // Odota heräämiskonfigurointia. SPED.airDataRate = AIR_DATA_RATE_011_48; // Ilmavirran määritys. SPED.uartBaudRate = UART_BPS_115200; // Tiedonsiirtonopeuden määritys. SPED.uartParity = MODE_00_8N1; // Pariteettibitti

Sinulla on vastaava toiminto kaikille määritteille saadaksesi kaikki kuvaukset:

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

Samalla tavalla setConfiguration haluaa kokoonpanorakenteen, joten mielestäni parempi tapa hallita kokoonpanoa on hakea nykyinen, soveltaa vain tarvitsemasi muutos ja asettaa se uudelleen.

ResponseStatus setConfiguration (Kokoonpanon määritys, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

kokoonpano on näytetty aiemmin, SaveType sallii sinun valita, jos muutos tulee pysyvästi vain nykyiselle istunnolle.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // On tärkeää saada määritysosoitin ennen kaikkia muita toimintoja Configuration configuration = *(Configuration *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (kokoonpano); kokoonpano. ADDL = 0x0; ADDH = 0x1; kokoonpano. 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; // Määritä asetuksia muutettuna ja aseta olemaan pitämättä kokoonpanoa ResponseStatus rs = e32ttl100.setConfiguration (kokoonpano, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (kokoonpano);

Kaikkia parametreja hallitaan vakiona:

Vaihe 10: Perusasetukset

Perusasetukset
Perusasetukset

Vaihe 11: Lähetä vastaanottoviesti

Ensin meidän on otettava käyttöön yksinkertainen mutta hyödyllinen tapa tarkistaa, onko jotain vastaanottopuskurissa

int saatavilla ();

Se yksinkertaisesti palauttaa, kuinka monta tavua sinulla on nykyisessä streamissa.

Vaihe 12: Normaali lähetystila

Normaali lähetystila
Normaali lähetystila

Normaali/Läpinäkyvä lähetystapaa käytetään viestien lähettämiseen kaikkiin laitteisiin, joilla on sama osoite ja kanava.

Viestien lähettämiseen/vastaanottamiseen on monia tapoja, aiomme selittää yksityiskohtaisesti:

ResponseStatus sendMessage (const String -viesti);

ResponseContainer ReceiveMessage ();

Ensimmäinen tapa on sendMessage ja sitä käytetään lähettämään merkkijono laitteelle normaalitilassa.

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

Toinen laite yksinkertaisesti tekee silmukan

jos (e32ttl.available ()> 1) {ResponseContainer rs = e32ttl.receptionMessage (); Merkkijonoviesti = rs.data; // Hanki ensin tiedot Serial.println (rs.status.getResponseDescription ()); Serial.println (viesti); }

Vaihe 13: Hallitse rakennetta

Jos haluat lähettää monimutkaisen rakenteen, voit käyttää tätä menetelmää

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

Sitä käytetään strucutren lähettämiseen, esimerkiksi:

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

ja toisella puolella voit vastaanottaa viestin niin

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

Lue osittainen rakenne

Jos haluat lukea viestin ensimmäisen osan hallitaksesi useampia rakenteita, voit käyttää tätä menetelmää.

ResponseContainer ReceiveInitialMessage (const uint8_t size);

Luon sen vastaanottamaan merkkijonon, jonka tyyppi tai muu tunnistaa ladattavan rakenteen.

strukt Messaggione {// Osittainen rakenne ilman kirjoitusviestiä [8]; bool mitico; }; char -tyyppi [5]; // rakenteen ensimmäinen osa ResponseContainer rs = e32ttl.receptInitialMessage (sizeof (type)); // Laita merkkijono char -taulukkoon (ei tarvita) memcpy (type, rs.data.c_str (), sizeof (type)); Serial.println ("LUE TYYPPI:"); Serial.println (rs.status.getResponseDescription ()); Sarja.println (tyyppi); // Lue muun rakenteen ResponseStructContainer rsc = e32ttl.receptMessage (sizeof (Messaggione)); rakenne Messaggione messaggione = *(Messaggione *) rsc.data;

Vaihe 14: Kiinteä tila normaalitilan sijaan

Samalla tavalla luon joukon menetelmiä käytettäväksi kiinteän lähetyksen kanssa

Kiinteä lähetys

Sinun on muutettava vain lähetystapaa, koska kohdelaite ei vastaanota johdanto -osaa, jossa on kiinteä osoite ja kanava.

Joten String -viestillä

ResponseStatus sendFixedMessage (tavu ADDL, tavu ADDH, tavu CHAN, const String -viesti); ResponseStatus sendBroadcastFixedMessage (tavu CHAN, const String -viesti);

ja rakenteellesi

ResponseStatus sendFixedMessage (tavu ADDL, tavu ADDH, tavu CHAN, const void *viesti, const uint8_t -koko); ResponseStatus sendBroadcastFixedMessage (tavu CHAN, const void *message, const uint8_t size);

Tässä yksinkertainen esimerkki

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

Kiinteässä lähetyksessä on enemmän skenaarioita

Jos lähetät tietylle laitteelle (toinen skenaario Kiinteä lähetys), sinun on lisättävä ADDL, ADDH ja CHAN sen tunnistamiseksi suoraan.

ResponseStatus rs = e32ttl.sendFixedMessage (2, 2, 0x17, "Viesti laitteelle");

Jos haluat lähettää viestin kaikille tietyn kanavan laitteille, voit käyttää tätä menetelmää.

ResponseStatus rs = e32ttl.sendBroadcastFixedMessage (0x17, "Viesti kanavan laitteille");

Jos haluat vastaanottaa kaikki verkon yleislähetysviestit, sinun on asetettava ADDH- ja ADDL -asetukseksi BROADCAST_ADDRESS.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // On tärkeää saada määritysosoitin ennen kaikkia muita toimintoja Configuration configuration = *(Configuration *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (kokoonpano); configuration. ADDL = BROADCAST_ADDRESS; configuration. ADDH = BROADCAST_ADDRESS; // Määritä kokoonpano muuttunut ja aseta olemaan pitämättä kokoonpanoa ResponseStatus rs = e32ttl100.setConfiguration (kokoonpano, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (kokoonpano);

Vaihe 15: Kiitos

Nyt sinulla on kaikki tiedot työn tekemiseen, mutta mielestäni on tärkeää näyttää realistisia esimerkkejä kaikkien mahdollisuuksien ymmärtämiseksi paremmin.

  1. LoRa E32 -laite Arduinolle, esp32 tai esp8266: asetukset ja peruskäyttö
  2. LoRa E32 -laite Arduinolle, esp32 tai esp8266: kirjasto
  3. LoRa E32 -laite Arduinolle, esp32 tai esp8266: kokoonpano
  4. LoRa E32 -laite Arduinolle, esp32 tai esp8266: kiinteä lähetys
  5. LoRa E32 -laite Arduinolle, esp32 tai esp8266: virransäästö ja strukturoidun datan lähettäminen

Suositeltava: