Mündəricat:

Arduino, Esp8266 və ya Esp32 üçün aşağı qiymətli E32 (sx1278/sx1276) cihazı ilə LoRa 3Km -dən 8Km -ə qədər Simsiz Əlaqə: 15 Addım
Arduino, Esp8266 və ya Esp32 üçün aşağı qiymətli E32 (sx1278/sx1276) cihazı ilə LoRa 3Km -dən 8Km -ə qədər Simsiz Əlaqə: 15 Addım

Video: Arduino, Esp8266 və ya Esp32 üçün aşağı qiymətli E32 (sx1278/sx1276) cihazı ilə LoRa 3Km -dən 8Km -ə qədər Simsiz Əlaqə: 15 Addım

Video: Arduino, Esp8266 və ya Esp32 üçün aşağı qiymətli E32 (sx1278/sx1276) cihazı ilə LoRa 3Km -dən 8Km -ə qədər Simsiz Əlaqə: 15 Addım
Video: Learn Arduino in 30 Minutes: Examples and projects 2024, Iyul
Anonim
Arduino, Esp8266 və ya Esp32 üçün aşağı qiymətli E32 (sx1278/sx1276) Cihazı ilə LoRa 3Km -dən 8Km -ə qədər Simsiz Əlaqə
Arduino, Esp8266 və ya Esp32 üçün aşağı qiymətli E32 (sx1278/sx1276) Cihazı ilə LoRa 3Km -dən 8Km -ə qədər Simsiz Əlaqə

Çox güclü, sadə və ucuz bir cihaz olan LoRa cihazının Semtech seriyasına əsaslanan EBYTE E32 idarə etmək üçün bir kitabxana yaradıram.

3km versiyasını burada, 8km versiyasını burada tapa bilərsiniz

3000 m -dən 8000 m -ə qədər məsafədə işləyə bilərlər və bir çox xüsusiyyətə və parametrə malikdirlər. İstifadəni asanlaşdırmaq üçün bu kitabxananı yaradıram.

Metropoliten sensorlarından məlumat almaq və ya dronu idarə etmək üçün bir həlldir.

Təchizat

Arduino UNO

Wemos D1 mini

LoRa E32 TTL 100 3km versiyası

LoRa E32 TTL 1W 8Km versiyası

Addım 1: Kitabxana

Kitabxana
Kitabxana

Kitabxanamı burada tapa bilərsiniz.

Yükləmək üçün.

Sağ üst köşedeki YÜKLƏMƏ düyməsini basın, sıxılmamış qovluğun adını LoRa_E32 adlandırın.

LoRa_E32 qovluğunda LoRa_E32.cpp və LoRa_E32.h olduğunu yoxlayın.

LoRa_E32 kitabxana qovluğunu / libraries / qovluğunuza yerləşdirin. İlk kitabxananız varsa, kitabxanalar alt qovluğunu yaratmağınız lazım ola bilər.

IDE -ni yenidən başladın.

Addım 2: Pinout

Pinout
Pinout
Pinout
Pinout
Pinout
Pinout

Gördüyünüz kimi, M0 və M1 sancaqlar vasitəsilə müxtəlif rejimlər qura bilərsiniz.

Statik bir şəkildə istifadə edilə bilən bəzi pinlər var, ancaq onu mikro nəzarətçiyə bağlasanız və kitabxanada konfiqurasiya etsəniz, performans qazanırsınız və proqram vasitəsilə bütün rejimi idarə edə bilərsiniz, amma bundan sonra daha yaxşı izah edəcəyik.

Addım 3: AUX Pin

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

Artıq dediyim kimi, bütün pinləri mikrodenetleyicinin çıxışına bağlamağın əhəmiyyəti yoxdur, M0 və M1 sancaqlarını YÜKSƏLİ və ya YÜKSƏK olaraq təyin edə bilərsiniz və AUX -ə qoşulmasanız, kitabxana əmin olmaq üçün ağlabatan bir gecikmə təyin edir. əməliyyatın tamamlandığını.

AUX pin

Məlumat ötürülməsi zamanı xarici MCU -nu oyatmaq və məlumat ötürülməsi bitdikdə YÜKSƏK qaytarmaq üçün istifadə edilə bilər.

AUX aldıqda LOW gedir və tampon boş olduqda YÜKSƏ qaytarılır.

Normal işini bərpa etmək üçün özünü yoxlamaq üçün də istifadə olunur (açma və yuxu/proqram rejimində).

Addım 4: Tam Bağlı Schema Esp8266

Tam Bağlı Şema Esp8266
Tam Bağlı Şema Esp8266
Tam Bağlı Şema Esp8266
Tam Bağlı Şema Esp8266

esp8266 əlaqə sxemi daha sadədir, çünki eyni məntiqi rabitə gərginliyində işləyir (3.3v).

Yaxşı bir sabitlik əldə etmək üçün çəkmə rezistoru (4, 7Kohm) əlavə etmək vacibdir.

Addım 5: Tamamilə Bağlı Schema Arduino

Tam Bağlı Şema Arduino
Tam Bağlı Şema Arduino
Tam Bağlı Şema Arduino
Tam Bağlı Şema Arduino

Arduino iş gərginliyi 5v -dir, buna görə də zədələnməməsi üçün LoRa modulunun RX pin M0 və M1 -ə bir gərginlik bölücü əlavə etməliyik, burada daha çox məlumat əldə edə bilərsiniz Gərginlik bölücü: kalkulyator və tətbiq.

RX -də birləşdirməkdənsə siqnaldan GND və 1Kohm üçün 2Kohm rezistor istifadə edə bilərsiniz.

Addım 6: Kitabxana: Konstruktor

Çox sayda konstruktor hazırladım, çünki idarə etmək üçün daha çox seçimimiz və vəziyyətimiz ola bilər.

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

LoRa_E32 (bayt rxPin, bayt txPin, bayt auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600); LoRa_E32 (bayt rxPin, bayt txPin, bayt auxPin, bayt m0Pin, bayt m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

İlk konstruktor dəsti, Serial və digər pinlərin idarə edilməsini kitabxanaya həvalə etmək üçün yaradılır.

rxPin və txPin UART -a qoşulmaq üçün pindir və məcburidir.

auxPin, əməliyyatı, ötürülmə və qəbul vəziyyətini yoxlayan bir pindir (bundan sonra daha yaxşı izah edəcəyik), bu pin Məcburi deyil, bunu təyin etməsəniz, əməliyyatın özünü tamamlamasına icazə vermək üçün gecikmə tətbiq edirəm (gecikmə ilə).

m0pin və m1Pin, MODE rejimini dəyişdirmək üçün pinlərdir (yuxarıdakı cədvələ baxın), "istehsalda" bu pinlərin birbaşa YÜKSƏK və ya DÜŞÜK bağlanacağını düşünürəm, amma test üçün kitabxana tərəfindən idarə olunmaq üçün faydalıdır.

bpsRate, SoftwareSerial -ın boudrateidir normal olaraq 9600 (proqramçı/yuxu rejimində yeganə baud dərəcəsi)

Sadə bir nümunədir

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

Başqa bir konstruktorla birbaşa bir SoftwareSerial istifadə edə bilərik

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

LoRa_E32 (HardwareSerial* serial, bayt auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (HardwareSerial* serial, bayt auxPin, bayt m0Pin, bayt m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

Bu konstruktorun yuxarıdakı nümunəsi belə edilə bilər.

#daxil et "daxil et" LoRa_E32.h"

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

LoRa_E32 e32ttl100 (& mySerial);

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

Son konstruktor dəsti, SoftwareSerial yerinə HardwareSerialdan istifadə etməyə icazə verməkdir.

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

LoRa_E32 (SoftwareSerial* serial, bayt auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (SoftwareSerial* serial, bayt auxPin, bayt m0Pin, bayt m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

Addım 7: Başlayın

Başlat əmri giriş və çıxış rejimində Seri və pinləri işə salmaq üçün istifadə olunur.

void start ();

icradadır

// Bütün pinləri və UART -ı işə salın

e32ttl100.begin ();

Addım 8: Konfiqurasiya və Məlumat Metodu

Konfiqurasiyanı idarə etmək və cihaz haqqında məlumat əldə etmək üçün bir çox üsul var.

ResponseStructContainer getConfiguration ();

ResponseStatus setConfiguration (Konfiqurasiya konfiqurasiyası, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

ResponseStructContainer getModuleInformation ();

void printParameters (struct Konfiqurasiya konfiqurasiyası);

ResponseStatus resetModule ();

Addım 9: Cavab Konteyner

Cavab idarəetməsini asanlaşdırmaq üçün səhvləri idarə etmək və ümumi məlumatları qaytarmaq üçün çox faydalı bir konteyner yaradıram.

Response Status

Bu status konteyneridir və 2 sadə giriş nöqtəsinə malikdir, bununla status kodunu və status kodunun təsvirini əldə edə bilərsiniz

Serial.println (c.getResponseDescription ()); // Kodun təsviri

Serial.println (c. kodu); Uğurlu olarsa // 1

Kod var

Uğur = 1, ERR_NAMAN, 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

Bu konteyner String cavabını idarə etmək və 2 giriş nöqtəsinə sahib olmaq üçün yaradılmışdır.

simli məlumatlar RepsonseStatusun bir nümunəsi olan mesajdan və statusdan qaytarılır.

ResponseContainer rs = e32ttl.receiveMessage ();

String mesajı = rs.data;

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

Serial.println (mesaj);

ResponseStructContainer

Bu daha "mürəkkəb" konteynerdir, bunu quruluşu idarə etmək üçün istifadə edirəm, eyni ResponseContainer giriş nöqtəsinə malikdir, lakin məlumatlar kompleks quruluşu idarə etmək üçün boş bir göstəricidir.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Bütün digər əməliyyatlardan əvvəl konfiqurasiya göstəricisi əldə etmək vacibdir

Konfiqurasiya konfiqurasiyası = *(Konfiqurasiya *) c.data;

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

Serial.println (c.status.code);

getConfiguration və setConfiguration

Birinci üsul getConfigurationdır, cihazda saxlanan bütün məlumatları geri qaytarmaq üçün istifadə edə bilərsiniz.

ResponseStructContainer getConfiguration ();

Burada bir istifadə nümunəsi.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Bütün digər əməliyyatlardan əvvəl konfiqurasiya göstəricisi əldə etmək vacibdir

Konfiqurasiya konfiqurasiyası = *(Konfiqurasiya *) c.data;

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

Serial.println (c.status.code);

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

Konfiqurasiya quruluşunda bütün parametrlər məlumatları var və tək məlumatların bütün təsvirini almaq üçün bir sıra funksiyalar əlavə edirəm.

konfiqurasiya. ADDL = 0x0; // Adres konfiqurasiyasının birinci hissəsi. ADDH = 0x1; // Ünvan konfiqurasiyasının ikinci hissəsi. CHAN = 0x19; // Kanal konfiqurasiyası. OPTION.fec = FEC_0_OFF; // İrəli xəta düzəliş açarı konfiqurasiyası. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // Transmissiya rejimi konfiqurasiyası. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // Pull-up idarəetmə konfiqurasiyası. OPTION.transmissionPower = POWER_17; // dBm ötürmə gücü konfiqurasiyası. OPTION.wirelessWakeupTime = WAKE_UP_1250; // Uyanma konfiqurasiyasını gözləyin. SPED.airDataRate = AIR_DATA_RATE_011_48; // Hava məlumatı dərəcəsi konfiqurasiyası. SPED.uartBaudRate = UART_BPS_115200; // Rabitə ötürmə dərəcəsi konfiqurasiyası. SPED.uartParity = MODE_00_8N1; // Parite bit

Bütün təsviri əldə etmək üçün bütün atributlar üçün eyni funksiyaya sahibsiniz:

Serial.print (F ("Chan:")); Serial.print (konfiqurasiya. 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 (konfiqurasiya. OPTION.fixedTransmission, BIN); Serial.print (" ->"); Serial.println (configuration. OPTION.getFixedTransmissionDescription ()); Serial.print (F ("OptionPullup:")); Serial.print (konfiqurasiya. OPTION.ioDriveMode, BIN); Serial.print (" ->"); Serial.println (configuration. OPTION.getIODroveModeDescription ()); Serial.print (F ("OptionWakeup:")); Serial.print (konfiqurasiya. OPTION.wirelessWakeupTime, BIN); Serial.print (" ->"); Serial.println (configuration. OPTION.getWirelessWakeUPTimeDescription ()); Serial.print (F ("OptionFEC:")); Serial.print (konfiqurasiya. OPTION.fec, BIN); Serial.print (" ->"); Serial.println (konfiqurasiya. OPTION.getFECDescription ()); Serial.print (F ("OptionPower:")); Serial.print (konfiqurasiya. OPTION.transmissionPower, BIN); Serial.print (" ->"); Serial.println (configuration. OPTION.getTransmissionPowerDescription ());

Eyni şəkildə setConfiguration bir konfiqurasiya quruluşu istəyir, buna görə də konfiqurasiyanı idarə etməyin ən yaxşı yolu, mövcud olanı əldə etmək, lazım olan yeganə dəyişikliyi tətbiq etmək və yenidən qurmaqdır.

ResponseStatus setConfiguration (Konfiqurasiya konfiqurasiyası, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

konfiqurasiya əvvəlcədən qurulmuş şou, saveType dəyişiklik yalnız cari sessiya üçün daimi olarsa seçim etməyinizə icazə verir.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Bütün digər əməliyyatlardan əvvəl konfiqurasiya göstəricisi əldə etmək vacibdir Konfiqurasiya konfiqurasiyası = *(Konfiqurasiya *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfiqurasiya); konfiqurasiya. ADDL = 0x0; konfiqurasiya. ADDH = 0x1; konfiqurasiya. CHAN = 0x19; konfiqurasiya. OPTION.fec = FEC_0_OFF; konfiqurasiya. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; konfiqurasiya. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; konfiqurasiya. OPTION.transmissionPower = POWER_17; konfiqurasiya. OPTION.wirelessWakeupTime = WAKE_UP_1250; konfiqurasiya. SPED.airDataRate = AIR_DATA_RATE_011_48; konfiqurasiya. SPED.uartBaudRate = UART_BPS_115200; konfiqurasiya. SPED.uartParity = MODE_00_8N1; // Konfiqurasiya dəyişdirildi və ResponseStatus rs = e32ttl100.setConfiguration (konfiqurasiya, WRITE_CFG_PWR_DWN_LOSE) konfiqurasiyasını saxlamamaq üçün təyin edin; Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfiqurasiya);

Parametrlərin hamısı sabit olaraq idarə olunur:

Addım 10: Əsas Konfiqurasiya Seçimi

Əsas Konfiqurasiya Seçimi
Əsas Konfiqurasiya Seçimi

Addım 11: Mesaj Alın

Əvvəlcə bir şeyin qəbul tamponunda olub olmadığını yoxlamaq üçün sadə, lakin faydalı bir üsul təqdim etməliyik

int available ();

Mövcud axında neçə baytınız olduğunu qaytarmaq kifayətdir.

Addım 12: Normal ötürmə rejimi

Normal ötürmə rejimi
Normal ötürmə rejimi

Normal/Şəffaf ötürmə rejimi eyni ünvana və kanala malik bütün cihazlara mesaj göndərmək üçün istifadə olunur.

Mesaj göndərmək/almaq üçün bir çox üsul var, ətraflı izah edəcəyik:

ResponseStatus sendMessage (const String mesajı);

ResponseContainer receiveMessage ();

Birinci üsul sendMessage və Normal rejimdə bir cihaza String göndərmək üçün istifadə olunur.

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

Digər cihaz sadəcə döngədə edir

əgər (e32ttl.available ()> 1) {ResponseContainer rs = e32ttl.receiveMessage (); String mesajı = rs.data; // Əvvəlcə Serial.println (rs.status.getResponseDescription ()) məlumatlarını əldə edin; Serial.println (mesaj); }

Addım 13: Quruluşu idarə edin

Mürəkkəb bir quruluş göndərmək istəyirsinizsə, bu üsuldan istifadə edə bilərsiniz

ResponseStatus sendMessage (const void *mesajı, const uint8_t ölçüsü); ResponseStructContainer receiveMessage (const uint8_t ölçüsü);

Struktur göndərmək üçün istifadə olunur, məsələn:

struktur Messaggione {char növü [5]; char mesajı [8]; bool mitico; }; struktur Messaggione messaggione = {"TEMP", "Peple", doğru}; ResponseStatus rs = e32ttl.sendMessage (& messaggione, sizeof (Messaggione)); Serial.println (rs.getResponseDescription ());

və digər tərəfdən mesajı belə ala bilərsiniz

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

Qismən quruluşu oxuyun

Daha çox quruluş növünü idarə etmək üçün mesajın birinci hissəsini oxumaq istəyirsinizsə, bu üsuldan istifadə edə bilərsiniz.

ResponseContainer receiveInitialMessage (const uint8_t ölçüsü);

Yüklənəcək quruluşu müəyyən etmək üçün növü və ya başqa bir simli almaq üçün yaradıram.

struktag Messaggione {// Yazı maşını mesajı olmayan qismən struktur [8]; bool mitico; }; char növü [5]; // ResponseContainer strukturunun birinci hissəsi rs = e32ttl.receiveInitialMessage (sizeof (tip)); // simli bir char massivinə qoyun (lazım deyil) memcpy (type, rs.data.c_str (), sizeof (type)); Serial.println ("TİPİ OKU:"); Serial.println (rs.status.getResponseDescription ()); Serial.println (növ); // ResponseStructContainer -in qalan hissəsini oxuyun rsc = e32ttl.receiveMessage (sizeof (Messaggione))); struktur Messaggione messaggione = *(Messaggione *) rsc.data;

Addım 14: Normal Mod əvəzinə Sabit Rejim

Eyni şəkildə sabit ötürmə ilə istifadə etmək üçün bir sıra metodlar yaradıram

Sabit ötürmə

Yalnız göndərmə metodunu dəyişdirməlisiniz, çünki təyinat cihazı sabit rejimdə Ünvan və Kanal ilə preambula almır.

Beləliklə, String mesajınız üçün

ResponseStatus sendFixedMessage (bayt ADDL, bayt ADDH, bayt CHAN, const String mesajı); ResponseStatus sendBroadcastFixedMessage (bayt CHAN, const String mesajı);

və quruluşunuz üçün

ResponseStatus sendFixedMessage (bayt ADDL, bayt ADDH, bayt CHAN, const void *mesajı, const uint8_t ölçüsü); ResponseStatus sendBroadcastFixedMessage (bayt CHAN, const void *mesajı, const uint8_t ölçüsü);

Burada sadə bir nümunə

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

Sabit ötürmənin daha çox ssenarisi var

Müəyyən bir cihaza (ikinci ssenarilər Sabit ötürülmə) göndərirsinizsə, birbaşa müəyyən etmək üçün ADDL, ADDH və CHAN əlavə etməlisiniz.

ResponseStatus rs = e32ttl.sendFixedMessage (2, 2, 0x17, "Bir cihaza mesaj");

İstənilən kanalda bütün cihazlara mesaj göndərmək istəyirsinizsə, bu üsuldan istifadə edə bilərsiniz.

ResponseStatus rs = e32ttl.sendBroadcastFixedMessage (0x17, "Bir kanalın cihazlarına mesaj");

Şəbəkədəki bütün yayım mesajlarını almaq istəyirsinizsə, ADDH və ADDL -ni BROADCAST_ADDRESS ilə təyin etməlisiniz.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Bütün digər əməliyyatlardan əvvəl konfiqurasiya göstəricisi əldə etmək vacibdir Konfiqurasiya konfiqurasiyası = *(Konfiqurasiya *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfiqurasiya); konfiqurasiya. ADDL = BROADCAST_ADDRESS; konfiqurasiya. ADDH = BROADCAST_ADDRESS; // Konfiqurasiya dəyişdirildi və ResponseStatus rs = e32ttl100.setConfiguration (konfiqurasiya, WRITE_CFG_PWR_DWN_LOSE) konfiqurasiyasını saxlamamaq üçün təyin edin; Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfiqurasiya);

Addım 15: Təşəkkürlər

İndi işinizi görmək üçün bütün məlumatlarınız var, amma düşünürəm ki, bütün ehtimalları daha yaxşı başa düşmək üçün bəzi real nümunələr göstərmək vacibdir.

  1. Arduino, esp32 və ya esp8266 üçün LoRa E32 cihazı: parametrlər və əsas istifadə
  2. Arduino, esp32 və ya esp8266 üçün LoRa E32 cihazı: kitabxana
  3. Arduino, esp32 və ya esp8266 üçün LoRa E32 cihazı: konfiqurasiya
  4. Arduino, esp32 və ya esp8266 üçün LoRa E32 cihazı: sabit ötürücü
  5. Arduino, esp32 və ya esp8266 üçün LoRa E32 cihazı: enerjiyə qənaət və strukturlaşdırılmış məlumatların göndərilməsi

Tövsiyə: