Innehållsförteckning:

LoRa 3 km till 8 km trådlös kommunikation med låg kostnad E32 (sx1278/sx1276) enhet för Arduino, Esp8266 eller Esp32: 15 steg
LoRa 3 km till 8 km trådlös kommunikation med låg kostnad E32 (sx1278/sx1276) enhet för Arduino, Esp8266 eller Esp32: 15 steg

Video: LoRa 3 km till 8 km trådlös kommunikation med låg kostnad E32 (sx1278/sx1276) enhet för Arduino, Esp8266 eller Esp32: 15 steg

Video: LoRa 3 km till 8 km trådlös kommunikation med låg kostnad E32 (sx1278/sx1276) enhet för Arduino, Esp8266 eller Esp32: 15 steg
Video: GREENLINE 40 Solar Electric Hybrid Silent Eco Yacht Tour, Tech Talk & a Sea Trial 2024, December
Anonim
LoRa 3 km till 8 km trådlös kommunikation med låg kostnad E32 (sx1278/sx1276) enhet för Arduino, Esp8266 eller Esp32
LoRa 3 km till 8 km trådlös kommunikation med låg kostnad E32 (sx1278/sx1276) enhet för Arduino, Esp8266 eller Esp32

Jag skapar ett bibliotek för att hantera EBYTE E32 baserat på Semtech -serien av LoRa -enheter, mycket kraftfull, enkel och billig enhet.

Du hittar versionen på 3 km här, 8 km versionen här

De kan arbeta över ett avstånd på 3000m till 8000m, och de har många funktioner och parametrar. Så jag skapar det här biblioteket för att förenkla användningen.

Det är en lösning för att hämta data från storstadssensorer eller för att styra drönare.

Tillbehör

Arduino UNO

Wemos D1 mini

LoRa E32 TTL 100 3Km version

LoRa E32 TTL 1W 8Km version

Steg 1: Bibliotek

Bibliotek
Bibliotek

Du hittar mitt bibliotek här.

Att ladda ned.

Klicka på knappen DOWNLOADS i det övre högra hörnet, byt namn på den okomprimerade mappen LoRa_E32.

Kontrollera att mappen LoRa_E32 innehåller LoRa_E32.cpp och LoRa_E32.h.

Placera biblioteksmappen LoRa_E32 din / bibliotek / mapp. Du kan behöva skapa bibliotekets undermapp om det är ditt första bibliotek.

Starta om IDE.

Steg 2: Pinout

Pinout
Pinout
Pinout
Pinout
Pinout
Pinout

Som du kan se kan du ställa in olika lägen via M0- och M1 -stiften.

Det finns några stift som kan användas på ett statiskt sätt, men om du ansluter det till mikrokontrollern och konfigurerar dem i biblioteket får du prestanda och du kan styra alla lägen via programvara, men vi kommer att förklara bättre nästa.

Steg 3: AUX -stift

AUX -stift
AUX -stift
AUX -stift
AUX -stift
AUX -stift
AUX -stift

Som jag redan säger Det är inte viktigt att ansluta alla stift till utgången på mikrokontroller, du kan sätta M0 och M1 stift till HÖG eller LÅG för att få en önskad konfiguration, och om du inte ansluter AUX ställer biblioteket in en rimlig fördröjning för att vara säker att operationen är klar.

AUX -stift

När överföring av data kan användas för att väcka extern MCU och returnera HIGH vid dataöverföring.

När AUX går LÅG och returnera HÖG när bufferten är tom.

Den används också för självkontroll för att återställa normal drift (vid start och viloläge/programläge).

Steg 4: Fullt anslutet schema Esp8266

Fullt anslutet schema Esp8266
Fullt anslutet schema Esp8266
Fullt anslutet schema Esp8266
Fullt anslutet schema Esp8266

esp8266 -anslutningsschemat är enklare eftersom det fungerar med samma spänning för logisk kommunikation (3.3v).

Det är viktigt att lägga till uppdragningsmotstånd (4, 7Kohm) för att få bra stabilitet.

Steg 5: Fullt anslutet schema Arduino

Fullt anslutet schema Arduino
Fullt anslutet schema Arduino
Fullt anslutet schema Arduino
Fullt anslutet schema Arduino

Arduino arbetsspänning är 5v, så vi måste lägga till en spänningsdelare på RX -stift M0 och M1 på LoRa -modulen för att förhindra skador, du kan få mer information här Spänningsdelare: kalkylator och applikation.

Du kan använda ett 2Kohm -motstånd mot GND och 1Kohm från signal än sättas ihop på RX.

Steg 6: Bibliotek: Konstruktör

Jag gjorde en uppsättning ganska många konstruktörer, eftersom vi kan ha fler alternativ och situationer att hantera.

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örsta uppsättningen konstruktörer är skapa för att delegera hanteringen av Serial och andra pins till biblioteket.

rxPin och txPin är stiftet för att ansluta till UART och de är obligatoriska.

auxPin är en pin som kontrollerar drift, överföring och mottagningsstatus (vi ska förklara bättre härnäst), den pin Det är inte obligatoriskt, om du inte ställer in det tillämpar jag en fördröjning för att tillåta operationen att slutföra sig själv (med latens).

m0pin och m1Pin är stiften för att ändra driftsläge (se tabellen övre), jag tror att dessa stift i "produktion" kommer att ansluta direkt HÖG eller LÅG, men för test är de användbart att hantera av biblioteket.

bpsRate är boudrate för SoftwareSerial är normalt 9600 (den enda överföringshastigheten i programmin/viloläge)

Ett enkelt exempel är

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

Vi kan använda en SoftwareSerial direkt med en annan 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);

Exemplet övre med denna konstruktör kan göra så här.

#include #include "LoRa_E32.h"

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

LoRa_E32 e32ttl100 (& mySerial);

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

Den sista uppsättningen konstruktör är att tillåta att använda en HardwareSerial istället för 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);

Steg 7: Börja

Kommandot start används för att starta Serial och stift i in- och utgångsläge.

void begin ();

i utförande är

// Starta alla pins och UART

e32ttl100.begin ();

Steg 8: Konfigurations- och informationsmetod

Det finns en uppsättning metoder för att hantera konfiguration och få information om enheten.

ResponseStructContainer getConfiguration ();

ResponseStatus setConfiguration (konfigurationskonfiguration, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

ResponseStructContainer getModuleInformation ();

void printParameters (strukturkonfigurationskonfiguration);

ResponseStatus resetModule ();

Steg 9: Svarbehållare

För att förenkla hanteringen av svar skapar jag en uppsättning behållare, för mig mycket användbart för att hantera fel och returnera generisk data.

ResponseStatus

Detta är en statusbehållare och har 2 enkla ingångar, med detta kan du få statuskoden och beskrivningen av statuskoden

Serial.println (c.getResponseDescription ()); // Beskrivning av kod

Serial.println (c.code); // 1 if Success

Koden är

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

SvarContainer

Denna behållare skapas för att hantera strängsvar och har två ingångar.

data med strängen returnerade från meddelande och status en förekomst av RepsonseStatus.

ResponseContainer rs = e32ttl.receiveMessage ();

String meddelande = rs.data;

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

Serial.println (meddelande);

ResponseStructContainer

Detta är den mer "komplexa" behållaren, jag använder den här för att hantera struktur. Den har samma ingångspunkt för ResponseContainer men data är en ogiltig pekare för att hantera komplex struktur.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Det är viktigt att få konfigurationspekaren före all annan operation

Konfigurationskonfiguration = *(Konfiguration *) c.data;

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

Serial.println (c.status.code);

getConfiguration och setConfiguration

Den första metoden är getConfiguration, du kan använda den för att hämta all data som lagras på enheten.

ResponseStructContainer getConfiguration ();

Här är ett exempel på användning.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Det är viktigt att få konfigurationspekaren före all annan operation

Konfigurationskonfiguration = *(Konfiguration *) c.data;

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

Serial.println (c.status.code);

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

Konfigurationsstrukturen har alla data i inställningarna, och jag lägger till en serie funktioner för att få all beskrivning av enskilda data.

konfiguration. ADDL = 0x0; // Första delen av adresskonfiguration. ADDH = 0x1; // Andra delen av adresskonfiguration. CHAN = 0x19; // Kanalkonfiguration. OPTION.fec = FEC_0_OFF; // Vidarebefordran av felkorrigeringsomkopplare. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // Konfiguration av överföringsläge. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // Pull-up-hanteringskonfiguration. OPTION.transmissionPower = POWER_17; // dBm överföringseffektkonfiguration. OPTION.wirelessWakeupTime = WAKE_UP_1250; // Väntetid för väckarkonfiguration. SPED.airDataRate = AIR_DATA_RATE_011_48; // Konfiguration av luftdatahastighet. SPED.uartBaudRate = UART_BPS_115200; // Konfiguration av överföringshastighet för kommunikation. SPED.uartParity = MODE_00_8N1; // Paritetsbit

Du har motsvarande funktion för alla attribut för att få all beskrivning:

Serial.print (F ("Chan:")); Serial.print (konfiguration. 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 (konfiguration. OPTION.ioDriveMode, BIN); Serial.print (" ->"); Serial.println (konfiguration. OPTION.getIODroveModeDescription ()); Serial.print (F ("OptionWakeup:")); Serial.print (configuration. OPTION.wirelessWakeupTime, BIN); Serial.print (" ->"); Serial.println (konfiguration. OPTION.getWirelessWakeUPTimeDescription ()); Serial.print (F ("OptionFEC:")); Serial.print (konfiguration. 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 ());

På samma sätt vill setConfiguration ha en konfigurationsstruktur, så jag tror att det bättre sättet att hantera konfigurationen är att hämta den aktuella, tillämpa den enda ändringen du behöver och ställa in den igen.

ResponseStatus setConfiguration (konfigurationskonfiguration, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

konfiguration är strukturen som tidigare visas, saveType tillåter dig att välja om ändringen blir permanent endast för den aktuella sessionen.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Det är viktigt att få konfigurationspekaren före all annan 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; configuration. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; konfiguration. 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; // Ställ in konfiguration ändrad och ställ in att inte hålla konfigurationen ResponseStatus rs = e32ttl100.setConfiguration (konfiguration, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfiguration);

Parametern hanteras alla som konstant:

Steg 10: Grundläggande konfigurationsalternativ

Grundläggande konfigurationsalternativ
Grundläggande konfigurationsalternativ

Steg 11: Skicka ta emot meddelande

Först måste vi introducera en enkel men användbar metod för att kontrollera om något finns i den mottagande bufferten

int tillgängligt ();

Det är helt enkelt att returnera hur många byte du har i den nuvarande strömmen.

Steg 12: Normalt överföringsläge

Normalt överföringsläge
Normalt överföringsläge

Normalt/transparent överföringsläge används för att skicka meddelanden till alla enheter med samma adress och kanal.

Det finns många sätt att skicka/ta emot meddelanden, vi kommer att förklara i detalj:

ResponseStatus sendMessage (const String -meddelande);

ResponseContainer receiveMessage ();

Första metoden är sendMessage och används för att skicka en sträng till en enhet i normalt läge.

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

Den andra enheten gör helt enkelt på slingan

if (e32ttl.available ()> 1) {ResponseContainer rs = e32ttl.receiveMessage (); String meddelande = rs.data; // Skaffa först data Serial.println (rs.status.getResponseDescription ()); Serial.println (meddelande); }

Steg 13: Hantera struktur

Om du vill skicka en komplex struktur kan du använda den här metoden

ResponseStatus sendMessage (const void *meddelande, const uint8_t storlek); ResponseStructContainer receiveMessage (const uint8_t storlek);

Den används för att skicka strucutre, till exempel:

struct Messaggione {char typ [5]; rödingmeddelande [8]; bulle mitico; }; struct Messaggione messaggione = {"TEMP", "Peple", true}; ResponseStatus rs = e32ttl.sendMessage (& messaggione, sizeof (Messaggione)); Serial.println (rs.getResponseDescription ());

och den andra sidan kan du ta emot meddelandet 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

Om du vill läsa första delen av meddelandet för att hantera fler typer av strucutre kan du använda den här metoden.

ResponseContainer receiveInitialMessage (konstant uint8_t storlek);

Jag skapar det för att ta emot en sträng med typ eller annat för att identifiera strukturen som ska laddas.

struct Messaggione {// Delvis strucutre utan typechar -meddelande [8]; bulle mitico; }; rödingstyp [5]; // första delen av strukturen ResponseContainer rs = e32ttl.receiveInitialMessage (sizeof (type)); // Lägg sträng i en char array (behövs inte) memcpy (type, rs.data.c_str (), sizeof (type)); Serial.println ("LÄS TYP:"); Serial.println (rs.status.getResponseDescription ()); Serial.println (typ); // Läs resten av strukturen ResponseStructContainer rsc = e32ttl.receiveMessage (sizeof (Messaggione)); struct Messaggione messaggione = *(Messaggione *) rsc.data;

Steg 14: Fast läge istället för normalt läge

På samma sätt skapar jag en uppsättning metoder att använda med fast överföring

Fast växellåda

Du behöver bara ändra sändningsmetoden, eftersom destinationsenheten inte tar emot ingressen med adress och kanal quando -inställning i fast läge.

Så för String -meddelande har du

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

och för struktur du har

ResponseStatus sendFixedMessage (byte ADDL, byte ADDH, byte CHAN, const void *meddelande, const uint8_t storlek); ResponseStatus sendBroadcastFixedMessage (byte CHAN, const void *meddelande, const uint8_t storlek);

Här ett enkelt exempel

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

Fast överföring har fler scenarier

Om du skickar till en specifik enhet (andra scenarier Fixerad överföring) måste du lägga till ADDL, ADDH och CHAN för att identifiera den direkt.

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

Om du vill skicka ett meddelande till alla enheter i en angiven kanal kan du använda den här metoden.

ResponseStatus rs = e32ttl.sendBroadcastFixedMessage (0x17, "Meddelande till enheter i en kanal");

Om du vill ta emot alla sändningsmeddelanden i nätverket måste du ställa in din ADDH och ADDL med BROADCAST_ADDRESS.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Det är viktigt att få konfigurationspekaren före all annan operation Konfigurationskonfiguration = *(Konfiguration *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfiguration); configuration. ADDL = BROADCAST_ADDRESS; configuration. ADDH = BROADCAST_ADDRESS; // Ställ in konfiguration ändrad och ställ in att inte hålla konfigurationen ResponseStatus rs = e32ttl100.setConfiguration (konfiguration, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfiguration);

Steg 15: Tack

Nu har du all information för att utföra ditt arbete, men jag tycker att det är viktigt att visa några realistiska exempel för att inte förstå alla möjligheter.

  1. LoRa E32 -enhet för Arduino, esp32 eller esp8266: inställningar och grundläggande användning
  2. LoRa E32 -enhet för Arduino, esp32 eller esp8266: bibliotek
  3. LoRa E32 -enhet för Arduino, esp32 eller esp8266: konfiguration
  4. LoRa E32 -enhet för Arduino, esp32 eller esp8266: fast överföring
  5. LoRa E32 -enhet för Arduino, esp32 eller esp8266: energibesparing och sändning av strukturerad data

Rekommenderad: