Cuprins:
- Provizii
- Pasul 1: Biblioteca
- Pasul 2: Pinout
- Pasul 3: Pin AUX
- Pasul 4: Schema Esp8266 complet conectată
- Pasul 5: Schema Arduino complet conectată
- Pasul 6: Biblioteca: Constructor
- Pasul 7: Începeți
- Pasul 8: Configurare și metodă de informare
- Pasul 9: Container de răspuns
- Pasul 10: Opțiune de configurare de bază
- Pasul 11: Trimiteți mesajul de primire
- Pasul 12: Mod normal de transmisie
- Pasul 13: Gestionați structura
- Pasul 14: Mod fix în loc de modul normal
- Pasul 15: Mulțumesc
Video: Comunicare fără fir LoRa de 3Km la 8Km cu dispozitiv E32 (sx1278 / sx1276) low cost pentru Arduino, Esp8266 sau Esp32: 15 pași
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:41
Creez o bibliotecă pentru gestionarea EBYTE E32 bazată pe seria Semtech de dispozitive LoRa, dispozitiv foarte puternic, simplu și ieftin.
Puteți găsi versiunea de 3 km aici, versiunea de 8 km aici
Pot funcționa pe o distanță de 3000m până la 8000m și au o mulțime de caracteristici și parametri. Așa că am creat această bibliotecă pentru a simplifica utilizarea.
Este o soluție pentru preluarea datelor de la senzorii metropolitani sau pentru controlul dronelor.
Provizii
Arduino UNO
Wemos D1 mini
Versiunea LoRa E32 TTL 100 3Km
Versiunea LoRa E32 TTL 1W 8Km
Pasul 1: Biblioteca
Puteți găsi biblioteca mea aici.
A descărca.
Faceți clic pe butonul DESCĂRCĂRI din colțul din dreapta sus, redenumiți folderul necomprimat LoRa_E32.
Verificați dacă folderul LoRa_E32 conține LoRa_E32.cpp și LoRa_E32.h.
Plasați folderul de bibliotecă LoRa_E32 / folderul / biblioteci. Poate fi necesar să creați subfolderul bibliotecilor dacă este prima dvs. bibliotecă.
Reporniți IDE-ul.
Pasul 2: Pinout
După cum puteți vedea, puteți seta diferite moduri prin pinii M0 și M1.
Există câțiva pini care pot fi folosiți într-un mod static, dar dacă îl conectați la microcontroler și îl configurați în bibliotecă câștigați în performanță și puteți controla toate modurile prin intermediul software-ului, dar vom explica mai bine în continuare.
Pasul 3: Pin AUX
După cum am spus deja, nu este important să conectați toți pinii la ieșirea microcontrolerului, puteți pune pinii M0 și M1 la HIGH sau LOW pentru a obține configurația dorită și, dacă nu conectați AUX, biblioteca a stabilit o întârziere rezonabilă pentru a fi sigur că operațiunea este finalizată.
Pin AUX
Când transmiteți date, puteți folosi pentru a trezi MCU extern și a reveni la HIGH la finalizarea transferului de date.
Când primiți AUX merg LOW și reveniți HIGH când bufferul este gol.
Este, de asemenea, utilizat pentru auto-verificare pentru a restabili funcționarea normală (la pornire și în modul de repaus / program).
Pasul 4: Schema Esp8266 complet conectată
schema de conexiune esp8266 este mai simplă, deoarece funcționează la aceeași tensiune a comunicațiilor logice (3.3v).
Este important să adăugați rezistență de tracțiune (4, 7 Kohm) pentru a obține o stabilitate bună.
Pasul 5: Schema Arduino complet conectată
Tensiunea de lucru Arduino este de 5v, deci trebuie să adăugăm un divizor de tensiune pe pinul RX M0 și M1 al modulului LoRa pentru a preveni deteriorarea, puteți obține mai multe informații aici Divizor de tensiune: calculator și aplicație.
Puteți utiliza un rezistor de 2 Kohm la GND și 1 Kohm de la semnal decât pus împreună pe RX.
Pasul 6: Biblioteca: Constructor
Am creat un set de constructori destul de numeroși, pentru că putem avea mai multe opțiuni și situații de gestionat.
LoRa_E32 (octet rxPin, octet txPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (octet rxPin, octet txPin, octet auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600); LoRa_E32 (octet rxPin, octet txPin, octet auxPin, octet m0Pin, octet m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
Primul set de constructori sunt creați pentru a delega administrarea Serial și a altor pini bibliotecii.
rxPin și txPin sunt pinul pentru conectarea la UART și sunt obligatorii.
auxPin este un pin care verifică starea de funcționare, transmisie și recepție (vom explica mai bine în continuare), acel pin Nu este obligatoriu, dacă nu îl setați, aplic o întârziere pentru a permite operațiunea să se finalizeze singură (cu latență).
m0pin și m1Pin sunt pinii pentru a schimba modul de funcționare (vezi tabelul de sus), cred că acei pin-uri din „producție” se vor conecta direct HIGH sau LOW, dar pentru testare, acestea sunt utile pentru a fi gestionate de bibliotecă.
bpsRate este boudrate-ul SoftwareSerial este în mod normal 9600 (singura rată de transmisie în modul programmin / sleep)
Un exemplu simplu este
#includeți "LoRa_E32.h" LoRa_E32 e32ttl100 (2, 3); // RX, TX // LoRa_E32 e32ttl100 (2, 3, 5, 6, 7); // RX, TX
Putem folosi direct un SoftwareSerial cu un alt constructor
LoRa_E32 (HardwareSerial * serial, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (HardwareSerial * serial, octet auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (HardwareSerial * serial, octet auxPin, octet m0Pin, octet m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
Exemplul superior cu acest constructor poate fi așa.
#include #include "LoRa_E32.h"
SoftwareSerial mySerial (2, 3); // RX, TX
LoRa_E32 e32ttl100 (& mySerial);
// LoRa_E32 e32ttl100 (& mySerial, 5, 7, 6);
Ultimul set de constructori este de a permite utilizarea unui HardwareSerial în loc de SoftwareSerial.
LoRa_E32 (SoftwareSerial * serial, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (SoftwareSerial * serial, octet auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (SoftwareSerial * serial, octet auxPin, octet m0Pin, octet m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
Pasul 7: Începeți
Comanda begin este utilizată pentru a porni Serial și pinii în modul de intrare și ieșire.
void begin ();
în executare este
// Porniți toți pinii și UART
e32ttl100.begin ();
Pasul 8: Configurare și metodă de informare
Există un set de metode pentru gestionarea configurației și obținerea informațiilor despre dispozitiv.
ResponseStructContainer getConfiguration ();
ResponseStatus setConfiguration (Configurare configurare, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);
ResponseStructContainer getModuleInformation ();
void printParameters (struct Configuration configuration);
ResponseStatus resetModule ();
Pasul 9: Container de răspuns
Pentru a simplifica gestionarea răspunsului creez un set de containere, pentru mine foarte util pentru a gestiona erorile și a returna date generice.
ResponseStatus
Acesta este un container de stare și are 2 puncte de intrare simple, cu acesta puteți obține codul de stare și descrierea codului de stare
Serial.println (c.getResponseDescription ()); // Descrierea codului
Serial.println (c.code); // 1 dacă Succes
Codul este
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
ResponseContainer
Acest container este creat pentru a gestiona răspunsul String și are 2 puncte de intrare.
datele cu șirul au returnat din mesaj și stare o instanță a RepsonseStatus.
ResponseContainer rs = e32ttl.receiveMessage ();
String message = rs.data;
Serial.println (rs.status.getResponseDescription ());
Serial.println (mesaj);
ResponseStructContainer
Acesta este containerul mai „complex”, îl folosesc pentru a gestiona structura, are același punct de intrare ca ResponseContainer, dar datele sunt un pointer gol pentru a gestiona structura complexă.
ResponseStructContainer c;
c = e32ttl100.getConfiguration (); // Este important să obțineți indicatorul de configurare înainte de orice altă operațiune
Configurare configurare = * (Configurare *) c.data;
Serial.println (c.status.getResponseDescription ());
Serial.println (c.status.code);
getConfiguration și setConfiguration
Prima metodă este getConfiguration, o puteți folosi pentru a retrage toate datele stocate pe dispozitiv.
ResponseStructContainer getConfiguration ();
Iată un exemplu de utilizare.
ResponseStructContainer c;
c = e32ttl100.getConfiguration (); // Este important să obțineți indicatorul de configurare înainte de orice altă operațiune
Configurare configurare = * (Configurare *) c.data;
Serial.println (c.status.getResponseDescription ());
Serial.println (c.status.code);
Serial.println (configuration. SPED.getUARTBaudRate ());
Structura de configurare are toate datele de setări și adaug o serie de funcții pentru a obține toate descrierile de date unice.
configuration. ADDL = 0x0; // Prima parte a addressconfiguration. ADDH = 0x1; // A doua parte a configurării adresei. CHAN = 0x19; // Configurarea canalului. OPTION.fec = FEC_0_OFF; // Configurarea comutatorului de corectare a erorilor înainte. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // Configurare mod transmisie. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // Configurare de gestionare pull-up. OPTION.transmissionPower = POWER_17; // configurația puterii de transmisie dBm. OPTION.wirelessWakeupTime = WAKE_UP_1250; // Timp de așteptare pentru configurarea trezirii. SPED.airDataRate = AIR_DATA_RATE_011_48; // Configurarea ratei de date aeriene. SPED.uartBaudRate = UART_BPS_115200; // Configurație baud rate de comunicare. SPED.uartParity = MODE_00_8N1; // Bit de paritate
Aveți funcția echivalentă pentru toate atributele pentru a obține toate descrierile:
Serial.print (F ("Chan:")); Serial.print (configuration. 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 ());
În același mod, setConfiguration dorește o structură de configurare, așa că cred că cel mai bun mod de a gestiona configurația este de a prelua cea curentă, de a aplica singura modificare de care aveți nevoie și de a o seta din nou.
ResponseStatus setConfiguration (Configurare configurare, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);
configurația este strucutra afișată în prealabil, saveType vă permite să alegeți dacă modificarea devine permanentă numai pentru sesiunea curentă.
ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Este important să obțineți indicatorul de configurare înainte de orice altă operațiune Configurare configurație = * (Configurare *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (configurare); configuration. ADDL = 0x0; configuration. ADDH = 0x1; configuration. 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; // Setați configurația modificată și setați să nu dețină configurația ResponseStatus rs = e32ttl100.setConfiguration (configurație, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (configurare);
Parametrii sunt gestionați ca constanți:
Pasul 10: Opțiune de configurare de bază
Pasul 11: Trimiteți mesajul de primire
Mai întâi trebuie să introducem o metodă simplă, dar utilă, pentru a verifica dacă există ceva în tamponul de recepție
int disponibil ();
Pur și simplu returnează câți octeți aveți în fluxul curent.
Pasul 12: Mod normal de transmisie
Modul de transmisie normal / transparent este utilizat pentru a trimite mesaje către toate dispozitivele cu aceeași adresă și canal.
Există o mulțime de metode pentru a trimite / primi mesaje, vom explica în detaliu:
ResponseStatus sendMessage (mesaj const String);
ResponseContainer receiveMessage ();
Prima metodă este sendMessage și este utilizată pentru a trimite un șir către un dispozitiv în modul normal.
ResponseStatus rs = e32ttl.sendMessage ("Prova"); Serial.println (rs.getResponseDescription ());
Celălalt dispozitiv o face pur și simplu pe buclă
if (e32ttl.available ()> 1) {ResponseContainer rs = e32ttl.receiveMessage (); String message = rs.data; // Mai întâi obțineți datele Serial.println (rs.status.getResponseDescription ()); Serial.println (mesaj); }
Pasul 13: Gestionați structura
Dacă doriți să trimiteți o structură complexă, puteți utiliza această metodă
ResponseStatus sendMessage (const void * message, const uint8_t size); ResponseStructContainer receiveMessage (const uint8_t size);
Este folosit pentru a trimite strucutre, de exemplu:
struct Messaggione {tip char [5]; mesaj char [8]; bool mitico; }; struct Messaggione messaggione = {"TEMP", "Peple", true}; ResponseStatus rs = e32ttl.sendMessage (& messaggione, sizeof (Messaggione)); Serial.println (rs.getResponseDescription ());
iar cealaltă parte puteți primi mesajul astfel
ResponseStructContainer rsc = e32ttl.receiveMessage (sizeof (Messaggione)); struct Messaggione messaggione = * (Messaggione *) rsc.data; Serial.println (messaggione.message); Serial.println (messaggione.mitico);
Citiți structura parțială
Dacă doriți să citiți prima parte a mesajului pentru a gestiona mai multe tipuri de structuri, puteți utiliza această metodă.
ResponseContainer receiveInitialMessage (dimensiunea const uint8_t);
Îl creez pentru a primi un șir cu un tip sau altul pentru a identifica structura de încărcat.
struct Messaggione {// Structură parțială fără mesaj tipar [8]; bool mitico; }; tip char [5]; // prima parte a structurii ResponseContainer rs = e32ttl.receiveInitialMessage (sizeof (type)); // Puneți șir într-o matrice de caractere (nu este necesar) memcpy (type, rs.data.c_str (), sizeof (type)); Serial.println ("CITIȚI TIP:"); Serial.println (rs.status.getResponseDescription ()); Serial.println (tip); // Citiți restul structurii ResponseStructContainer rsc = e32ttl.receiveMessage (sizeof (Messaggione)); struct Messaggione messaggione = * (Messaggione *) rsc.data;
Pasul 14: Mod fix în loc de modul normal
În același mod, creez un set de metode de utilizat cu transmisie fixă
Transmisie fixă
Trebuie să schimbați doar metoda de trimitere, deoarece dispozitivul de destinație nu primește preambulul cu Adresă și Canal când se stabilește modul fix.
Deci pentru mesajul String aveți
ResponseStatus sendFixedMessage (octet ADDL, octet ADDH, octet CHAN, const String message); ResponseStatus sendBroadcastFixedMessage (octet CHAN, const String message);
iar pentru structură aveți
ResponseStatus sendFixedMessage (octet ADDL, octet ADDH, octet CHAN, const void * message, const uint8_t size); ResponseStatus sendBroadcastFixedMessage (octet CHAN, const void * message, const uint8_t size);
Iată un exemplu simplu
ResponseStatus rs = e32ttl.sendFixedMessage (0, 0, 0x17, & messaggione, sizeof (Messaggione)); // ResponseStatus rs = e32ttl.sendFixedMessage (0, 0, 0x17, "Ciao");
Transmisia fixă are mai multe scenarii
Dacă trimiteți la un anumit dispozitiv (al doilea scenariu Transmisie fixă) trebuie să adăugați ADDL, ADDH și CHAN pentru al identifica direct.
ResponseStatus rs = e32ttl.sendFixedMessage (2, 2, 0x17, „Mesaj către un dispozitiv”);
Dacă doriți să trimiteți un mesaj către toate dispozitivele dintr-un canal specificat, puteți utiliza această metodă.
ResponseStatus rs = e32ttl.sendBroadcastFixedMessage (0x17, „Mesaj către un dispozitiv al unui canal”);
Dacă doriți să primiți toate mesajele difuzate în rețea, trebuie să setați ADDH și ADDL cu BROADCAST_ADDRESS.
ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Este important să obțineți indicatorul de configurare înainte de orice altă operațiune Configurare configurație = * (Configurare *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (configurare); configuration. ADDL = BROADCAST_ADDRESS; configuration. ADDH = BROADCAST_ADDRESS; // Setați configurația modificată și setați să nu dețină configurația ResponseStatus rs = e32ttl100.setConfiguration (configurație, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (configurare);
Pasul 15: Mulțumesc
Acum aveți toate informațiile pentru a vă face treaba, dar cred că este important să arătați câteva exemple realiste pentru a înțelege mai bine toate posibilitățile.
- Dispozitiv LoRa E32 pentru Arduino, esp32 sau esp8266: setări și utilizare de bază
- Dispozitiv LoRa E32 pentru Arduino, esp32 sau esp8266: bibliotecă
- Dispozitiv LoRa E32 pentru Arduino, esp32 sau esp8266: configurare
- Dispozitiv LoRa E32 pentru Arduino, esp32 sau esp8266: transmisie fixă
- Dispozitiv LoRa E32 pentru Arduino, esp32 sau esp8266: economisirea energiei și trimiterea de date structurate
Recomandat:
Comunicare criptată fără fir Arduino: 5 pași
Comunicare criptată fără fir Arduino: Bună ziua tuturor, În acest al doilea articol, vă voi explica cum să utilizați cipul Atecc608a pentru a vă asigura comunicația fără fir. Pentru aceasta, voi folosi NRF24L01 + pentru partea fără fir și Arduino UNO. Microcipul ATECC608A a fost proiectat de
Robot Arduino fără fir folosind modulul HC12 fără fir: 7 pași
Robot wireless Arduino folosind modulul HC12 fără fir: Hei băieți, bine ați revenit. În postarea mea anterioară, am explicat ce este un circuit H Bridge, circuitul de conducător auto L293D IC, piggybacking L293D driverul IC pentru conducerea driverelor de curent mare și modul în care puteți proiecta și crea propriul dvs. driver de motor L293D
Microfon fără fir DIY la sistem de chitară fără fir: 4 pași
Sistem de microfon fără fir DIY la sistem de chitară fără fir: Am urmărit câteva videoclipuri și câteva trupe și aproape dintre ele folosesc un sistem wireless pe chitară. Înnebunind, mișcându-se, mergând și fac tot ce vor fără cablu, așa că visez să am unul .. Dar … pentru mine acum este prea scump, așa că am ajuns la asta
Răcitor / suport pentru laptop cu cost zero (fără lipici, fără găurire, fără piulițe și șuruburi, fără șuruburi): 3 pași
Zero Cost Laptop Cooler / Stand (Fără lipici, fără găurire, fără piulițe și șuruburi, fără șuruburi): ACTUALIZARE: VĂ RUGĂM VOTĂ PENTRU MEA MEA MEA INTRAREA PE www.instructables.com/id/Zero-Cost-Aluminum-Furnace-No-Propane-No-Glue-/ SAU POATE VOTA PENTRU CEL MAI BUN PRIETEN AL MEU
Hack un clopoțel fără fir într-un comutator de alarmă fără fir sau întrerupător de pornire / oprire: 4 pași
Spargerea unui clopoțel wireless într-un comutator de alarmă fără fir sau întrerupător de pornire / oprire: recent am construit un sistem de alarmă și l-am instalat în casa mea. Am folosit întrerupătoare magnetice la ușă și le-am conectat prin pod la ferestre. Ferestrele erau o altă poveste, iar cablarea dură a acestora nu era o opțiune. Aveam nevoie de o soluție wireless și asta este