Inhoudsopgave:

LoRa 3 km tot 8 km draadloze communicatie met goedkope E32 (sx1278 / sx1276) apparaat voor Arduino, Esp8266 of Esp32 - Ajarnpa
LoRa 3 km tot 8 km draadloze communicatie met goedkope E32 (sx1278 / sx1276) apparaat voor Arduino, Esp8266 of Esp32 - Ajarnpa

Video: LoRa 3 km tot 8 km draadloze communicatie met goedkope E32 (sx1278 / sx1276) apparaat voor Arduino, Esp8266 of Esp32 - Ajarnpa

Video: LoRa 3 km tot 8 km draadloze communicatie met goedkope E32 (sx1278 / sx1276) apparaat voor Arduino, Esp8266 of Esp32 - Ajarnpa
Video: A Show of Scrutiny | Critical Role: THE MIGHTY NEIN | Episode 2 2024, November
Anonim
LoRa 3 km tot 8 km draadloze communicatie met goedkope E32 (sx1278 / sx1276) apparaat voor Arduino, Esp8266 of Esp32
LoRa 3 km tot 8 km draadloze communicatie met goedkope E32 (sx1278 / sx1276) apparaat voor Arduino, Esp8266 of Esp32

Ik maak een bibliotheek om EBYTE E32 te beheren op basis van de Semtech-serie van LoRa-apparaten, een zeer krachtig, eenvoudig en goedkoop apparaat.

U vindt de 3Km-versie hier, de 8Km-versie hier

Ze kunnen werken over een afstand van 3000 m tot 8000 m, en ze hebben veel functies en parameters. Dus ik maak deze bibliotheek om het gebruik te vereenvoudigen.

Het is een oplossing om data op te halen uit grootstedelijke sensoren of om drones te besturen.

Benodigdheden

Arduino UNO

Wemos D1 mini

LoRa E32 TTL 100 3Km-versie

LoRa E32 TTL 1W 8Km versie

Stap 1: Bibliotheek

Bibliotheek
Bibliotheek

Mijn bibliotheek vind je hier.

Downloaden.

Klik op de DOWNLOADS-knop in de rechterbovenhoek, hernoem de niet-gecomprimeerde map LoRa_E32.

Controleer of de map LoRa_E32 LoRa_E32.cpp en LoRa_E32.h bevat.

Plaats de LoRa_E32 bibliotheekmap in uw /libraries/ map. Mogelijk moet u de submap bibliotheken maken als dit uw eerste bibliotheek is.

Start de IDE opnieuw.

Stap 2: Pinout

pinout
pinout
pinout
pinout
pinout
pinout

Zoals je kunt zien, kun je verschillende modi instellen via M0- en M1-pinnen.

Er zijn enkele pinnen die op een statische manier kunnen worden gebruikt, maar als je het op de microcontroller aansluit en ze in de bibliotheek configureert, krijg je betere prestaties en kun je alle modi via software besturen, maar we gaan het hierna beter uitleggen.

Stap 3: AUX-pin

AUX-pin
AUX-pin
AUX-pin
AUX-pin
AUX-pin
AUX-pin

Zoals ik al zei Het is niet belangrijk om alle pinnen op de uitgang van de microcontroller aan te sluiten, je kunt de M0- en M1-pinnen op HOOG of LAAG zetten om de gewenste configuratie te krijgen, en als je geen AUX aansluit, stelt de bibliotheek een redelijke vertraging in om zeker te zijn dat de operatie is voltooid.

AUX-pin

Bij het verzenden van gegevens kan worden gebruikt om de externe MCU te wekken en HOOG terug te geven bij het voltooien van de gegevensoverdracht.

Wanneer AUX wordt ontvangen, wordt het LAAG en wordt het HOOG geretourneerd wanneer de buffer leeg is.

Het wordt ook gebruikt voor zelfcontrole om de normale werking te herstellen (bij inschakelen en slaap-/programmamodus).

Stap 4: Volledig verbonden schema Esp8266

Volledig verbonden schema Esp8266
Volledig verbonden schema Esp8266
Volledig verbonden schema Esp8266
Volledig verbonden schema Esp8266

esp8266-verbindingsschema is eenvoudiger omdat het werkt op hetzelfde voltage van logische communicatie (3.3v).

Het is belangrijk om een pull-up weerstand (4, 7Kohm) toe te voegen om een goede stabiliteit te krijgen.

Stap 5: Volledig verbonden Schema Arduino

Volledig verbonden schema Arduino
Volledig verbonden schema Arduino
Volledig verbonden schema Arduino
Volledig verbonden schema Arduino

Arduino-werkspanning is 5v, dus we moeten een spanningsdeler toevoegen op RX-pin M0 en M1 van de LoRa-module om schade te voorkomen, u kunt hier meer informatie krijgen Spanningsdeler: rekenmachine en applicatie.

U kunt een weerstand van 2Kohm naar GND en 1Kohm van het signaal gebruiken dan samen te voegen op RX.

Stap 6: Bibliotheek: Constructor

Ik heb een reeks van vrij veel constructeurs gemaakt, omdat we meer opties en situaties kunnen beheren.

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

De eerste set constructors is gemaakt om het beheer van seriële en andere pinnen aan de bibliotheek te delegeren.

rxPin en txPin is de pin om verbinding te maken met UART en ze zijn verplicht.

auxPin is een pin die de werking, verzending en ontvangststatus controleert (we gaan het hierna beter uitleggen), die pin Het is niet verplicht, als je het niet instelt, pas ik een vertraging toe om de bewerking zichzelf te laten voltooien (met latentie).

m0pin en m1Pin zijn de pinnen om de bedieningsmodus te wijzigen (zie de tabel hierboven), ik denk dat deze pinnen in "productie" direct HOOG of LAAG gaan verbinden, maar voor de test kunnen ze handig worden beheerd door de bibliotheek.

bpsRate is de boudrate van SoftwareSerial is normaal gesproken 9600 (de enige baudrate in programmeer-/slaapmodus)

Een eenvoudig voorbeeld is:

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

We kunnen een SoftwareSerial direct gebruiken met een andere constructor

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

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

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

Het voorbeeldbovenwerk met deze constructor kan zo zijn.

#include #include "LoRa_E32.h"

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

LoRa_E32 e32ttl100(&mySerial);

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

De laatste set constructor is om het gebruik van een HardwareSerial in plaats van SoftwareSerial toe te staan.

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

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

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

Stap 7: Begin

Het begin-commando wordt gebruikt om Serial en pinnen op te starten in invoer- en uitvoermodus.

ongeldig begin();

in uitvoering is

// Start alle pinnen en UART. op

e32ttl100.begin();

Stap 8: Configuratie- en informatiemethode

Er is een reeks methoden voor het beheren van de configuratie en het verkrijgen van informatie over het apparaat.

ResponseStructContainer getConfiguration();

ResponseStatus setConfiguration (configuratieconfiguratie, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

ResponseStructContainer getModuleInformation();

void printParameters (struct Configuratieconfiguratie);

ResponseStatus resetModule();

Stap 9: Responscontainer

Om het beheer van reacties te vereenvoudigen, maak ik een set containers, voor mij erg handig om fouten te beheren en generieke gegevens terug te sturen.

Reactiestatus

Dit is een statuscontainer en heeft 2 eenvoudige toegangspunten, hiermee kunt u de statuscode en de beschrijving van de statuscode krijgen

Serial.println(c.getResponseDescription()); // Beschrijving van code

Seriële.println(c.code); // 1 als Succes

De code is:

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

ReactieContainer

Deze container is gemaakt om String-respons te beheren en heeft 2 toegangspunten.

gegevens met de tekenreeks die is geretourneerd door het bericht en de status een instantie van RepsonseStatus.

ResponseContainer rs = e32ttl.receiveMessage();

String bericht = rs.data;

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

Serial.println(bericht);

ResponseStructContainer

Dit is de meer "complexe" container, ik gebruik deze om de structuur te beheren. Het heeft hetzelfde toegangspunt als ResponseContainer, maar gegevens zijn een lege aanwijzer om een complexe structuur te beheren.

ResponseStructContainer c;

c = e32ttl100.getConfiguration();// Het is belangrijk om de configuratieaanwijzer op te halen vóór alle andere bewerkingen

Configuratie configuratie = *(Configuratie*) c.data;

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

Serial.println(c.status.code);

getConfiguration en setConfiguration

De eerste methode is getConfiguration, u kunt het gebruiken om alle gegevens op te halen die op het apparaat zijn opgeslagen.

ResponseStructContainer getConfiguration();

Hier een gebruiksvoorbeeld.

ResponseStructContainer c;

c = e32ttl100.getConfiguration();// Het is belangrijk om de configuratieaanwijzer op te halen vóór alle andere bewerkingen

Configuratie configuratie = *(Configuratie*) c.data;

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

Serial.println(c.status.code);

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

Configuratiestructuur heeft alle gegevens van instellingen en ik voeg een reeks functies toe om alle beschrijvingen van afzonderlijke gegevens te krijgen.

configuratie. ADDL = 0x0; // Eerste deel van adresconfiguratie. ADDH = 0x1; // Tweede deel van adresconfiguratie. CHAN = 0x19;// Kanaalconfiguratie. OPTION.fec = FEC_0_OFF; // Forward error correction switch configuration. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // Configuratie transmissiemodus. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // Pull-up-beheerconfiguratie. OPTION.transmissionPower = POWER_17; // dBm zendvermogen configuratie. OPTION.wirelessWakeupTime = WAKE_UP_1250; // Wachttijd voor ontwaakconfiguratie. SPED.airDataRate = AIR_DATA_RATE_011_48; // Configuratie luchtgegevenssnelheid. SPED.uartBaudRate = UART_BPS_115200; // Configuratie baudrate communicatie. SPED.uartParity = MODE_00_8N1; // Pariteitsbit

U hebt de equivalente functie voor alle attributen om alle beschrijvingen te krijgen:

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

Op dezelfde manier wil setConfiguration een configuratiestructuur, dus ik denk dat de betere manier om de configuratie te beheren is om de huidige op te halen, de enige wijziging toe te passen die je nodig hebt en deze opnieuw in te stellen.

ResponseStatus setConfiguration (configuratieconfiguratie, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

configuratie is de structuur die eerder wordt getoond, saveType staat u toe om te kiezen of de wijziging permanent wordt alleen voor de huidige sessie.

ResponseStructContainer c;c = e32ttl100.getConfiguration(); // Het is belangrijk om de configuratieaanwijzer te krijgen vóór alle andere bewerkingen Configuratieconfiguratie = *(Configuratie*) c.data; Serial.println(c.status.getResponseDescription()); Serial.println(c.status.code); printParameters (configuratie); configuratie. ADDL = 0x0; configuratie. ADDH = 0x1; configuratie. CHAN = 0x19; configuratie. OPTION.fec = FEC_0_OFF; configuratie. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; configuratie. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; configuratie. OPTION.transmissionPower = POWER_17; configuratie. OPTION.wirelessWakeupTime = WAKE_UP_1250; configuratie. SPED.airDataRate = AIR_DATA_RATE_011_48; configuratie. SPED.uartBaudRate = UART_BPS_115200; configuratie. SPED.uartParity = MODE_00_8N1; // Configuratie gewijzigd en ingesteld om de configuratie niet vast te houden ResponseStatus rs = e32ttl100.setConfiguration (configuratie, WRITE_CFG_PWR_DWN_LOSE); Serial.println(rs.getResponseDescription()); Serieel.println(rs.code); printParameters (configuratie);

De parameters worden allemaal als constant beheerd:

Stap 10: Basisconfiguratieoptie

Basisconfiguratieoptie
Basisconfiguratieoptie

Stap 11: Bericht ontvangen verzenden

Eerst moeten we een eenvoudige maar bruikbare methode introduceren om te controleren of er iets in de ontvangende buffer zit

int beschikbaar();

Het geeft gewoon terug hoeveel bytes je in de huidige stream hebt.

Stap 12: Normale verzendmodus

Normale verzendmodus
Normale verzendmodus

De normale/transparante transmissiemodus wordt gebruikt om berichten naar alle apparaten met hetzelfde adres en kanaal te verzenden.

Er zijn veel manieren om berichten te verzenden / ontvangen, we gaan het in detail uitleggen:

ResponseStatus sendMessage (const String-bericht);

ResponseContainer ReceiveMessage();

De eerste methode is sendMessage en wordt gebruikt om een string naar een apparaat te sturen in de normale modus.

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

Het andere apparaat doet het gewoon op de lus

if (e32ttl.available() > 1){ResponseContainer rs = e32ttl.receiveMessage(); String bericht = rs.data; // Haal voor het eerst de gegevens op Serial.println(rs.status.getResponseDescription()); Serial.println(bericht); }

Stap 13: Structuur beheren

Als u een complexe structuur wilt verzenden, kunt u deze methode gebruiken

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

Het wordt gebruikt om strucutre te verzenden, bijvoorbeeld:

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

en aan de andere kant kun je het bericht dus ontvangen

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

Lees gedeeltelijke structuur

Als u het eerste deel van het bericht wilt lezen om meer soorten structuren te beheren, kunt u deze methode gebruiken.

ResponseContainer ReceiveInitialMessage (const uint8_t size);

Ik creëer het om een string met type of iets anders te ontvangen om de te laden structuur te identificeren.

struct Messaggione { // Gedeeltelijke structuur zonder typechar-bericht [8]; bool-mitico; }; tekentype [5]; // eerste deel van de structuur ResponseContainer rs = e32ttl.receiveInitialMessage(sizeof(type)); // Zet string in een char array (niet nodig) memcpy (type, rs.data.c_str(), sizeof(type)); Serial.println("LEES TYPE: "); Serial.println(rs.status.getResponseDescription()); Serieel.println(type); // Lees de rest van de structuur ResponseStructContainer rsc = e32ttl.receiveMessage(sizeof(Messaggione)); struct Messaggione messaggione = *(Messaggione*) rsc.data;

Stap 14: Vaste modus in plaats van normale modus

Op dezelfde manier creëer ik een set methoden om te gebruiken met vaste transmissie

Vaste transmissie

U hoeft alleen de verzendmethode te wijzigen, omdat het bestemmingsapparaat de preambule met Address en Channel quando settato il fixed mode niet ontvangt.

Dus voor String-bericht heb je

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

en voor structuur heb je

ResponseStatus sendFixedMessage (byte ADDL, byte ADDH, byte CHAN, const void *message, const uint8_t size);ResponseStatus sendBroadcastFixedMessage (byte CHAN, const void *message, const uint8_t size);

Hier een eenvoudig voorbeeld

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

Vaste verzending heeft meer scenario's

Als u naar een specifiek apparaat verzendt (tweede scenario's Vaste verzending), moet u ADDL, ADDH en CHAN toevoegen om het rechtstreeks te identificeren.

ResponseStatus rs = e32ttl.sendFixedMessage(2, 2, 0x17, "Bericht naar een apparaat");

Als u een bericht naar alle apparaten in een bepaald kanaal wilt sturen, kunt u deze methode gebruiken.

ResponseStatus rs = e32ttl.sendBroadcastFixedMessage (0x17, "Bericht aan een apparaat van een kanaal");

Als u alle broadcastberichten in het netwerk wilt ontvangen, moet u uw ADDH en ADDL instellen op BROADCAST_ADDRESS.

ResponseStructContainer c;c = e32ttl100.getConfiguration(); // Het is belangrijk om de configuratieaanwijzer te krijgen vóór alle andere bewerkingen Configuratieconfiguratie = *(Configuratie*) c.data; Serial.println(c.status.getResponseDescription()); Serial.println(c.status.code); printParameters (configuratie); configuratie. ADDL = BROADCAST_ADDRESS; configuratie. ADDH = BROADCAST_ADDRESS; // Configuratie gewijzigd en ingesteld om de configuratie niet vast te houden ResponseStatus rs = e32ttl100.setConfiguration (configuratie, WRITE_CFG_PWR_DWN_LOSE); Serial.println(rs.getResponseDescription()); Serieel.println(rs.code); printParameters (configuratie);

Stap 15: Bedankt

Nu heb je alle informatie om je werk te doen, maar ik denk dat het belangrijk is om enkele realistische voorbeelden te laten zien om alle mogelijkheden beter te begrijpen.

  1. LoRa E32-apparaat voor Arduino, esp32 of esp8266: instellingen en basisgebruik
  2. LoRa E32-apparaat voor Arduino, esp32 of esp8266: bibliotheek
  3. LoRa E32-apparaat voor Arduino, esp32 of esp8266: configuratie
  4. LoRa E32-apparaat voor Arduino, esp32 of esp8266: vaste transmissie
  5. LoRa E32-apparaat voor Arduino, esp32 of esp8266: energiebesparing en het verzenden van gestructureerde gegevens

Aanbevolen: