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
Video: Bezdrátová komunikace LoRa 3 až 8 km s nízkými náklady na zařízení E32 (sx1278/sx1276) pro Arduino, Esp8266 nebo Esp32: 15 kroků
2024 Autor: John Day | [email protected]. Naposledy změněno: 2024-01-30 08:18
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
Doporučuje:
Vytvořte trasu s nízkými náklady za pár minut!: 10 kroků (s obrázky)
Vytvořte trasu s nízkými náklady za pár minut!: Ve svém předchozím Instructable jsem vám ukázal, jak vytvořit rozvržení modelového vlaku s automatizovaným vlečením. Používal traťový segment s názvem „senzorická trať“. Je to docela užitečná věc v uspořádání železničního modelu. Můžu být použit pro následující: Blokovat
ZAŘÍZENÍ PRO Zjištění krádeže IOT s nízkými náklady (domácí zabezpečení Pi): 7 kroků
ZAŘÍZENÍ PRO Zjištění krádeže IOT s nízkými náklady (Pi Home Security): Systém je navržen tak, aby detekoval vniknutí (neoprávněný vstup) do budovy nebo jiných oblastí. Tento projekt lze použít v obytných, komerčních, průmyslových a vojenských nemovitostech k ochraně před vloupáním nebo poškozením majetku
Dupin-přenosný vícevlnný světelný zdroj s ultra nízkými náklady: 11 kroků
Dupin-přenosný vícevlnný světelný zdroj s ultra nízkými náklady: Pojmenován po Auguste Dupinovi, považovaném za prvního fiktivního detektiva, tento přenosný světelný zdroj vybije jakoukoli 5V USB nabíječku telefonu nebo napájecí zdroj. Každá LED hlava se magneticky zapíná. Pomocí levných 3W hvězdných diod, aktivně chlazených malým ventilátorem
Mikroskop: Interaktivní mikroskop s nízkými náklady: 12 kroků (s obrázky)
Picroscope: Low-cost Interactive Microscope: Hello and Welcome! Jmenuji se Picroscope. Jsem cenově dostupný mikroskop napájený vlastními silami, RPi, který vám umožňuje vytvářet a interagovat s vaším vlastním mikrosvětem. Jsem skvělý praktický projekt pro někoho, koho zajímá biotechnologie a
Box na rukavice s nízkými náklady na výzkum: 35 kroků (s obrázky)
Low-Cost Research Glove Box: Účel: Účelem tohoto Instructable je vést při stavbě nízkonákladové rukavice rukavice. Celkové rozměry krabice jsou 3 ’ x 2 ’ x 2 ’ ¾ ” (D x Š x V) s 1 ’ x 1 ’ x 1 ’ projíždět