Isi kandungan:

Komunikasi Tanpa Wayar LoRa 3Km hingga 8Km Dengan Peranti E32 Kos Rendah (sx1278 / sx1276) untuk Arduino, Esp8266 atau Esp32: 15 Langkah
Komunikasi Tanpa Wayar LoRa 3Km hingga 8Km Dengan Peranti E32 Kos Rendah (sx1278 / sx1276) untuk Arduino, Esp8266 atau Esp32: 15 Langkah

Video: Komunikasi Tanpa Wayar LoRa 3Km hingga 8Km Dengan Peranti E32 Kos Rendah (sx1278 / sx1276) untuk Arduino, Esp8266 atau Esp32: 15 Langkah

Video: Komunikasi Tanpa Wayar LoRa 3Km hingga 8Km Dengan Peranti E32 Kos Rendah (sx1278 / sx1276) untuk Arduino, Esp8266 atau Esp32: 15 Langkah
Video: Tes Kirim Data Wireless Jauh Tanpa Internet LoRa VLOG295 2024, Julai
Anonim
Komunikasi Tanpa Wayar LoRa 3Km hingga 8Km Dengan Peranti E32 Kos Rendah (sx1278 / sx1276) untuk Arduino, Esp8266 atau Esp32
Komunikasi Tanpa Wayar LoRa 3Km hingga 8Km Dengan Peranti E32 Kos Rendah (sx1278 / sx1276) untuk Arduino, Esp8266 atau Esp32

Saya membuat perpustakaan untuk menguruskan EBYTE E32 berdasarkan peranti LoRa siri Semtech, peranti yang sangat kuat, sederhana dan murah.

Anda boleh mendapatkan versi 3Km di sini, versi 8Km di sini

Mereka boleh bekerja pada jarak 3000m hingga 8000m, dan mereka mempunyai banyak ciri dan parameter. Oleh itu, saya membuat perpustakaan ini untuk memudahkan penggunaannya.

Ini adalah penyelesaian untuk mengambil data dari sensor metropolitan atau untuk mengawal drone.

Bekalan

Arduino UNO

Wemos D1 mini

LoRa E32 TTL 100 versi 3Km

Versi LoRa E32 TTL 1W 8Km

Langkah 1: Perpustakaan

Perpustakaan
Perpustakaan

Anda boleh menemui perpustakaan saya di sini.

Untuk muat turun.

Klik butang DOWNLOADS di sudut kanan atas, namakan semula folder LoRa_E32 yang tidak dimampatkan.

Pastikan folder LoRa_E32 mengandungi LoRa_E32.cpp dan LoRa_E32.h.

Letakkan folder perpustakaan LoRa_E32 anda / pustaka / folder. Anda mungkin perlu membuat subfolder perpustakaan jika itu adalah perpustakaan pertama anda.

Mulakan semula IDE.

Langkah 2: Pinout

Pinout
Pinout
Pinout
Pinout
Pinout
Pinout

Seperti yang anda lihat, anda boleh menetapkan pelbagai mod melalui pin M0 dan M1.

Terdapat beberapa pin yang dapat digunakan dengan cara statik, tetapi jika anda menyambungkannya ke mikrokontroler dan mengkonfigurasinya di perpustakaan, anda akan mendapat prestasi dan anda dapat mengawal semua mod melalui perisian, tetapi kami akan menerangkan dengan lebih baik selanjutnya.

Langkah 3: Pin AUX

Pin AUX
Pin AUX
Pin AUX
Pin AUX
Pin AUX
Pin AUX

Seperti yang telah saya katakan Tidak penting untuk menyambungkan semua pin ke output mikrokontroler, anda boleh meletakkan pin M0 dan M1 ke TINGGI atau RENDAH untuk mendapatkan konfigurasi yang diinginkan, dan jika anda tidak menyambungkan AUX, perpustakaan menetapkan kelewatan yang munasabah untuk memastikan bahawa operasi itu selesai.

Pin AUX

Semasa penghantaran data dapat digunakan untuk membangunkan MCU luaran dan mengembalikan TINGGI pada selesai pemindahan data.

Semasa menerima AUX akan RENDAH dan kembali TINGGI ketika buffer kosong.

Ia juga digunakan untuk pemeriksaan sendiri untuk mengembalikan operasi normal (pada mod nyalaan dan mod tidur / program).

Langkah 4: Skema Terhubung Sepenuhnya Esp8266

Skema Bersambung Sepenuhnya Esp8266
Skema Bersambung Sepenuhnya Esp8266
Skema Bersambung Sepenuhnya Esp8266
Skema Bersambung Sepenuhnya Esp8266

Skema sambungan esp8266 lebih mudah kerana berfungsi pada voltan komunikasi logik yang sama (3.3v).

Penting untuk menambahkan perintang tarik (4, 7Kohm) untuk mendapatkan kestabilan yang baik.

Langkah 5: Skema Bersambung sepenuhnya Arduino

Skema Bersambung sepenuhnya Arduino
Skema Bersambung sepenuhnya Arduino
Skema Bersambung sepenuhnya Arduino
Skema Bersambung sepenuhnya Arduino

Voltan kerja Arduino adalah 5v, jadi kita perlu menambahkan pembahagi voltan pada modul RX pin M0 dan M1 dari LoRa untuk mengelakkan kerosakan, anda boleh mendapatkan lebih banyak maklumat di sini Pembahagi voltan: kalkulator dan aplikasi.

Anda boleh menggunakan perintang 2Kohm ke GND dan 1Kohm dari isyarat daripada disatukan pada RX.

Langkah 6: Perpustakaan: Pembina

Saya membuat satu set konstruktor yang banyak, kerana kita boleh mempunyai lebih banyak pilihan dan situasi untuk diuruskan.

LoRa_E32 (bait rxPin, bait txPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (bait rxPin, bait 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);

Set konstruktor pertama dibuat untuk mewakilkan pengurusan Serial dan pin lain ke perpustakaan.

rxPin dan txPin adalah pin untuk menyambung ke UART dan mereka wajib.

auxPin adalah pin yang memeriksa status operasi, penghantaran dan penerimaan (kita akan menerangkan dengan lebih baik seterusnya), pin itu Tidak wajib, jika anda tidak menetapkannya, saya menggunakan kelewatan untuk membolehkan operasi selesai sendiri (dengan kependaman).

m0pin dan m1Pin adalah pin untuk menukar MODE operasi (lihat jadual di atas), saya rasa pin dalam "produksi" ini akan dihubungkan secara langsung TINGGI atau RENDAH, tetapi untuk ujian, ia berguna untuk dikendalikan oleh perpustakaan.

bpsRate adalah boudrate dari SoftwareSerial biasanya adalah 9600 (satu-satunya kadar baud dalam mod program / tidur)

Contoh mudah adalah

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

Kita boleh menggunakan SoftwareSerial secara langsung dengan konstruktor lain

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

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

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

Contoh atas dengan pembina ini boleh dibuat seperti itu.

#include #include "LoRa_E32.h"

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

LoRa_E32 e32ttl100 (& mySerial);

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

Kumpulan konstruktor terakhir adalah membenarkan penggunaan HardwareSerial dan bukannya SoftwareSerial.

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

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

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

Langkah 7: Mulakan

Perintah mula digunakan untuk memulakan Serial dan pin dalam mod input dan output.

kekosongan bermula ();

dalam pelaksanaan adalah

// Mulakan semua pin dan UART

e32ttl100.begin ();

Langkah 8: Kaedah Konfigurasi dan Maklumat

Terdapat satu set kaedah untuk mengatur konfigurasi dan mendapatkan maklumat mengenai peranti.

ResponseStructContainer getConfiguration ();

ResponseStatus setConfiguration (Konfigurasi konfigurasi, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

ResponseStructContainer getModuleInformation ();

void printParameters (struktur Konfigurasi konfigurasi);

ResponseStatus resetModule ();

Langkah 9: Bekas Respons

Untuk mempermudah pengurusan respons, saya membuat satu set wadah, bagi saya sangat berguna untuk menguruskan kesilapan dan mengembalikan data generik.

Status Respons

Ini adalah bekas status dan mempunyai 2 titik masuk yang mudah, dengan ini anda boleh mendapatkan kod status dan keterangan kod status

Serial.println (c.getResponseDescription ()); // Penerangan kod

Serial.println (c.code); // 1 sekiranya Berjaya

Kodnya adalah

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

Bekas Respons

Bekas ini dibuat untuk menguruskan tindak balas String dan mempunyai 2 titik masuk.

data dengan rentetan dikembalikan dari mesej dan status contoh RepsonseStatus.

ResponseContainer rs = e32ttl.receiveMessage ();

Mesej rentetan = rs.data;

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

Serial.println (mesej);

ResponseStructContainer

Ini adalah wadah yang lebih "kompleks", saya menggunakannya untuk menguruskan struktur, ia mempunyai titik masuk yang sama dari ResponseContainer tetapi data adalah penunjuk yang tidak sah untuk menguruskan struktur yang kompleks.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Penting untuk mendapatkan penunjuk konfigurasi sebelum semua operasi lain

Konfigurasi konfigurasi = * (Konfigurasi *) c.data;

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

Serial.println (c.status.code);

getConfiguration dan setConfiguration

Kaedah pertama adalah getConfiguration, anda boleh menggunakannya untuk mendapatkan semula semua data yang tersimpan pada peranti.

ResponseStructContainer getConfiguration ();

Berikut adalah contoh penggunaan.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Penting untuk mendapatkan penunjuk konfigurasi sebelum semua operasi lain

Konfigurasi konfigurasi = * (Konfigurasi *) c.data;

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

Serial.println (c.status.code);

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

Struktur konfigurasi mempunyai semua data pengaturan, dan saya menambahkan serangkaian fungsi untuk mendapatkan semua keterangan tentang data tunggal.

konfigurasi. ADDL = 0x0; // Bahagian pertama dari alamatconfiguration. ADDH = 0x1; // Bahagian kedua konfigurasi alamat. CHAN = 0x19; // Konfigurasi saluran. OPTION.fec = FEC_0_OFF; // Konfigurasi suis pembetulan ralat ke hadapan. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // Konfigurasi mod penghantaran. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // Konfigurasi pengurusan pull-up. OPTION.transmissionPower = POWER_17; // konfigurasi kuasa penghantaran dBm. OPTION.wirelessWakeupTime = WAKE_UP_1250; // Tunggu masa untuk bangun konfigurasi. SPED.airDataRate = AIR_DATA_RATE_011_48; // Konfigurasi kadar data udara. SPED.uartBaudRate = UART_BPS_115200; // Konfigurasi kadar baud komunikasi. SPED.uartParity = MODE_00_8N1; // Pariti sedikit

Anda mempunyai fungsi yang setara untuk semua atribut untuk mendapatkan semua keterangan:

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

Dengan cara yang sama setConfiguration ingin konfigurasi, jadi saya rasa cara yang lebih baik untuk menguruskan konfigurasi adalah dengan mengambil yang sekarang, gunakan satu-satunya perubahan yang anda perlukan dan tetapkan lagi.

ResponseStatus setConfiguration (Konfigurasi konfigurasi, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

konfigurasi adalah pertunjukan sebelumnya, izin saveType kepada anda untuk memilih sekiranya perubahan menjadi kekal hanya untuk sesi semasa.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Penting untuk mendapatkan penunjuk konfigurasi sebelum semua operasi lain Konfigurasi konfigurasi = * (Konfigurasi *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfigurasi); konfigurasi. ADDL = 0x0; konfigurasi. ADDH = 0x1; konfigurasi. CHAN = 0x19; konfigurasi. OPTION.fec = FEC_0_OFF; konfigurasi. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; konfigurasi. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; konfigurasi. OPTION.transmissionPower = POWER_17; konfigurasi. OPTION.wirelessWakeupTime = WAKE_UP_1250; konfigurasi. SPED.airDataRate = AIR_DATA_RATE_011_48; konfigurasi. SPED.uartBaudRate = UART_BPS_115200; konfigurasi. SPED.uartParity = MODE_00_8N1; // Set konfigurasi diubah dan diatur untuk tidak menahan konfigurasi ResponseStatus rs = e32ttl100.setConfiguration (konfigurasi, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfigurasi);

Parameter semuanya dikendalikan sebagai pemalar:

Langkah 10: Pilihan Konfigurasi Asas

Pilihan Konfigurasi Asas
Pilihan Konfigurasi Asas

Langkah 11: Hantar Mesej Terima

Mula-mula kita mesti memperkenalkan kaedah yang mudah tetapi berguna untuk memeriksa apakah ada sesuatu yang ada dalam buffer penerimaan

int tersedia ();

Cukup mengembalikan berapa bait yang anda ada dalam aliran semasa.

Langkah 12: Mod Penghantaran Biasa

Mod Penghantaran Biasa
Mod Penghantaran Biasa

Mod penghantaran Normal / Transparan digunakan untuk mengirim mesej ke semua peranti dengan alamat dan saluran yang sama.

Terdapat banyak kaedah untuk menghantar / menerima mesej, kami akan menerangkan secara terperinci:

ResponseStatus sendMessage (const String message);

ResponseContainer menerimaMessage ();

Kaedah pertama adalah sendMessage dan digunakan untuk menghantar String ke peranti dalam mod Normal.

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

Peranti lain hanya dilakukan pada gelung

jika (e32ttl.available ()> 1) {ResponseContainer rs = e32ttl.receiveMessage (); Mesej rentetan = rs.data; // Pertama sekali dapatkan data Serial.println (rs.status.getResponseDescription ()); Serial.println (mesej); }

Langkah 13: Uruskan Struktur

Sekiranya anda ingin menghantar struktur yang kompleks, anda boleh menggunakan kaedah ini

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

Ia digunakan untuk menghantar strucutre, misalnya:

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

dan di sisi lain anda boleh menerima mesej itu

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

Baca sebahagian struktur

Sekiranya anda ingin membaca bahagian pertama mesej untuk menguruskan lebih banyak jenis strucutre, anda boleh menggunakan kaedah ini.

ResponseContainer acceptInitialMessage (saiz uint8_t);

Saya membuatnya untuk menerima rentetan dengan jenis atau yang lain untuk mengenal pasti struktur yang akan dimuat.

struct Messaggione {// Strucutre separa tanpa mesej typechar [8]; bool mitico; }; jenis char [5]; // bahagian pertama struktur ResponseContainer rs = e32ttl.receiveInitialMessage (sizeof (type)); // Masukkan rentetan dalam array char (tidak diperlukan) memcpy (type, rs.data.c_str (), sizeof (type)); Serial.println ("BACA JENIS:"); Serial.println (rs.status.getResponseDescription ()); Serial.println (jenis); // Baca sisa struktur ResponseStructContainer rsc = e32ttl.receiveMessage (sizeof (Messaggione)); struct Messaggione messaggione = * (Messaggione *) rsc.data;

Langkah 14: Tetap Mod Bukan Mod Normal

Dengan cara yang sama saya membuat satu set kaedah untuk digunakan dengan penghantaran tetap

Memperbaiki penghantaran

Anda hanya perlu mengubah kaedah pengiriman, kerana perangkat tujuan tidak menerima mukadimah dengan Alamat tetap dan saluran quando settato il mode tetap.

Jadi untuk mesej String yang anda ada

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

dan untuk struktur yang anda ada

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

Berikut adalah contoh mudah

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

Transmisi yang diperbaiki mempunyai lebih banyak senario

Sekiranya anda menghantar ke peranti tertentu (senario kedua Transmisi tetap) anda mesti menambahkan ADDL, ADDH dan CHAN untuk mengenal pasti secara langsung.

ResponseStatus rs = e32ttl.sendFixedMessage (2, 2, 0x17, "Mesej ke peranti");

Sekiranya anda ingin menghantar mesej ke semua peranti di Saluran yang ditentukan, anda boleh menggunakan kaedah ini.

ResponseStatus rs = e32ttl.sendBroadcastFixedMessage (0x17, "Mesej ke peranti saluran");

Sekiranya anda mahu menerima semua mesej siaran dalam rangkaian, anda mesti menetapkan ADDH dan ADDL anda dengan BROADCAST_ADDRESS.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Penting untuk mendapatkan penunjuk konfigurasi sebelum semua operasi lain Konfigurasi konfigurasi = * (Konfigurasi *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfigurasi); konfigurasi. ADDL = BROADCAST_ADDRESS; konfigurasi. ADDH = BROADCAST_ADDRESS; // Set konfigurasi diubah dan diatur untuk tidak menahan konfigurasi ResponseStatus rs = e32ttl100.setConfiguration (konfigurasi, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfigurasi);

Langkah 15: Terima kasih

Sekarang anda mempunyai semua maklumat untuk melakukan kerja anda, tetapi saya rasa penting untuk menunjukkan beberapa contoh yang realistik untuk tidak memahami kemungkinan yang lebih baik.

  1. Peranti LoRa E32 untuk Arduino, esp32 atau esp8266: tetapan dan penggunaan asas
  2. Peranti LoRa E32 untuk perpustakaan Arduino, esp32 atau esp8266:
  3. Peranti LoRa E32 untuk Arduino, esp32 atau esp8266: konfigurasi
  4. Peranti LoRa E32 untuk Arduino, esp32 atau esp8266: transmisi tetap
  5. Peranti LoRa E32 untuk Arduino, esp32 atau esp8266: penjimatan kuasa dan penghantaran data berstruktur

Disyorkan: