İçindekiler:

Arduino, Esp8266 veya Esp32 için Düşük Maliyetli E32 (sx1278/sx1276) Cihazı ile LoRa 3Km - 8Km Kablosuz İletişim: 15 Adım
Arduino, Esp8266 veya Esp32 için Düşük Maliyetli E32 (sx1278/sx1276) Cihazı ile LoRa 3Km - 8Km Kablosuz İletişim: 15 Adım

Video: Arduino, Esp8266 veya Esp32 için Düşük Maliyetli E32 (sx1278/sx1276) Cihazı ile LoRa 3Km - 8Km Kablosuz İletişim: 15 Adım

Video: Arduino, Esp8266 veya Esp32 için Düşük Maliyetli E32 (sx1278/sx1276) Cihazı ile LoRa 3Km - 8Km Kablosuz İletişim: 15 Adım
Video: Esp32 ile LoRa Kullanımı 2024, Kasım
Anonim
Arduino, Esp8266 veya Esp32 için Düşük Maliyetli E32 (sx1278/sx1276) Cihazı ile LoRa 3Km - 8Km Kablosuz İletişim
Arduino, Esp8266 veya Esp32 için Düşük Maliyetli E32 (sx1278/sx1276) Cihazı ile LoRa 3Km - 8Km Kablosuz İletişim

Çok güçlü, basit ve ucuz bir cihaz olan Semtech serisi LoRa cihazına dayalı EBYTE E32'yi yönetmek için bir kütüphane oluşturuyorum.

3Km versiyonunu burada, 8Km versiyonunu burada bulabilirsiniz.

3000m ile 8000m mesafelerde çalışabilirler ve bir çok özellik ve parametreye sahiptirler. Bu yüzden kullanımı basitleştirmek için bu kütüphaneyi oluşturdum.

Büyükşehir sensörlerinden veri almak veya drone'u kontrol etmek için bir çözüm.

Gereçler

Arduino UNO'su

Wemos D1 mini

LoRa E32 TTL 100 3Km versiyonu

LoRa E32 TTL 1W 8Km versiyonu

1. Adım: Kitaplık

Kütüphane
Kütüphane

Kütüphaneme buradan ulaşabilirsiniz.

İndirmek.

Sağ üst köşedeki İNDİR düğmesine tıklayın, sıkıştırılmamış LoRa_E32 klasörünü yeniden adlandırın.

LoRa_E32 klasörünün LoRa_E32.cpp ve LoRa_E32.h içerdiğini kontrol edin.

LoRa_E32 kitaplık klasörünü /libraries/ klasörünüze yerleştirin. İlk kitaplığınızsa, kitaplıklar alt klasörünü oluşturmanız gerekebilir.

IDE'yi yeniden başlatın.

2. Adım: Pin Çıkışı

Pin yapısı
Pin yapısı
Pin yapısı
Pin yapısı
Pin yapısı
Pin yapısı

Gördüğünüz gibi M0 ve M1 pinleri ile çeşitli modlar ayarlayabilirsiniz.

Statik olarak kullanılabilecek bazı pinler vardır fakat mikrodenetleyiciye bağlayıp kütüphanede yapılandırırsanız performans kazanırsınız ve tüm modları yazılım üzerinden kontrol edebilirsiniz ama bundan sonra daha iyi anlatacağız.

3. Adım: AUX Pimi

AUX Pimi
AUX Pimi
AUX Pimi
AUX Pimi
AUX Pimi
AUX Pimi

Zaten söylediğim gibi, tüm pinleri mikrodenetleyicinin çıkışına bağlamak önemli değil, istediğiniz konfigürasyonu elde etmek için M0 ve M1 pinlerini YÜKSEK veya DÜŞÜK olarak ayarlayabilirsiniz ve AUX bağlamazsanız kitaplık emin olmak için makul bir gecikme ayarlayın. işlemin tamamlanmış olmasıdır.

AUX pimi

Veri iletirken, harici MCU'yu uyandırmak ve veri aktarımı bitiminde YÜKSEK döndürmek için kullanılabilir.

AUX alırken DÜŞÜK gidiyor ve arabellek boşken YÜKSEK dönüyor.

Ayrıca normal çalışmayı geri yüklemek için kendi kendini kontrol etmek için de kullanılır (güç açıkken ve uyku/program modunda).

Adım 4: Tam Bağlantılı Şema Esp8266

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

esp8266 bağlantı şeması daha basittir çünkü aynı voltajda mantıksal iletişim (3.3v) çalışır.

İyi bir stabilite elde etmek için pull-up direnci (4, 7Kohm) eklemek önemlidir.

Adım 5: Tamamen Bağlı Şema Arduino

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

Arduino çalışma voltajı 5v olduğu için LoRa modülünün RX pin M0 ve M1'ine bir voltaj bölücü eklememiz gerekiyor.

GND'ye 2Kohm direnç ve RX'te bir araya getirmek yerine sinyalden 1Kohm kullanabilirsiniz.

Adım 6: Kitaplık: Yapıcı

Oldukça çok sayıda yapıcıdan oluşan bir set oluşturdum çünkü yönetmemiz gereken daha fazla seçenek ve durum olabilir.

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 kurucu seti, Seri ve diğer pinlerin yönetimini kitaplığa devretmek için oluşturulur.

rxPin ve txPin, UART'a bağlanmak için kullanılan pinlerdir ve zorunludurlar.

auxPin, işlemi, iletimi ve alım durumunu kontrol eden bir pindir (daha sonra daha iyi açıklayacağız), o pin Zorunlu değildir, eğer ayarlamazsanız, işlemin kendi kendine tamamlanmasına izin vermek için bir gecikme uygularım (gecikme ile).

m0pin ve m1Pin, çalışma MODU'nu değiştirmek için kullanılan pinlerdir (yukarıdaki tabloya bakın), “üretim”deki bu pinlerin doğrudan YÜKSEK veya DÜŞÜK bağlanacağını düşünüyorum, ancak test için kütüphane tarafından yönetilmeleri faydalı olacaktır.

bpsRate, SoftwareSerial'in boud hızıdır, normalde 9600'dür (programmin/uyku modundaki tek baud hızı)

Basit bir örnek

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

Başka bir kurucu ile doğrudan bir SoftwareSerial kullanabiliriz

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

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

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

Bu kurucu ile üst örnek böyle yapılabilir.

#include #include "LoRa_E32.h"

YazılımSerial mySerial(2, 3); // RX, TX

LoRa_E32 e32ttl100(&mySerial);

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

Son yapıcı seti, SoftwareSerial yerine bir HardwareSerial kullanımına izin vermektir.

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

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

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

7. Adım: Başlayın

Start komutu, giriş ve çıkış modunda Seri ve pinleri başlatmak için kullanılır.

geçersiz başlangıç();

yürütmede

// Tüm pinleri ve UART'ı başlat

e32ttl100.begin();

Adım 8: Yapılandırma ve Bilgi Yöntemi

Yapılandırmayı yönetmek ve cihaz hakkında bilgi almak için bir dizi yöntem vardır.

ResponseStructContainer getConfiguration();

ResponseStatus setConfiguration(Yapılandırma yapılandırması, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

ResponseStructContainer getModuleInformation();

void printParameters(yapı Yapılandırma yapılandırması);

ResponseStatus resetModule();

9. Adım: Yanıt Kapsayıcı

Yanıt yönetimini basitleştirmek için, hataları yönetmek ve genel verileri döndürmek için benim için çok yararlı bir şekilde bir kapsayıcı seti oluşturuyorum.

Yanıt Durumu

Bu bir durum kabıdır ve 2 basit giriş noktasına sahiptir, bununla durum kodunu ve durum kodunun açıklamasını alabilirsiniz.

Serial.println(c.getResponseDescription()); // Kodun açıklaması

Serial.println(c.code); // 1 ise Başarılı

kod

BAŞARI = 1, HATA_ BİLİNMİYOR, ERR_NOT_SUPPORT, ERR_NOT_UYGULAMA, ERR_NOT_INITIAL, ERR_INVALID_PARAM, ERR_DATA_SIZE_NOT_MATCH, ERR_BUF_TOO_SMALL, ERR_TIMEOUT, ERR_HARDWARE, ERR_HEAD_NOT_TANINMIŞ

YanıtKapsayıcı

Bu kapsayıcı, String yanıtını yönetmek için oluşturulur ve 2 giriş noktasına sahiptir.

iletiden döndürülen dizeye sahip veriler ve bir RepsonseStatus örneği durumu.

ResponseContainer rs = e32ttl.receiveMessage();

String mesajı = rs.data;

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

Serial.println(mesaj);

YanıtStructContainer

Bu daha “karmaşık” kapsayıcıdır, bunu yapıyı yönetmek için kullanıyorum, ResponseContainer'ın aynı giriş noktasına sahip ancak veriler karmaşık yapıyı yönetmek için geçersiz bir işaretçi.

ResponseStructContainer c;

c = e32ttl100.getConfiguration();// Diğer tüm işlemlerden önce yapılandırma işaretçisini almak önemlidir

Konfigürasyon konfigürasyonu = *(Konfigürasyon*) c.data;

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

Serial.println(c.status.code);

getConfiguration ve setConfiguration

İlk yöntem getConfiguration'dır, cihazda depolanan tüm verileri almak için kullanabilirsiniz.

ResponseStructContainer getConfiguration();

İşte bir kullanım örneği.

ResponseStructContainer c;

c = e32ttl100.getConfiguration();// Diğer tüm işlemlerden önce yapılandırma işaretçisini almak önemlidir

Konfigürasyon konfigürasyonu = *(Konfigürasyon*) c.data;

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

Serial.println(c.status.code);

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

Yapılandırmanın yapısı tüm ayar verilerine sahiptir ve tek verilerin tüm açıklamalarını almak için bir dizi işlev ekliyorum.

konfigürasyon. ADDL = 0x0; // addressconfiguration'ın ilk kısmı. ADDH = 0x1; // Adres konfigürasyonunun ikinci kısmı. CHAN = 0x19;// Kanal konfigürasyonu. OPTION.fec = FEC_0_OFF; // İleri hata düzeltme anahtarı konfigürasyonu. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // İletim modu yapılandırması. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // Çekme yönetimi yapılandırması. OPTION.transmissionPower = POWER_17; // dBm iletim gücü konfigürasyonu. OPTION.wirelessWakeupTime = WAKE_UP_1250; // Uyandırma yapılandırması için bekleme süresi. SPED.airDataRate = AIR_DATA_RATE_011_48; // Hava veri hızı konfigürasyonu. SPED.uartBaudRate = UART_BPS_115200; // Haberleşme baud hızı konfigürasyonu. SPED.uartParity = MODE_00_8N1; // eşlik biti

Tüm açıklamaları almak için tüm öznitelik için eşdeğer bir işleve sahipsiniz:

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

Aynı şekilde setConfiguration bir konfigürasyon yapısı istiyor, bu yüzden konfigürasyonu yönetmenin daha iyi yolunun mevcut olanı almak, ihtiyacınız olan tek değişikliği uygulamak ve tekrar ayarlamak olduğunu düşünüyorum.

ResponseStatus setConfiguration(Yapılandırma yapılandırması, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

yapılandırma, önceden gösterilen yapıdır, saveType, değişiklik yalnızca geçerli oturum için kalıcı hale gelirse, seçim yapmanıza izin verir.

ResponseStructContainer c;c = e32ttl100.getConfiguration(); // Diğer tüm işlemlerden önce yapılandırma işaretçisini almak önemlidir Configuration configuration = *(Configuration*) c.data; Serial.println(c.status.getResponseDescription()); Serial.println(c.status.code); printParameters(yapılandırma); konfigürasyon. ADDL = 0x0; konfigürasyon. ADDH = 0x1; konfigürasyon. 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; // Ayar yapılandırması değiştirildi ve yapılandırmayı tutmayacak şekilde ayarlandı ResponseStatus rs = e32ttl100.setConfiguration(configuration, WRITE_CFG_PWR_DWN_LOSE); Serial.println(rs.getResponseDescription()); Serial.println(rs.code); printParameters(yapılandırma);

Parametrenin tamamı sabit olarak yönetilir:

Adım 10: Temel Yapılandırma Seçeneği

Temel Yapılandırma Seçeneği
Temel Yapılandırma Seçeneği

Adım 11: Alma Mesajı Gönder

İlk önce, alıcı arabelleğinde bir şey olup olmadığını kontrol etmek için basit ama kullanışlı bir yöntem tanıtmalıyız.

int kullanılabilir();

Sadece mevcut akışta kaç baytınız olduğunu döndürür.

Adım 12: Normal İletim Modu

Normal İletim Modu
Normal İletim Modu

Normal/Şeffaf iletim modu, aynı adres ve kanala sahip tüm cihazlara mesaj göndermek için kullanılır.

Mesaj göndermek/almak için bir çok yöntem vardır, detaylı olarak açıklayacağız:

ResponseStatus sendMessage(const String mesajı);

ResponseContainer alıcıMesaj();

İlk yöntem sendMessage'dır ve Normal modda bir aygıta String göndermek için kullanılır.

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

Diğer cihaz sadece döngüde yapar

if (e32ttl.available() > 1){ResponseContainer rs = e32ttl.receiveMessage(); String mesajı = rs.data; // İlk önce veriyi alın Serial.println(rs.status.getResponseDescription()); Serial.println(mesaj); }

Adım 13: Yapıyı Yönetin

Karmaşık bir yapı göndermek istiyorsanız bu yöntemi kullanabilirsiniz.

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

strucutre göndermek için kullanılır, örneğin:

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

ve diğer taraf mesajı alabilirsin

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

Kısmi yapıyı oku

Daha fazla yapı türünü yönetmek için mesajın ilk bölümünü okumak istiyorsanız bu yöntemi kullanabilirsiniz.

ResponseContainer almaInitialMessage(const uint8_t size);

Yüklenecek yapıyı tanımlamak için type veya other ile bir dize almak için oluştururum.

struct Messaggione { // typechar mesajı olmadan kısmi yapı[8]; bool mitico; }; karakter tipi[5]; // yapının ilk kısmı ResponseContainer rs = e32ttl.receiveInitialMessage(sizeof(type)); // Dizeyi bir karakter dizisine koyun (gerekli değil) memcpy (type, rs.data.c_str(), sizeof(type)); Serial.println("OKUMA TÜRÜ: "); Serial.println(rs.status.getResponseDescription()); Seri.println(tür); // yapının geri kalanını oku ResponseStructContainer rsc = e32ttl.receiveMessage(sizeof(Messaggione)); yapı Messaggione messaggione = *(Messaggione*) rsc.data;

Adım 14: Normal Mod Yerine Sabit Mod

Aynı şekilde, sabit aktarımla kullanmak için bir dizi yöntem oluşturuyorum.

Sabit şanzıman

Yalnızca gönderme yöntemini değiştirmeniz gerekir, çünkü hedef cihaz, Adres ve Kanal qudo settato il sabit mod ile giriş bölümünü almaz.

Yani sahip olduğunuz String mesajı için

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

ve sahip olduğunuz yapı için

ResponseStatus sendFixedMessage(bayt ADDL, bayt ADDH, bayt CHAN, const void *message, const uint8_t size);ResponseStatus sendBroadcastFixedMessage(bayt CHAN, const void *message, const uint8_t boyut);

İşte basit bir örnek

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

Sabit şanzımanın daha fazla senaryosu var

Belirli bir cihaza gönderirseniz (ikinci senaryolar Sabit iletim), doğrudan tanımlamak için ADDL, ADDH ve CHAN eklemelisiniz.

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

Belirli bir Kanaldaki tüm cihazlara mesaj göndermek istiyorsanız bu yöntemi kullanabilirsiniz.

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

Ağdaki tüm yayın mesajlarını almak istiyorsanız, ADDH ve ADDL'nizi BROADCAST_ADDRESS ile ayarlamalısınız.

ResponseStructContainer c;c = e32ttl100.getConfiguration(); // Diğer tüm işlemlerden önce yapılandırma işaretçisini almak önemlidir Configuration configuration = *(Configuration*) c.data; Serial.println(c.status.getResponseDescription()); Serial.println(c.status.code); printParameters(yapılandırma); configuration. ADDL = YAYIN_ADDRESİ; configuration. ADDH = YAYIN_ADDRESS; // Ayar yapılandırması değiştirildi ve yapılandırmayı tutmayacak şekilde ayarlandı ResponseStatus rs = e32ttl100.setConfiguration(configuration, WRITE_CFG_PWR_DWN_LOSE); Serial.println(rs.getResponseDescription()); Serial.println(rs.code); printParameters(yapılandırma);

Adım 15: Teşekkürler

Artık işinizi yapmak için tüm bilgilere sahipsiniz, ancak tüm olasılıkları daha iyi anlamak için bazı gerçekçi örnekler göstermenin önemli olduğunu düşünüyorum.

  1. Arduino, esp32 veya esp8266 için LoRa E32 cihazı: ayarlar ve temel kullanım
  2. Arduino, esp32 veya esp8266 için LoRa E32 cihazı: kitaplık
  3. Arduino, esp32 veya esp8266 için LoRa E32 cihazı: konfigürasyon
  4. Arduino, esp32 veya esp8266 için LoRa E32 cihazı: sabit iletim
  5. Arduino, esp32 veya esp8266 için LoRa E32 cihazı: güç tasarrufu ve yapılandırılmış veri gönderme

Önerilen: