Obsah:
- Zásoby
- Krok 1: Knihovna
- Krok 2: Pinout
- Krok 3: Pin AUX
- Krok 4: Plně připojené schéma Esp8266
- Krok 5: Plně připojené schéma Arduino
- Krok 6: Knihovna: Konstruktor
- Krok 7: Začněte
- Krok 8: Konfigurační a informační metoda
- Krok 9: Kontejner odpovědi
- Krok 10: Základní možnost konfigurace
- Krok 11: Odeslání zprávy
- Krok 12: Normální režim přenosu
- Krok 13: Správa struktury
- Krok 14: Opravený režim namísto normálního režimu
- Krok 15: Díky
2025 Autor: John Day | [email protected]. Naposledy změněno: 2025-01-13 06:57
Vytvářím knihovnu pro správu EBYTE E32 na základě řady Semtech zařízení LoRa, velmi výkonného, jednoduchého a levného zařízení.
Verzi 3 km najdete zde, verzi 8 km zde
Mohou pracovat na vzdálenost 3000 m až 8 000 m a mají mnoho funkcí a parametrů. Vytvořil jsem tedy tuto knihovnu, abych zjednodušil používání.
Je to řešení pro získávání dat z metropolitních senzorů nebo pro ovládání dronu.
Zásoby
Arduino UNO
Wemos D1 mini
Verze LoRa E32 TTL 100 3Km
Verze LoRa E32 TTL 1W 8Km
Krok 1: Knihovna
Moji knihovnu najdete zde.
Ke stažení.
Klikněte na tlačítko STAŽENÍ v pravém horním rohu, přejmenujte nekomprimovanou složku LoRa_E32.
Zkontrolujte, zda složka LoRa_E32 obsahuje LoRa_E32.cpp a LoRa_E32.h.
Umístěte složku knihovny LoRa_E32 do složky / libraries /. Pokud je to vaše první knihovna, budete možná muset vytvořit podsložku knihoven.
Restartujte IDE.
Krok 2: Pinout
Jak vidíte, můžete nastavit různé režimy pomocí pinů M0 a M1.
Existuje několik pinů, které lze použít staticky, ale pokud jej připojíte k mikrokontroléru a nakonfigurujete je v knihovně, získáte výkon a můžete ovládat všechny režimy pomocí softwaru, ale příště to vysvětlíme lépe.
Krok 3: Pin AUX
Jak jsem již řekl Není důležité připojovat všechny kolíky k výstupu mikrokontroléru, můžete piny M0 a M1 umístit na VYSOKÉ nebo NÍZKÉ, abyste získali požadovanou konfiguraci, a pokud nepřipojíte AUX, knihovna nastavila přiměřené zpoždění, aby bylo jisté že je operace dokončena.
AUX pin
Při přenosu dat lze použít k probuzení externího MCU a návrat HIGH po dokončení přenosu dat.
Při příjmu AUX bude LOW a vrátí HIGH, když je vyrovnávací paměť prázdná.
Používá se také pro vlastní kontrolu k obnovení normálního provozu (v režimu zapnutí a režimu spánku/programu).
Krok 4: Plně připojené schéma Esp8266
Schéma připojení esp8266 je jednodušší, protože pracuje se stejným napětím logické komunikace (3,3 V).
Je důležité přidat pull-up odpor (4, 7Kohm), abyste získali dobrou stabilitu.
Krok 5: Plně připojené schéma Arduino
Pracovní napětí Arduino je 5v, proto musíme přidat dělič napětí na piny RX M0 a M1 modulu LoRa, aby nedošlo k poškození, více informací získáte zde Dělič napětí: kalkulačka a aplikace.
Můžete použít rezistor 2Kohm na GND a 1Kohm ze signálu, než dát dohromady na RX.
Krok 6: Knihovna: Konstruktor
Vytvořil jsem řadu poměrně početných konstruktorů, protože můžeme mít více možností a situací, které je třeba spravovat.
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);
První sada konstruktorů je vytvořena tak, aby delegovala správu sériových a dalších pinů do knihovny.
rxPin a txPin je kolík pro připojení k UART a jsou povinné.
auxPin je pin, který kontroluje provoz, přenos a stav příjmu (dále vysvětlíme lépe), tento pin Není povinný, pokud jej nenastavíte, použiji zpoždění, aby bylo možné operaci dokončit sama (s latencí).
m0pin a m1Pin jsou piny pro změnu operace MODE (viz tabulka výše), myslím, že se tyto piny v „produkci“budou připojovat přímo VYSOKÉ nebo NÍZKÉ, ale pro test jsou užitečně spravovány knihovnou.
bpsRate je boudrate SoftwareSerial normálně je 9600 (jediná přenosová rychlost v režimu programmin/spánek)
Jednoduchý příklad je
#include "LoRa_E32.h" LoRa_E32 e32ttl100 (2, 3); // RX, TX // LoRa_E32 e32ttl100 (2, 3, 5, 6, 7); // RX, TX
Můžeme přímo použít SoftwareSerial s jiným konstruktorem
LoRa_E32 (HardwareSerial* sériový, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (HardwareSerial* sériový, byte auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (HardwareSerial* sériový, byte auxPin, byte m0Pin, byte m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
Příklad horní s tímto konstruktorem může být podobný.
#include #include "LoRa_E32.h"
SoftwareSerial mySerial (2, 3); // RX, TX
LoRa_E32 e32ttl100 (& mySerial);
// LoRa_E32 e32ttl100 (& mySerial, 5, 7, 6);
Poslední sadou konstruktorů je povolení používat HardwareSerial místo SoftwareSerial.
LoRa_E32 (SoftwareSerial* sériový, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (SoftwareSerial* sériový, byte auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (SoftwareSerial* sériový, byte auxPin, byte m0Pin, byte m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
Krok 7: Začněte
Příkaz begin slouží ke spuštění sériového připojení a pinů ve vstupním a výstupním režimu.
void begin ();
v exekuci je
// Spusťte všechny piny a UART
e32ttl100.begin ();
Krok 8: Konfigurační a informační metoda
Existuje sada metod pro správu konfigurace a získávání informací o zařízení.
ResponseStructContainer getConfiguration ();
ResponseStatus setConfiguration (Konfigurační konfigurace, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);
ResponseStructContainer getModuleInformation ();
void printParameters (konfigurace konfigurace struktury);
ResponseStatus resetModule ();
Krok 9: Kontejner odpovědi
Aby se zjednodušila správa odpovědí, vytvořím sadu kontejnerů, které jsou pro mě velmi užitečné pro správu chyb a vracení obecných dat.
Status odezvy
Toto je kontejner stavu a má 2 jednoduché vstupní body, pomocí kterých můžete získat stavový kód a popis stavového kódu
Serial.println (c.getResponseDescription ()); // Popis kódu
Serial.println (c.code); // 1 pokud úspěch
Kód je
ÚSPĚCH = 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
Tento kontejner je vytvořen pro správu odezvy řetězce a má 2 vstupní body.
data s řetězcem vráceným ze zprávy a stav instance RepsonseStatus.
ResponseContainer rs = e32ttl.receiveMessage ();
Řetězcová zpráva = rs.data;
Serial.println (rs.status.getResponseDescription ());
Serial.println (zpráva);
ResponseStructContainer
Toto je „složitější“kontejner, který používám ke správě struktury. Má stejný vstupní bod jako ResponseContainer, ale data jsou prázdným ukazatelem pro správu složité struktury.
ResponseStructContainer c;
c = e32ttl100.getConfiguration (); // Před všemi ostatními operacemi je důležité získat ukazatel konfigurace
Konfigurace konfigurace = *(Konfigurace *) c.data;
Serial.println (c.status.getResponseDescription ());
Serial.println (c.status.code);
getConfiguration a setConfiguration
První metodou je getConfiguration, kterou můžete použít k obnovení všech dat uložených v zařízení.
ResponseStructContainer getConfiguration ();
Zde příklad použití.
ResponseStructContainer c;
c = e32ttl100.getConfiguration (); // Před všemi ostatními operacemi je důležité získat ukazatel konfigurace
Konfigurace konfigurace = *(Konfigurace *) c.data;
Serial.println (c.status.getResponseDescription ());
Serial.println (c.status.code);
Serial.println (configuration. SPED.getUARTBaudRate ());
Struktura konfigurace obsahuje všechna data nastavení a přidávám řadu funkcí, abych získal veškerý popis jednotlivých dat.
configuration. ADDL = 0x0; // První část addressconfiguration. ADDH = 0x1; // Druhá část konfigurace adresy. CHAN = 0x19; // Konfigurace kanálu. OPTION.fec = FEC_0_OFF; // Konfigurace přepínače opravy chyb vpřed. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // konfigurace režimu přenosu. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // Konfigurace správy vytahování. OPTION.transmissionPower = POWER_17; // Konfigurace vysílacího výkonu dBm. OPTION.wirelessWakeupTime = WAKE_UP_1250; // Doba čekání na konfiguraci probuzení. SPED.airDataRate = AIR_DATA_RATE_011_48; // Konfigurace rychlosti přenosu dat. SPED.uartBaudRate = UART_BPS_115200; // Konfigurace přenosové rychlosti komunikace. SPED.uartParity = MODE_00_8N1; // Paritní bit
Chcete -li získat veškerý popis, máte ekvivalentní funkci pro všechny atributy:
Serial.print (F ("Chan:")); Serial.print (konfigurace. 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 ());
Stejně tak setConfiguration chce konfigurační strukturu, takže si myslím, že lepší způsob, jak spravovat konfiguraci, je načíst aktuální, použít jedinou potřebnou změnu a nastavit ji znovu.
ResponseStatus setConfiguration (Konfigurační konfigurace, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);
konfigurace je dříve ukázána, saveType vám povolí výběr, pokud se změna stane trvale pouze pro aktuální relaci.
ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Je důležité získat ukazatel konfigurace před všemi ostatními operacemi Konfigurace konfigurace = *(Konfigurace *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfigurace); configuration. ADDL = 0x0; configuration. ADDH = 0x1; konfigurace. 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; // Nastavená konfigurace změněna a nastavena tak, aby neuchovávala konfiguraci ResponseStatus rs = e32ttl100.setConfiguration (konfigurace, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfigurace);
Všechny parametry jsou spravovány jako konstantní:
Krok 10: Základní možnost konfigurace
Krok 11: Odeslání zprávy
Nejprve musíme zavést jednoduchou, ale užitečnou metodu pro kontrolu, zda je něco v přijímací vyrovnávací paměti
int dostupný ();
Jednoduše vrátí, kolik bajtů máte v aktuálním streamu.
Krok 12: Normální režim přenosu
Režim normálního/transparentního přenosu se používá k odesílání zpráv na všechna zařízení se stejnou adresou a kanálem.
Existuje mnoho způsobů odesílání/přijímání zpráv, které podrobně vysvětlíme:
ResponseStatus sendMessage (const String message);
ResponseContainer receiveMessage ();
První metoda je sendMessage a používá se k odeslání řetězce na zařízení v normálním režimu.
ResponseStatus rs = e32ttl.sendMessage ("Prova"); Serial.println (rs.getResponseDescription ());
Druhé zařízení jednoduše provede smyčku
if (e32ttl.available ()> 1) {ResponseContainer rs = e32ttl.receiveMessage (); Řetězcová zpráva = rs.data; // Vůbec první získání dat Serial.println (rs.status.getResponseDescription ()); Serial.println (zpráva); }
Krok 13: Správa struktury
Pokud chcete odeslat komplexní strukturu, můžete použít tuto metodu
ResponseStatus sendMessage (const void *message, const uint8_t size); ResponseStructContainer receiveMessage (const uint8_t size);
Používá se k odesílání strucutre, například:
struct Messaggione {char typ [5]; char zpráva [8]; bool mitico; }; struct Messaggione messaggione = {"TEMP", "Peple", true}; ResponseStatus rs = e32ttl.sendMessage (& messaggione, sizeof (Messaggione)); Serial.println (rs.getResponseDescription ());
a na druhé straně můžete zprávu přijmout
ResponseStructContainer rsc = e32ttl.receiveMessage (sizeof (Messaggione)); struct Messaggione messaggione = *(Messaggione *) rsc.data; Serial.println (messaggione.message); Serial.println (messaggione.mitico);
Přečtěte si částečnou strukturu
Pokud si chcete přečíst první část zprávy a spravovat více typů strucutre, můžete použít tuto metodu.
ResponseContainer receiveInitialMessage (velikost konst uint8_t);
Vytvořil jsem to pro příjem řetězce s typem nebo jiným pro identifikaci struktury, která se má načíst.
struct Messaggione {// Částečný strucutre bez zprávy typechar [8]; bool mitico; }; typ char [5]; // první část struktury ResponseContainer rs = e32ttl.receiveInitialMessage (sizeof (typ)); // Vložte řetězec do pole char (není potřeba) memcpy (typ, rs.data.c_str (), sizeof (typ)); Serial.println ("TYP ČTENÍ:"); Serial.println (rs.status.getResponseDescription ()); Serial.println (typ); // Přečíst zbytek struktury ResponseStructContainer rsc = e32ttl.receiveMessage (sizeof (Messaggione)); struct Messaggione messaggione = *(Messaggione *) rsc.data;
Krok 14: Opravený režim namísto normálního režimu
Stejným způsobem vytvářím sadu metod pro použití s pevným přenosem
Opravený přenos
Musíte změnit pouze způsob odesílání, protože cílové zařízení neobdrží preambuli s pevným režimem nastavení adresy a kanálu.
Takže pro řetězcovou zprávu máte
ResponseStatus sendFixedMessage (byte ADDL, byte ADDH, byte CHAN, const String zpráva); ResponseStatus sendBroadcastFixedMessage (byte CHAN, const String zpráva);
a pro strukturu máte
ResponseStatus sendFixedMessage (byte ADDL, byte ADDH, byte CHAN, const void *zpráva, const uint8_t velikost); ResponseStatus sendBroadcastFixedMessage (byte CHAN, const void *zpráva, const uint8_t velikost);
Zde jednoduchý příklad
ResponseStatus rs = e32ttl.sendFixedMessage (0, 0, 0x17, & messaggione, sizeof (Messaggione)); // ResponseStatus rs = e32ttl.sendFixedMessage (0, 0, 0x17, "Ciao");
Pevný přenos má více scénářů
Pokud odesíláte na konkrétní zařízení (druhý scénář Pevný přenos), musíte přidat ADDL, ADDH a CHAN, abyste jej mohli přímo identifikovat.
ResponseStatus rs = e32ttl.sendFixedMessage (2, 2, 0x17, "Zpráva do zařízení");
Pokud chcete odeslat zprávu na všechna zařízení v zadaném kanálu, můžete použít tuto metodu.
ResponseStatus rs = e32ttl.sendBroadcastFixedMessage (0x17, "Zpráva pro zařízení kanálu");
Pokud chcete přijímat všechny vysílané zprávy v síti, musíte nastavit ADDH a ADDL pomocí BROADCAST_ADDRESS.
ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Je důležité získat ukazatel konfigurace před všemi ostatními operacemi Konfigurace konfigurace = *(Konfigurace *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfigurace); configuration. ADDL = BROADCAST_ADDRESS; configuration. ADDH = BROADCAST_ADDRESS; // Nastavená konfigurace změněna a nastavena tak, aby neuchovávala konfiguraci ResponseStatus rs = e32ttl100.setConfiguration (konfigurace, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfigurace);
Krok 15: Díky
Nyní máte všechny informace, které je třeba provést, ale myslím, že je důležité ukázat několik realistických příkladů, abyste lépe porozuměli všem možnostem.
- Zařízení LoRa E32 pro Arduino, esp32 nebo esp8266: nastavení a základní použití
- Zařízení LoRa E32 pro Arduino, esp32 nebo esp8266: knihovna
- Zařízení LoRa E32 pro Arduino, esp32 nebo esp8266: konfigurace
- Zařízení LoRa E32 pro Arduino, esp32 nebo esp8266: pevný přenos
- Zařízení LoRa E32 pro Arduino, esp32 nebo esp8266: úspora energie a odesílání strukturovaných dat