Innholdsfortegnelse:

LoRa 3 km til 8 km trådløs kommunikasjon med lavpris E32 (sx1278/sx1276) enhet for Arduino, Esp8266 eller Esp32: 15 trinn
LoRa 3 km til 8 km trådløs kommunikasjon med lavpris E32 (sx1278/sx1276) enhet for Arduino, Esp8266 eller Esp32: 15 trinn

Video: LoRa 3 km til 8 km trådløs kommunikasjon med lavpris E32 (sx1278/sx1276) enhet for Arduino, Esp8266 eller Esp32: 15 trinn

Video: LoRa 3 km til 8 km trådløs kommunikasjon med lavpris E32 (sx1278/sx1276) enhet for Arduino, Esp8266 eller Esp32: 15 trinn
Video: Lora water meter wireless handheld controller 2024, Juli
Anonim
LoRa 3 km til 8 km trådløs kommunikasjon med lavpris E32 (sx1278/sx1276) enhet for Arduino, Esp8266 eller Esp32
LoRa 3 km til 8 km trådløs kommunikasjon med lavpris E32 (sx1278/sx1276) enhet for Arduino, Esp8266 eller Esp32

Jeg lager et bibliotek for å administrere EBYTE E32 basert på Semtech -serien av LoRa -enheter, veldig kraftig, enkel og billig enhet.

Du finner 3Km versjon her, 8Km versjon her

De kan arbeide over en avstand på 3000m til 8000m, og de har mange funksjoner og parametere. Så jeg lager dette biblioteket for å forenkle bruken.

Det er en løsning for å hente data fra storbyens sensorer eller for å kontrollere drone.

Rekvisita

Arduino UNO

Wemos D1 mini

LoRa E32 TTL 100 3 km versjon

LoRa E32 TTL 1W 8Km versjon

Trinn 1: Bibliotek

Bibliotek
Bibliotek

Du finner biblioteket mitt her.

For å laste ned.

Klikk på DOWNLOADS -knappen øverst til høyre, gi nytt navn til den ukomprimerte mappen LoRa_E32.

Kontroller at LoRa_E32 -mappen inneholder LoRa_E32.cpp og LoRa_E32.h.

Plasser LoRa_E32 bibliotekmappen din / biblioteker / mappen. Du må kanskje opprette undermappen biblioteker hvis det er ditt første bibliotek.

Start IDE på nytt.

Trinn 2: Pinout

Pinout
Pinout
Pinout
Pinout
Pinout
Pinout

Som du kan se kan du stille inn forskjellige moduser via M0 og M1 pins.

Det er noen pins som kan brukes på en statisk måte, men hvis du kobler den til mikrokontrolleren og konfigurerer de i biblioteket får du ytelse, og du kan kontrollere all modus via programvare, men vi skal forklare bedre neste.

Trinn 3: AUX Pin

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

Som jeg allerede sier Det er ikke viktig å koble alle pinnene til utgangen til mikrokontrolleren, kan du sette M0 og M1 pinner til HØY eller LAV for å få ønsket konfigurasjon, og hvis du ikke kobler til AUX, kan biblioteket sette en rimelig forsinkelse for å være sikker at operasjonen er fullført.

AUX -pinne

Når overføring av data kan brukes til å vekke ekstern MCU og returnere HØYT når dataoverføring er ferdig.

Når du mottar AUX, går LOW og returnerer HIGH når bufferen er tom.

Den brukes også til selvkontroll for å gjenopprette normal drift (ved oppstart og hvilemodus/programmodus).

Trinn 4: Fullt tilkoblet skjema Esp8266

Fullt tilkoblet skjema Esp8266
Fullt tilkoblet skjema Esp8266
Fullt tilkoblet skjema Esp8266
Fullt tilkoblet skjema Esp8266

esp8266 tilkoblingsskjema er mer enkelt fordi det fungerer med samme spenning for logisk kommunikasjon (3.3v).

Det er viktig å legge til opptrekksmotstand (4, 7Kohm) for å få god stabilitet.

Trinn 5: Fullt tilkoblet skjema Arduino

Fullt tilkoblet skjema Arduino
Fullt tilkoblet skjema Arduino
Fullt tilkoblet skjema Arduino
Fullt tilkoblet skjema Arduino

Arduino arbeidsspenning er 5v, så vi må legge til en spenningsdeler på RX -pinne M0 og M1 på LoRa -modulen for å forhindre skade, du kan få mer informasjon her Spenningsdeler: kalkulator og applikasjon.

Du kan bruke en 2Kohm -motstand til GND og 1Kohm fra signal enn satt sammen på RX.

Trinn 6: Bibliotek: Konstruktør

Jeg laget et sett med ganske mange konstruktører, fordi vi kan ha flere alternativer og situasjoner å håndtere.

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

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

Det første settet med konstruktører er opprettet for å delegere administrasjonen av Serial og andre pins til biblioteket.

rxPin og txPin er pinnen for å koble til UART, og de er obligatoriske.

auxPin er en pinne som kontrollerer driften, overføringen og mottaksstatusen (vi skal forklare bedre neste), den pinnen Det er ikke obligatorisk, hvis du ikke setter det, bruker jeg en forsinkelse for å tillate operasjonen å fullføre seg selv (med latens).

m0pin og m1Pin er pinnene for å endre driftsmodus (se tabellen øverst), jeg tror at disse pinnene i “produksjon” kommer til å koble direkte til HØY eller LAV, men for test er de nyttig å administrere av biblioteket.

bpsRate er boudrate for SoftwareSerial som normalt er 9600 (den eneste overføringshastigheten i programmin/hvilemodus)

Et enkelt eksempel er

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

Vi kan bruke en SoftwareSerial direkte med en annen konstruktør

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

LoRa_E32 (HardwareSerial* seriell, byte auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (HardwareSerial* seriell, byte auxPin, byte m0Pin, byte m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

Eksemplet øvre med denne konstruktøren kan gjøre slik.

#include #include "LoRa_E32.h"

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

LoRa_E32 e32ttl100 (& mySerial);

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

Det siste settet med konstruktør er å tillate å bruke en HardwareSerial i stedet for SoftwareSerial.

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

LoRa_E32 (SoftwareSerial* seriell, byte auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (SoftwareSerial* seriell, byte auxPin, byte m0Pin, byte m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

Trinn 7: Start

Start -kommandoen brukes til å starte Serial og pins i input- og output -modus.

ugyldig start ();

i utførelse er

// Start alle pins og UART

e32ttl100.begin ();

Trinn 8: Konfigurasjons- og informasjonsmetode

Det er et sett med metoder for å administrere konfigurasjon og få informasjon om enheten.

ResponseStructContainer getConfiguration ();

ResponseStatus setConfiguration (konfigurasjonskonfigurasjon, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

ResponseStructContainer getModuleInformation ();

void printParameters (strukturkonfigurasjonskonfigurasjon);

ResponseStatus resetModule ();

Trinn 9: Svarbeholder

For å forenkle håndteringen av respons lager jeg et sett med containere, for meg veldig nyttig for å håndtere feil og returnere generiske data.

ResponseStatus

Dette er en statusbeholder og har 2 enkle inngangspunkter, med denne kan du få statuskoden og beskrivelsen av statuskoden

Serial.println (c.getResponseDescription ()); // Beskrivelse av kode

Serial.println (c.code); // 1 hvis Suksess

Koden er

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

ResponsContainer

Denne beholderen er opprettet for å administrere strengrespons og ha 2 inngangspunkter.

data med strengen returnerte fra melding og status en forekomst av RepsonseStatus.

ResponseContainer rs = e32ttl.receiveMessage ();

String melding = rs.data;

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

Serial.println (melding);

ResponseStructContainer

Dette er den mer "komplekse" beholderen, jeg bruker denne til å administrere struktur. Den har det samme inngangspunktet for ResponseContainer, men data er en ugyldig peker for å administrere kompleks struktur.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Det er viktig å få konfigurasjonspekeren før all annen operasjon

Konfigurasjonskonfigurasjon = *(Konfigurasjon *) c.data;

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

Serial.println (c.status.code);

getConfiguration og setConfiguration

Den første metoden er getConfiguration, du kan bruke Den til å hente alle data som er lagret på enheten.

ResponseStructContainer getConfiguration ();

Her er et eksempel på bruk.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Det er viktig å få konfigurasjonspekeren før all annen operasjon

Konfigurasjonskonfigurasjon = *(Konfigurasjon *) c.data;

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

Serial.println (c.status.code);

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

Konfigurasjonsstrukturen har alle data for innstillinger, og jeg legger til en serie funksjoner for å få all beskrivelse av enkeltdata.

konfigurasjon. ADDL = 0x0; // Første del av adressekonfigurasjon. ADDH = 0x1; // Andre del av adressekonfigurasjon. CHAN = 0x19; // Kanalkonfigurasjon. OPTION.fec = FEC_0_OFF; // Videresend feilkorrigeringsbryter konfigurasjon. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // Konfigurasjon av overføringsmodus. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // Pull-up administrasjonskonfigurasjon. OPTION.transmissionPower = POWER_17; // konfigurasjon for overføringseffekt dBm. OPTION.wirelessWakeupTime = WAKE_UP_1250; // Ventetid for konfigurering av vekking. SPED.airDataRate = AIR_DATA_RATE_011_48; // Konfigurasjon av luftdatahastighet. SPED.uartBaudRate = UART_BPS_115200; // Konfigurasjon av overføringshastighet for kommunikasjon. SPED.uartParity = MODE_00_8N1; // Paritetsbit

Du har den tilsvarende funksjonen for alle attributter for å få all beskrivelse:

Serial.print (F ("Chan:")); Serial.print (konfigurasjon. CHAN, DEC); Serial.print (" ->"); Serial.println (configuration.getChannelDescription ()); Serial.println (F ("")); Serial.print (F ("SpeedParityBit:")); Serial.print (konfigurasjon. SPED.uartParity, BIN); Serial.print (" ->"); Serial.println (konfigurasjon. SPED.getUARTParityDescription ()); Serial.print (F ("SpeedUARTDatte:")); Serial.print (konfigurasjon. SPED.uartBaudRate, BIN); Serial.print (" ->"); Serial.println (konfigurasjon. 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 (konfigurasjon. OPTION.ioDriveMode, BIN); Serial.print (" ->"); Serial.println (konfigurasjon. OPTION.getIODroveModeDescription ()); Serial.print (F ("OptionWakeup:")); Serial.print (konfigurasjon. OPTION.wirelessWakeupTime, BIN); Serial.print (" ->"); Serial.println (konfigurasjon. OPTION.getWirelessWakeUPTimeDescription ()); Serial.print (F ("OptionFEC:")); Serial.print (konfigurasjon. OPTION.fec, BIN); Serial.print (" ->"); Serial.println (konfigurasjon. OPTION.getFECDescription ()); Serial.print (F ("OptionPower:")); Serial.print (konfigurasjon. OPTION.transmissionPower, BIN); Serial.print (" ->"); Serial.println (konfigurasjon. OPTION.getTransmissionPowerDescription ());

På samme måte vil setConfiguration ha en konfigurasjonsstruktur, så jeg tror den bedre måten å administrere konfigurasjonen er å hente den nåværende, bruke den eneste endringen du trenger og sette den på nytt.

ResponseStatus setConfiguration (konfigurasjonskonfigurasjon, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

konfigurasjonen er strukturen som tidligere vises, saveType tillater deg å velge hvis endringen blir permanent for bare den gjeldende økten.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Det er viktig å få konfigurasjonspekeren før all annen operasjon Konfigurasjonskonfigurasjon = *(Konfigurasjon *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfigurasjon); konfigurasjon. ADDL = 0x0; konfigurasjon. ADDH = 0x1; konfigurasjon. CHAN = 0x19; konfigurasjon. OPTION.fec = FEC_0_OFF; configuration. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; konfigurasjon. 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; // Angi konfigurasjon endret og satt til å ikke beholde konfigurasjonen ResponseStatus rs = e32ttl100.setConfiguration (konfigurasjon, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfigurasjon);

Parameteren administreres alle som konstante:

Trinn 10: Grunnleggende konfigurasjonsalternativ

Grunnleggende konfigurasjonsalternativ
Grunnleggende konfigurasjonsalternativ

Trinn 11: Send mottaksmelding

Først må vi introdusere en enkel, men nyttig metode for å sjekke om noe er i mottaksbufferen

int tilgjengelig ();

Det er ganske enkelt å returnere hvor mange byte du har i den nåværende strømmen.

Trinn 12: Normal overføringsmodus

Normal overføringsmodus
Normal overføringsmodus

Normal/Transparent overføringsmodus brukes til å sende meldinger til alle enheter med samme adresse og kanal.

Det er mange metoder for å sende/motta melding, vi skal forklare i detalj:

ResponseStatus sendMessage (const String melding);

ResponseContainer receiveMessage ();

Den første metoden er sendMessage og brukes til å sende en streng til en enhet i normal modus.

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

Den andre enheten gjør ganske enkelt på loop

if (e32ttl.available ()> 1) {ResponseContainer rs = e32ttl.receiveMessage (); String melding = rs.data; // Først får du dataene Serial.println (rs.status.getResponseDescription ()); Serial.println (melding); }

Trinn 13: Administrer struktur

Hvis du vil sende en kompleks struktur kan du bruke denne metoden

ResponseStatus sendMessage (const void *melding, const uint8_t størrelse); ResponseStructContainer mottaMessage (const uint8_t størrelse);

Den brukes til å sende strucutre, for eksempel:

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

og den andre siden kan du motta meldingen

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

Les delvis struktur

Hvis du vil lese den første delen av meldingen for å administrere flere typer strucutre, kan du bruke denne metoden.

ResponseContainer receiveInitialMessage (konstant uint8_t størrelse);

Jeg lager den for å motta en streng med type eller annen for å identifisere strukturen som skal lastes inn.

struct Messaggione {// Delvis strucutre uten typechar melding [8]; bool mitico; }; røye type [5]; // første del av strukturen ResponseContainer rs = e32ttl.receiveInitialMessage (sizeof (type)); // Legg streng i en char array (ikke nødvendig) memcpy (type, rs.data.c_str (), sizeof (type)); Serial.println ("LES TYPE:"); Serial.println (rs.status.getResponseDescription ()); Serial.println (type); // Les resten av strukturen ResponseStructContainer rsc = e32ttl.receiveMessage (sizeof (Messaggione)); struct Messaggione messaggione = *(Messaggione *) rsc.data;

Trinn 14: Fast modus i stedet for normal modus

På samme måte lager jeg et sett med metoder som skal brukes med fast overføring

Fast overføring

Du trenger bare å endre sendemetoden, fordi destinasjonsenheten ikke mottar innledningen med adresse og Channel quando settato il fixed mode.

Så for String -melding har du

ResponseStatus sendFixedMessage (byte ADDL, byte ADDH, byte CHAN, const String melding); ResponseStatus sendBroadcastFixedMessage (byte CHAN, const String melding);

og for struktur du har

ResponseStatus sendFixedMessage (byte ADDL, byte ADDH, byte CHAN, const void *melding, const uint8_t størrelse); ResponseStatus sendBroadcastFixedMessage (byte CHAN, const void *melding, const uint8_t størrelse);

Her et enkelt eksempel

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

Fast overføring har flere scenarier

Hvis du sender til en bestemt enhet (andre scenarier Fixed transmission) må du legge til ADDL, ADDH og CHAN for å identifisere den direkte.

ResponseStatus rs = e32ttl.sendFixedMessage (2, 2, 0x17, "Melding til en enhet");

Hvis du vil sende en melding til alle enheter i en spesifisert kanal, kan du bruke denne metoden.

ResponseStatus rs = e32ttl.sendBroadcastFixedMessage (0x17, "Melding til en enhet på en kanal");

Hvis du vil motta all kringkastingsmelding i nettverket, må du angi ADDH og ADDL med BROADCAST_ADDRESS.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Det er viktig å få konfigurasjonspekeren før all annen operasjon Konfigurasjonskonfigurasjon = *(Konfigurasjon *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfigurasjon); configuration. ADDL = BROADCAST_ADDRESS; konfigurasjon. ADDH = BROADCAST_ADDRESS; // Angi konfigurasjon endret og angitt for å ikke beholde konfigurasjonen ResponseStatus rs = e32ttl100.setConfiguration (konfigurasjon, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfigurasjon);

Trinn 15: Takk

Nå har du all informasjon for å gjøre jobben din, men jeg tror det er viktig å vise noen realistiske eksempler for å bedre forstå muligheten.

  1. LoRa E32 -enhet for Arduino, esp32 eller esp8266: innstillinger og grunnleggende bruk
  2. LoRa E32 -enhet for Arduino, esp32 eller esp8266: bibliotek
  3. LoRa E32 -enhet for Arduino, esp32 eller esp8266: konfigurasjon
  4. LoRa E32 -enhet for Arduino, esp32 eller esp8266: fast overføring
  5. LoRa E32 -enhet for Arduino, esp32 eller esp8266: strømsparing og sending av strukturerte data

Anbefalt: