Indholdsfortegnelse:

LoRa 3 km til 8 km trådløs kommunikation med lavpris E32 (sx1278/sx1276) enhed til Arduino, Esp8266 eller Esp32: 15 trin
LoRa 3 km til 8 km trådløs kommunikation med lavpris E32 (sx1278/sx1276) enhed til Arduino, Esp8266 eller Esp32: 15 trin

Video: LoRa 3 km til 8 km trådløs kommunikation med lavpris E32 (sx1278/sx1276) enhed til Arduino, Esp8266 eller Esp32: 15 trin

Video: LoRa 3 km til 8 km trådløs kommunikation med lavpris E32 (sx1278/sx1276) enhed til Arduino, Esp8266 eller Esp32: 15 trin
Video: Ebyte NEW SX1268 LoRa Module 433MHz 30dbm 12km Long Range SPI IOT Wireless Transceiver Module 2024, November
Anonim
LoRa 3 til 8 km trådløs kommunikation med lavpris E32 (sx1278/sx1276) enhed til Arduino, Esp8266 eller Esp32
LoRa 3 til 8 km trådløs kommunikation med lavpris E32 (sx1278/sx1276) enhed til Arduino, Esp8266 eller Esp32

Jeg opretter et bibliotek til at styre EBYTE E32 baseret på Semtech -serien af LoRa -enheder, meget kraftfuld, enkel og billig enhed.

Du kan finde 3 km version her, 8 km version her

De kan arbejde over en afstand på 3000m til 8000m, og de har mange funktioner og parametre. Så jeg opretter dette bibliotek for at forenkle brugen.

Det er en løsning til at hente data fra storbyens sensorer eller til at styre drone.

Forbrugsvarer

Arduino UNO

Wemos D1 mini

LoRa E32 TTL 100 3Km version

LoRa E32 TTL 1W 8Km version

Trin 1: Bibliotek

Bibliotek
Bibliotek

Du kan finde mit bibliotek her.

At downloade.

Klik på knappen DOWNLOADS i øverste højre hjørne, omdøb den ukomprimerede mappe LoRa_E32.

Kontroller, at mappen LoRa_E32 indeholder LoRa_E32.cpp og LoRa_E32.h.

Placer biblioteksmappen LoRa_E32 din / biblioteker / mappe. Du skal muligvis oprette bibliotekernes undermappe, hvis det er dit første bibliotek.

Genstart IDE.

Trin 2: Pinout

Pinout
Pinout
Pinout
Pinout
Pinout
Pinout

Som du kan se, kan du indstille forskellige tilstande via M0 og M1 ben.

Der er nogle stifter, der kan bruges på en statisk måde, men hvis du tilslutter det til mikrokontrolleren og konfigurerer dem i biblioteket, opnår du ydeevne, og du kan styre alle tilstande via software, men vi vil forklare bedre næste gang.

Trin 3: AUX Pin

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

Som jeg allerede siger Det er ikke vigtigt at tilslutte alle stifter til output fra mikrokontroller, kan du sætte M0 og M1 ben til HØJ eller LAV for at få den ønskede konfiguration, og hvis du ikke tilslutter AUX, indstillede biblioteket en rimelig forsinkelse for at være sikker at operationen er fuldført.

AUX pin

Når overførsel af data kan bruges til at vække ekstern MCU og returnere HØJ ved dataoverførsel.

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

Det bruges også til selvkontrol for at gendanne normal drift (ved opstart og søvn/programtilstand).

Trin 4: Fuldt tilsluttet skema Esp8266

Fuldt tilsluttet skema Esp8266
Fuldt tilsluttet skema Esp8266
Fuldt tilsluttet skema Esp8266
Fuldt tilsluttet skema Esp8266

esp8266 -tilslutningsskema er mere enkelt, fordi det fungerer ved den samme spænding af logisk kommunikation (3.3v).

Det er vigtigt at tilføje pull-up modstand (4, 7Kohm) for at få god stabilitet.

Trin 5: Fuldt tilsluttet skema Arduino

Fuldt tilsluttet skema Arduino
Fuldt tilsluttet skema Arduino
Fuldt tilsluttet skema Arduino
Fuldt tilsluttet skema Arduino

Arduino arbejdsspænding er 5v, så vi skal tilføje en spændingsdeler på RX pin M0 og M1 i LoRa modulet for at forhindre skader, du kan få flere oplysninger her Spændingsdeler: lommeregner og applikation.

Du kan bruge en 2Kohm -modstand til GND og 1Kohm fra signal end sat sammen på RX.

Trin 6: Bibliotek: Konstruktør

Jeg lavede et sæt af ganske mange konstruktører, fordi vi kan have flere muligheder og situationer at styre.

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

Første sæt konstruktører er oprettet for at delegere administrationen af Serial og andre pins til biblioteket.

rxPin og txPin er stiften til at oprette forbindelse til UART, og de er obligatoriske.

auxPin er en pin, der kontrollerer driften, transmissionen og modtagelsesstatus (vi vil forklare bedre næste), den pin Det er ikke obligatorisk, hvis du ikke indstiller det, anvender jeg en forsinkelse for at tillade operationen at fuldføre sig selv (med latenstid).

m0pin og m1Pin er stifterne til at ændre driftstilstand (se tabellen øverst), jeg tror, at disse ben i "produktion" kommer til at forbinde direkte HØJ eller LAV, men til test skal de med fordel administreres af biblioteket.

bpsRate er boudrate for SoftwareSerial er normalt 9600 (den eneste baudhastighed i programmin/dvaletilstand)

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 bruge en SoftwareSerial direkte med en anden konstruktør

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

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

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

Eksemplet øvre med denne konstruktør kan gøre som det.

#include #include "LoRa_E32.h"

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

LoRa_E32 e32ttl100 (& mySerial);

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

Det sidste sæt konstruktør er at tillade at bruge et HardwareSerial i stedet for SoftwareSerial.

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

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

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

Trin 7: Start

Start -kommandoen bruges til at starte Serial og pins i input- og output -tilstand.

ugyldig start ();

i udførelse er

// Start alle pins og UART

e32ttl100.begin ();

Trin 8: Konfigurations- og informationsmetode

Der er et sæt metoder til at styre konfiguration og få oplysninger om enheden.

ResponseStructContainer getConfiguration ();

ResponseStatus setConfiguration (konfigurationskonfiguration, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

ResponseStructContainer getModuleInformation ();

void printParameters (strukturkonfigurationskonfiguration);

ResponseStatus resetModule ();

Trin 9: Svarbeholder

For at forenkle håndteringen af svar opretter jeg et sæt containere, for mig meget nyttigt at styre fejl og returnere generiske data.

ResponseStatus

Dette er en statusbeholder og har 2 enkle indgangspunkter, med dette kan du få statuskoden og beskrivelsen af statuskoden

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

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

Koden er

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

ResponsContainer

Denne beholder er oprettet for at styre strengrespons og have 2 indgangspunkter.

data med strengen returneret fra besked og status en forekomst af RepsonseStatus.

ResponseContainer rs = e32ttl.receiveMessage ();

Stringbesked = rs.data;

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

Serial.println (besked);

ResponseStructContainer

Dette er den mere "komplekse" beholder, jeg bruger denne til at styre struktur. Den har det samme indgangspunkt for ResponseContainer, men data er en tomrumspeger til at styre kompleks struktur.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Det er vigtigt at få konfigurationsmarkøren før al anden operation

Konfigurationskonfiguration = *(Konfiguration *) c.data;

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

Serial.println (c.status.code);

getConfiguration og setConfiguration

Den første metode er getConfiguration, du kan bruge den til at hente alle data, der er gemt på enheden.

ResponseStructContainer getConfiguration ();

Her et brugseksempel.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Det er vigtigt at få konfigurationsmarkøren før al anden operation

Konfigurationskonfiguration = *(Konfiguration *) c.data;

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

Serial.println (c.status.code);

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

Konfigurationsstrukturen har alle indstillinger for indstillinger, og jeg tilføjer en række funktioner for at få alle beskrivelser af enkeltdata.

konfiguration. ADDL = 0x0; // Første del af adressekonfiguration. ADDH = 0x1; // Anden del af adressekonfiguration. CHAN = 0x19; // Kanalkonfiguration. OPTION.fec = FEC_0_OFF; // Videresend fejlkorrektion switch -konfiguration. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // Konfiguration af transmissionstilstand. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // Pull-up management konfiguration. OPTION.transmissionPower = POWER_17; // konfiguration af transmissionseffekt dBm. OPTION.wirelessWakeupTime = WAKE_UP_1250; // Ventetid på konfiguration til vågning. SPED.airDataRate = AIR_DATA_RATE_011_48; // Konfiguration af luftdatahastighed. SPED.uartBaudRate = UART_BPS_115200; // Kommunikation baud rate konfiguration. SPED.uartParity = MODE_00_8N1; // Paritetsbit

Du har den tilsvarende funktion for alle attributter for at få alle beskrivelser:

Serial.print (F ("Chan:")); Serial.print (konfiguration. CHAN, DEC); Serial.print (" ->"); Serial.println (configuration.getChannelDescription ()); Serial.println (F ("")); Serial.print (F ("SpeedParityBit:")); Serial.print (konfiguration. SPED.uartParity, BIN); Serial.print (" ->"); Serial.println (konfiguration. SPED.getUARTParityDescription ()); Serial.print (F ("SpeedUARTDatte:")); Serial.print (konfiguration. SPED.uartBaudRate, BIN); Serial.print (" ->"); Serial.println (konfiguration. SPED.getUARTBaudRate ()); Serial.print (F ("SpeedAirDataRate:")); Serial.print (configuration. SPED.airDataRate, BIN); Serial.print (" ->"); Serial.println (konfiguration. SPED.getAirDataRate ()); Serial.print (F ("OptionTrans:")); Serial.print (konfiguration. OPTION.fixedTransmission, BIN); Serial.print (" ->"); Serial.println (konfiguration. OPTION.getFixedTransmissionDescription ()); Serial.print (F ("OptionPullup:")); Serial.print (konfiguration. OPTION.ioDriveMode, BIN); Serial.print (" ->"); Serial.println (konfiguration. OPTION.getIODroveModeDescription ()); Serial.print (F ("OptionWakeup:")); Serial.print (konfiguration. OPTION.wirelessWakeupTime, BIN); Serial.print (" ->"); Serial.println (konfiguration. OPTION.getWirelessWakeUPTimeDescription ()); Serial.print (F ("OptionFEC:")); Serial.print (konfiguration. OPTION.fec, BIN); Serial.print (" ->"); Serial.println (konfiguration. OPTION.getFECDescription ()); Serial.print (F ("OptionPower:")); Serial.print (konfiguration. OPTION.transmissionPower, BIN); Serial.print (" ->"); Serial.println (konfiguration. OPTION.getTransmissionPowerDescription ());

På samme måde ønsker setConfiguration en konfigurationsstruktur, så jeg tror, at den bedre måde at styre konfigurationen på er at hente den aktuelle, anvende den eneste ændring, du har brug for, og indstille den igen.

ResponseStatus setConfiguration (konfigurationskonfiguration, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

konfiguration er den struktur, der tidligere vises, gemmer SaveType tilladelse til at vælge, hvis ændringen kun bliver permanent for den aktuelle session.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Det er vigtigt at få konfigurationsmarkøren før al anden operation Konfigurationskonfiguration = *(Konfiguration *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfiguration); konfiguration. ADDL = 0x0; konfiguration. ADDH = 0x1; konfiguration. CHAN = 0x19; konfiguration. OPTION.fec = FEC_0_OFF; konfiguration. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; konfiguration. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; konfiguration. OPTION.transmissionPower = POWER_17; konfiguration. 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; // Indstil konfiguration ændret og indstillet til ikke at holde konfigurationen ResponseStatus rs = e32ttl100.setConfiguration (konfiguration, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfiguration);

Parameteren administreres alle som konstante:

Trin 10: Grundlæggende konfigurationsindstilling

Grundlæggende konfigurationsindstilling
Grundlæggende konfigurationsindstilling

Trin 11: Send modtagelsesbesked

Først skal vi introducere en enkel, men nyttig metode til at kontrollere, om der er noget i den modtagende buffer

int tilgængelig ();

Det er ganske enkelt at returnere, hvor mange bytes du har i den aktuelle strøm.

Trin 12: Normal transmissionstilstand

Normal transmissionstilstand
Normal transmissionstilstand

Normal/Transparent transmissionstilstand bruges til at sende meddelelser til alle enheder med samme adresse og kanal.

Der er mange metoder til at sende/modtage beskeder, vi vil forklare detaljeret:

ResponseStatus sendMessage (const String -besked);

ResponseContainer modtageMessage ();

Den første metode er sendMessage og bruges til at sende en streng til en enhed i normal tilstand.

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

Den anden enhed gør simpelthen på sløjfen

hvis (e32ttl.available ()> 1) {ResponseContainer rs = e32ttl.receiveMessage (); Stringbesked = rs.data; // Hent først nogensinde dataene Serial.println (rs.status.getResponseDescription ()); Serial.println (besked); }

Trin 13: Administrer struktur

Hvis du vil sende en kompleks struktur kan du bruge denne metode

ResponseStatus sendMessage (const void *meddelelse, const uint8_t størrelse); ResponseStructContainer modtageMessage (const uint8_t størrelse);

Det bruges til at sende strucutre, for eksempel:

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

og den anden side kan du modtage beskeden så

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

Læs delvis struktur

Hvis du vil læse den første del af meddelelsen til at styre flere typer strucutre, kan du bruge denne metode.

ResponseContainer modtageInitialMessage (konstant uint8_t størrelse);

Jeg opretter det for at modtage en streng med type eller andet for at identificere den struktur, der skal indlæses.

struct Messaggione {// Delvis strucutre uden typechar -besked [8]; bool mitico; }; rødtype [5]; // første del af strukturen ResponseContainer rs = e32ttl.receiveInitialMessage (sizeof (type)); // Sæt streng i et char -array (ikke nødvendigt) memcpy (type, rs.data.c_str (), sizeof (type)); Serial.println ("LÆS TYPE:"); Serial.println (rs.status.getResponseDescription ()); Serial.println (type); // Læs resten af strukturen ResponseStructContainer rsc = e32ttl.receiveMessage (sizeof (Messaggione)); struct Messaggione messaggione = *(Messaggione *) rsc.data;

Trin 14: Fast tilstand i stedet for normal tilstand

På samme måde opretter jeg et sæt metoder til brug med fast transmission

Fast transmission

Du skal kun ændre afsendelsesmetoden, fordi destinationsenheden ikke modtager præamblen med adresse og kanal quando -indstilling i fast tilstand.

Så for String -besked har du

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

og for struktur du har

ResponseStatus sendFixedMessage (byte ADDL, byte ADDH, byte CHAN, const void *meddelelse, const uint8_t størrelse); ResponseStatus sendBroadcastFixedMessage (byte CHAN, const void *meddelelse, 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 transmission har flere scenarier

Hvis du sender til en bestemt enhed (andre scenarier Fixed transmission), skal du tilføje ADDL, ADDH og CHAN for at identificere den direkte.

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

Hvis du vil sende en besked til alle enheder i en bestemt kanal, kan du bruge denne metode.

ResponseStatus rs = e32ttl.sendBroadcastFixedMessage (0x17, "Besked til en enhed i en kanal");

Hvis du vil modtage al udsendelsesmeddelelse på netværket, skal du indstille din ADDH og ADDL med BROADCAST_ADDRESS.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Det er vigtigt at få konfigurationsmarkøren før al anden operation Konfigurationskonfiguration = *(Konfiguration *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfiguration); konfiguration. ADDL = BROADCAST_ADDRESS; konfiguration. ADDH = BROADCAST_ADDRESS; // Indstil konfiguration ændret og indstillet til ikke at holde konfigurationen ResponseStatus rs = e32ttl100.setConfiguration (konfiguration, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfiguration);

Trin 15: Tak

Nu har du alle oplysninger til at udføre dit arbejde, men jeg synes, det er vigtigt at vise nogle realistiske eksempler for bedre at forstå muligheden.

  1. LoRa E32 -enhed til Arduino, esp32 eller esp8266: indstillinger og grundlæggende brug
  2. LoRa E32 -enhed til Arduino, esp32 eller esp8266: bibliotek
  3. LoRa E32 -enhed til Arduino, esp32 eller esp8266: konfiguration
  4. LoRa E32 -enhed til Arduino, esp32 eller esp8266: fast transmission
  5. LoRa E32 -enhed til Arduino, esp32 eller esp8266: strømbesparelse og afsendelse af strukturerede data

Anbefalede: