جدول المحتويات:

LoRa 3Km to 8Km Wireless Communication مع جهاز E32 منخفض التكلفة (sx1278 / sx1276) لجهاز Arduino أو Esp8266 أو Esp32: 15 خطوة
LoRa 3Km to 8Km Wireless Communication مع جهاز E32 منخفض التكلفة (sx1278 / sx1276) لجهاز Arduino أو Esp8266 أو Esp32: 15 خطوة

فيديو: LoRa 3Km to 8Km Wireless Communication مع جهاز E32 منخفض التكلفة (sx1278 / sx1276) لجهاز Arduino أو Esp8266 أو Esp32: 15 خطوة

فيديو: LoRa 3Km to 8Km Wireless Communication مع جهاز E32 منخفض التكلفة (sx1278 / sx1276) لجهاز Arduino أو Esp8266 أو Esp32: 15 خطوة
فيديو: Lora Explained {Science Thursday Ep108} 2024, يوليو
Anonim
LoRa اتصال لاسلكي 3 كم إلى 8 كم مع جهاز E32 منخفض التكلفة (sx1278 / sx1276) لـ Arduino أو Esp8266 أو Esp32
LoRa اتصال لاسلكي 3 كم إلى 8 كم مع جهاز E32 منخفض التكلفة (sx1278 / sx1276) لـ Arduino أو Esp8266 أو Esp32

لقد قمت بإنشاء مكتبة لإدارة EBYTE E32 استنادًا إلى سلسلة Semtech لجهاز LoRa ، وهو جهاز قوي جدًا وبسيط ورخيص.

يمكنك العثور على نسخة 3 كم هنا ، نسخة 8 كم هنا

يمكنهم العمل على مسافة 3000 م إلى 8000 م ، ولديهم الكثير من الميزات والمعلمات. لذلك قمت بإنشاء هذه المكتبة لتبسيط الاستخدام.

إنه حل لاسترداد البيانات من أجهزة الاستشعار الحضرية أو للتحكم في الطائرات بدون طيار.

اللوازم

اردوينو UNO

Wemos D1 mini

إصدار LoRa E32 TTL 100 بطول 3 كم

إصدار LoRa E32 TTL 1W 8Km

الخطوة 1: المكتبة

مكتبة
مكتبة

يمكنك أن تجد مكتبتي هنا.

للتحميل.

انقر فوق الزر DOWNLOADS في الزاوية اليمنى العليا ، وأعد تسمية المجلد غير المضغوط LoRa_E32.

تأكد من أن المجلد LoRa_E32 يحتوي على LoRa_E32.cpp و LoRa_E32.h.

ضع مجلد مكتبة LoRa_E32 الخاص بك / libraries / مجلد. قد تحتاج إلى إنشاء مجلد فرعي للمكتبات إذا كانت مكتبتك الأولى.

أعد تشغيل IDE.

الخطوة 2: Pinout

Pinout
Pinout
Pinout
Pinout
Pinout
Pinout

كما ترى ، يمكنك ضبط أوضاع مختلفة عبر دبابيس M0 و M1.

هناك بعض المسامير التي يمكن استخدامها بطريقة ثابتة ، ولكن إذا قمت بتوصيلها بالميكروكونترولر وقمت بتكوينها في المكتبة ، فستكسب في الأداء ويمكنك التحكم في كل الوضع عبر البرنامج ، لكننا سنشرح بشكل أفضل بعد ذلك.

الخطوة 3: دبوس AUX

دبوس AUX
دبوس AUX
دبوس AUX
دبوس AUX
دبوس AUX
دبوس AUX

كما قلت بالفعل ، ليس من المهم توصيل كل طرف بإخراج متحكم دقيق ، يمكنك وضع دبابيس M0 و M1 على HIGH أو LOW للحصول على تهيئة ، وإذا لم تقم بتوصيل AUX ، فاضبطت المكتبة تأخيرًا معقولاً للتأكد أن العملية قد اكتملت.

دبوس AUX

عند إرسال البيانات يمكن استخدامها لتنشيط MCU الخارجية وإرجاع HIGH عند الانتهاء من نقل البيانات.

عند استلام AUX ، يتم الانتقال إلى LOW والعودة HIGH عندما يكون المخزن المؤقت فارغًا.

يتم استخدامه أيضًا للفحص الذاتي لاستعادة التشغيل العادي (عند التشغيل ووضع السكون / البرنامج).

الخطوة 4: مخطط متصل بالكامل Esp8266

مخطط متصل بالكامل Esp8266
مخطط متصل بالكامل Esp8266
مخطط متصل بالكامل Esp8266
مخطط متصل بالكامل Esp8266

يعتبر مخطط اتصال esp8266 أكثر بساطة لأنه يعمل بنفس جهد الاتصالات المنطقية (3.3 فولت).

من المهم إضافة مقاوم سحب (4 ، 7 كيلو أوم) للحصول على ثبات جيد.

الخطوة 5: مخطط متصل بالكامل Arduino

مخطط متصل بالكامل اردوينو
مخطط متصل بالكامل اردوينو
مخطط متصل بالكامل اردوينو
مخطط متصل بالكامل اردوينو

جهد عمل Arduino هو 5 فولت ، لذلك نحتاج إلى إضافة مقسم جهد على RX pin M0 و M1 من وحدة LoRa لمنع التلف ، يمكنك الحصول على مزيد من المعلومات هنا مقسم الجهد: الآلة الحاسبة والتطبيق.

يمكنك استخدام المقاوم 2Kohm إلى GND و 1 Kohm من الإشارة بدلاً من وضعها معًا على RX.

الخطوة السادسة: المكتبة: المنشئ

لقد صنعت مجموعة من الصانعين ، لأنه يمكن أن يكون لدينا المزيد من الخيارات والمواقف التي يجب إدارتها.

LoRa_E32 (بايت rxPin ، بايت txPin ، UART_BPS_RATE bpsRate = UART_BPS_RATE_9600) ؛

LoRa_E32 (بايت rxPin ، بايت txPin ، بايت auxPin ، UART_BPS_RATE bpsRate = UART_BPS_RATE_9600) ؛ LoRa_E32 (بايت rxPin ، بايت txPin ، بايت auxPin ، بايت m0Pin ، بايت m1Pin ، UART_BPS_RATE bpsRate = UART_BPS_RATE_9600) ؛

يتم إنشاء أول مجموعة من المُنشئ لتفويض إدارة المسلسل ودبابيس أخرى إلى المكتبة.

rxPin و txPin هما دبوس الاتصال بـ UART وهما إلزاميان.

auxPin هو دبوس يتحقق من حالة التشغيل والإرسال والاستلام (سنشرح بشكل أفضل بعد ذلك) ، هذا الدبوس ليس إلزاميًا ، إذا لم تقم بتعيينه ، فأنا أطبق تأخيرًا للسماح للعملية بإكمال نفسها (مع الكمون).

m0pin و m1Pin هما الدبابيس لتغيير وضع التشغيل (انظر الجزء العلوي من الجدول) ، أعتقد أن هذه المسامير في "الإنتاج" ستتصل مباشرةً بـ HIGH أو LOW ، ولكن للاختبار من المفيد إدارتها بواسطة المكتبة.

معدل bps هو معدل boudrate لبرنامج SoftwareSerial عادةً هو 9600 (معدل الباود الوحيد في وضع programmin / السكون)

مثال بسيط هو

# تضمين "LoRa_E32.h" LoRa_E32 e32ttl100 (2، 3) ؛ // RX ، TX // LoRa_E32 e32ttl100 (2 ، 3 ، 5 ، 6 ، 7) ؛ // RX ، TX

يمكننا استخدام SoftwareSerial مباشرةً مع مُنشئ آخر

LoRa_E32 (HardwareSerial * المسلسل ، UART_BPS_RATE bpsRate = UART_BPS_RATE_9600) ؛

LoRa_E32 (HardwareSerial * serial، byte auxPin، UART_BPS_RATE bpsRate = UART_BPS_RATE_9600) ؛

LoRa_E32 (HardwareSerial * المسلسل ، بايت auxPin ، بايت m0Pin ، بايت m1Pin ، UART_BPS_RATE bpsRate = UART_BPS_RATE_9600) ؛

يمكن أن يكون المثال العلوي مع هذا المُنشئ مثل ذلك.

# تضمين # تضمين "LoRa_E32.h"

SoftwareSerial mySerial (2 ، 3) ؛ // RX ، TX

LoRa_E32 e32ttl100 (& mySerial) ؛

// LoRa_E32 e32ttl100 (& mySerial، 5، 7، 6) ؛

آخر مجموعة من المُنشئ هي السماح باستخدام HardwareSerial بدلاً من SoftwareSerial.

LoRa_E32 (SoftwareSerial * serial، UART_BPS_RATE bpsRate = UART_BPS_RATE_9600) ؛

LoRa_E32 (SoftwareSerial * serial، byte auxPin، UART_BPS_RATE bpsRate = UART_BPS_RATE_9600) ؛

LoRa_E32 (SoftwareSerial * serial، بايت auxPin، بايت m0Pin، بايت m1Pin، UART_BPS_RATE bpsRate = UART_BPS_RATE_9600) ؛

الخطوة 7: ابدأ

يتم استخدام الأمر start لبدء تشغيل المسلسل والدبابيس في وضع الإدخال والإخراج.

بداية باطلة () ؛

في التنفيذ

// بدء تشغيل جميع المسامير و UART

e32ttl100.begin () ،

الخطوة 8: طريقة التكوين والمعلومات

هناك مجموعة من الطرق لإدارة التكوين والحصول على معلومات الجهاز.

ResponseStructContainer getConfiguration () ،

ResponseStatus setConfiguration (تكوين التكوين ، PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE) ؛

ResponseStructContainer getModuleInformation () ،

معلمات الطباعة الباطلة (تكوين تكوين البنية) ؛

ResponseStatus resetModule () ،

الخطوة 9: حاوية الاستجابة

لتبسيط إدارة الاستجابة ، أقوم بإنشاء مجموعة من الحاويات ، بالنسبة لي بشكل مفيد للغاية لإدارة الأخطاء وإرجاع البيانات العامة.

الاستجابة

هذه حاوية حالة وتحتوي على نقطتي إدخال بسيطتين ، حيث يمكنك الحصول على رمز الحالة ووصف رمز الحالة

Serial.println (c.getResponseDescription ()) ؛ // وصف الكود

Serial.println (c.code) ؛ // 1 إذا كان النجاح

الكود

نجاح = 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

حاوية الاستجابة

تم إنشاء هذه الحاوية لإدارة استجابة السلسلة ولها نقطتا إدخال.

البيانات مع السلسلة التي تم إرجاعها من الرسالة والحالة مثيل RepsonseStatus.

ResponseContainer rs = e32ttl.receiveMessage () ،

رسالة سلسلة = rs.data ؛

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

Serial.println (رسالة) ؛

ResponseStructainer

هذه هي الحاوية "الأكثر تعقيدًا" ، وأنا أستخدمها لإدارة الهيكل ، ولها نفس نقطة دخول ResponseContainer ولكن البيانات هي مؤشر باطل لإدارة البنية المعقدة.

ResponseStructainer c ؛

c = e32ttl100.getConfiguration () ؛ // من المهم الحصول على مؤشر التكوين قبل كل العمليات الأخرى

تكوين التكوين = * (التكوين *) c.data ؛

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

Serial.println (c.status.code) ؛

getConfiguration و setConfiguration

الطريقة الأولى هي getConfiguration ، يمكنك استخدامها لاستعادة جميع البيانات المخزنة على الجهاز.

ResponseStructContainer getConfiguration () ،

هنا مثال على الاستخدام.

ResponseStructainer c ؛

c = e32ttl100.getConfiguration () ؛ // من المهم الحصول على مؤشر التكوين قبل كل العمليات الأخرى

تكوين التكوين = * (التكوين *) c.data ؛

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

Serial.println (c.status.code) ؛

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

يحتوي هيكل التكوين على جميع بيانات الإعدادات ، وأضيف سلسلة من الوظائف للحصول على كل وصف للبيانات الفردية.

التكوين ADDL = 0 × 0 ؛ // الجزء الأول من addressconfiguration. ADDH = 0x1 ؛ // الجزء الثاني من تكوين العنوان. CHAN = 0x19 ؛ // تكوين القناة. OPTION.fec = FEC_0_OFF ؛ // تكوين مفتاح تصحيح الخطأ إلى الأمام. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION ؛ // تكوين وضع الإرسال. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS ؛ // تكوين إدارة السحب. OPTION.transmissionPower = POWER_17 ؛ // تكوين طاقة الإرسال dBm. OPTION.wirelessWakeupTime = WAKE_UP_1250 ؛ // انتظر وقت الاستيقاظ من التكوين. SPED.airDataRate = AIR_DATA_RATE_011_48 ؛ // تكوين معدل بيانات الهواء. SPED.uartBaudRate = UART_BPS_115200 ؛ // تكوين معدل البث بالباود. // بت التكافؤ

لديك الوظيفة المكافئة لجميع السمات للحصول على كل الوصف:

Serial.print (F ("Chan:")) ؛ Serial.print (التكوين. CHAN ، DEC) ؛ Serial.print ("->") ؛ Serial.println (configuration.getChannelDescription ()) ؛ Serial.println (F ("")) ؛ Serial.print (F ("SpeedParityBit:")) ؛ Serial.print (config. SPED.uartParity، BIN) ؛ Serial.print ("->") ؛ Serial.println (configuration. SPED.getUARTParityDescription ()) ، Serial.print (F ("SpeedUARTDatte:")) ؛ Serial.print (config. SPED.uartBaudRate، BIN) ؛ Serial.print ("->") ؛ Serial.println (configuration. SPED.getUARTBaudRate ()) ، Serial.print (F ("SpeedAirDataRate:")) ؛ Serial.print (config. SPED.airDataRate، BIN) ؛ Serial.print ("->") ؛ Serial.println (configuration. SPED.getAirDataRate ()) ، Serial.print (F ("OptionTrans:")) ؛ Serial.print (config. OPTION.fixedTransmission، BIN) ؛ Serial.print ("->") ؛ Serial.println (configuration. OPTION.getFixedTransmissionDescription ()) ، Serial.print (F ("OptionPullup:")) ؛ Serial.print (config. OPTION.ioDriveMode، BIN) ؛ Serial.print ("->") ؛ Serial.println (configuration. OPTION.getIODroveModeDescription ()) ، Serial.print (F ("OptionWakeup:")) ؛ Serial.print (config. OPTION.wirelessWakeupTime ، BIN) ؛ Serial.print ("->") ؛ Serial.println (configuration. OPTION.getWirelessWakeUPTimeDescription ()) ، Serial.print (F ("OptionFEC:")) ؛ Serial.print (config. OPTION.fec، BIN) ؛ Serial.print ("->") ؛ Serial.println (configuration. OPTION.getFECDescription ()) ، Serial.print (F ("OptionPower:")) ؛ Serial.print (config. OPTION.transmissionPower، BIN) ؛ Serial.print ("->") ؛ Serial.println (configuration. OPTION.getTransmissionPowerDescription ()) ،

في نفس الطريقة ، تريد setConfiguration بنية تكوين ، لذلك أعتقد أن أفضل طريقة لإدارة التكوين هي استرداد التكوين الحالي ، وتطبيق التغيير الوحيد الذي تحتاجه وتعيينه مرة أخرى.

ResponseStatus setConfiguration (تكوين التكوين ، PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE) ؛

التكوين هو الهيكل المعروض مسبقًا ، يسمح لك saveType بالاختيار إذا أصبح التغيير دائمًا للجلسة الحالية فقط.

ResponseStructContainer c ؛ c = e32ttl100.getConfiguration () ، // من المهم الحصول على مؤشر التكوين قبل كل تكوين تكوين العملية الأخرى = * (التكوين *) c.data ؛ Serial.println (c.status.getResponseDescription ()) ؛ Serial.println (c.status.code) ؛ printParameters (التكوين) ؛ التكوين ADDL = 0 × 0 ؛ التكوين ADDH = 0x1 ؛ التكوين. CHAN = 0x19 ؛ التكوين. OPTION.fec = FEC_0_OFF ، التكوين. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION ، التكوين. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS ، التكوين. OPTION.transmissionPower = POWER_17 ، config. OPTION.wirelessWakeupTime = WAKE_UP_1250 ، التكوين. SPED.airDataRate = AIR_DATA_RATE_011_48 ، التكوين. SPED.uartBaudRate = UART_BPS_115200 ، التكوين. SPED.uartParity = MODE_00_8N1 ، // تم تغيير التكوين وتعيينه لعدم الاحتفاظ بالتكوين ResponseStatus rs = e32ttl100.setConfiguration (التكوين ، WRITE_CFG_PWR_DWN_LOSE) ؛ Serial.println (rs.getResponseDescription ()) ، Serial.println (rs.code) ؛ printParameters (التكوين) ؛

تتم إدارة جميع المعلمات على أنها ثابتة:

الخطوة 10: خيار التكوين الأساسي

خيار التكوين الأساسي
خيار التكوين الأساسي

الخطوة 11: إرسال رسالة استلام

أولاً ، يجب أن نقدم طريقة بسيطة ولكنها مفيدة للتحقق مما إذا كان هناك شيء ما في المخزن المؤقت للاستلام

int المتاحة () ؛

إنه يعرض ببساطة عدد البايت الذي لديك في التدفق الحالي.

الخطوة 12: وضع الإرسال العادي

وضع الإرسال العادي
وضع الإرسال العادي

يُستخدم وضع الإرسال العادي / الشفاف لإرسال الرسائل إلى جميع الأجهزة التي لها نفس العنوان والقناة.

هناك الكثير من الطرق لإرسال / استقبال الرسائل ، سنشرح بالتفصيل:

ResponseStatus sendMessage (رسالة سلسلة ثابتة) ؛

ResponseContainer ReceiverMessage () ؛

الطريقة الأولى هي sendMessage وتستخدم لإرسال سلسلة إلى جهاز في الوضع العادي.

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

الجهاز الآخر يعمل ببساطة على الحلقة

إذا (e32ttl.available ()> 1) {ResponseContainer rs = e32ttl.receiveMessage () ؛ رسالة سلسلة = rs.data ؛ // أولاً احصل على البيانات Serial.println (rs.status.getResponseDescription ()) ؛ Serial.println (رسالة) ؛ }

الخطوة 13: إدارة الهيكل

إذا كنت تريد إرسال هيكل معقد يمكنك استخدام هذه الطريقة

ResponseStatus sendMessage (const باطل * رسالة ، حجم ثابت uint8_t) ؛ ResponseStructContainer ReceiverMessage (const uint8_t size) ؛

يتم استخدامه لإرسال هيكل ، على سبيل المثال:

هيكل Messaggione {char type [5]؛ رسالة شار [8] ؛ بول ميتكو } ؛ الهيكل Messaggione messaggione = {"TEMP"، "Peple"، true}؛ ResponseStatus rs = e32ttl.sendMessage (& messaggione، sizeof (Messaggione)) ؛ Serial.println (rs.getResponseDescription ()) ،

والجانب الآخر يمكنك استقبال الرسالة بذلك

ResponseStructContainer rsc = e32ttl.receiveMessage (sizeof (Messaggione)) ؛ بنية Messaggione messaggione = * (Messaggione *) rsc.data ؛ Serial.println (messaggione.message) ؛ Serial.println (messaggione.mitico) ؛

اقرأ الهيكل الجزئي

إذا كنت تريد قراءة الجزء الأول من الرسالة لإدارة المزيد من أنواع الهيكل ، يمكنك استخدام هذه الطريقة.

ResponseContainer ReceiverInitialMessage (حجم ثابت uint8_t) ؛

أقوم بإنشائه لتلقي سلسلة من النوع أو غيره لتحديد الهيكل المراد تحميله.

هيكل Messaggione {// Partial strucutre بدون رسالة typechar [8]؛ بول ميتكو } ؛ نوع الحرف [5] ؛ // الجزء الأول من الهيكل ResponseContainer rs = e32ttl.receiveInitialMessage (sizeof (type)) ؛ // ضع سلسلة في مصفوفة char (ليست ضرورية) memcpy (type، rs.data.c_str ()، sizeof (type)) ؛ Serial.println ("نوع القراءة:") ؛ Serial.println (rs.status.getResponseDescription ()) ؛ Serial.println (نوع) ؛ // اقرأ باقي الهيكل ResponseStructContainer rsc = e32ttl.receiveMessage (sizeof (Messaggione)) ؛ هيكل Messaggione messaggione = * (Messaggione *) rsc.data ؛

الخطوة 14: الوضع الثابت بدلاً من الوضع العادي

بنفس الطريقة ، أقوم بإنشاء مجموعة من الطرق لاستخدامها مع الإرسال الثابت

انتقال ثابت

تحتاج إلى تغيير طريقة الإرسال فقط ، لأن جهاز الوجهة لا يستقبل التمهيد بالعنوان والقناة إذا كان الوضع ثابتًا.

لذلك بالنسبة لرسالة السلسلة لديك

ResponseStatus sendFixedMessage (بايت ADDL ، بايت ADDH ، بايت CHAN ، رسالة سلسلة ثابتة) ؛ ResponseStatus sendBroadcastFixedMessage (بايت CHAN ، رسالة ثابتة سلسلة) ؛

وللهيكل لديك

ResponseStatus sendFixedMessage (بايت ADDL ، بايت ADDH ، بايت CHAN ، const void * message ، const uint8_t size) ؛ ResponseStatus sendBroadcastFixedMessage (بايت CHAN ، const void * message ، const uint8_t size) ؛

هنا مثال بسيط

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

الإرسال الثابت لديه المزيد من السيناريوهات

إذا قمت بالإرسال إلى جهاز معين (السيناريوهات الثانية إرسال ثابت) ، فيجب عليك إضافة ADDL و ADDH و CHAN لتحديده مباشرة.

ResponseStatus rs = e32ttl.sendFixedMessage (2، 2، 0x17، "رسالة إلى جهاز")؛

إذا كنت تريد إرسال رسالة إلى كل الأجهزة في قناة معينة ، يمكنك استخدام هذه الطريقة.

ResponseStatus rs = e32ttl.sendBroadcastFixedMessage (0x17 ، "رسالة إلى أجهزة القناة") ؛

إذا كنت تريد استلام جميع رسائل البث في الشبكة ، فيجب عليك تعيين ADDH و ADDL باستخدام BROADCAST_ADDRESS.

ResponseStructContainer c ؛ c = e32ttl100.getConfiguration () ، // من المهم الحصول على مؤشر التكوين قبل كل تكوين تكوين العملية الأخرى = * (التكوين *) c.data ؛ Serial.println (c.status.getResponseDescription ()) ؛ Serial.println (c.status.code) ؛ printParameters (التكوين) ؛ التكوين. ADDL = BROADCAST_ADDRESS ، التكوين. ADDH = BROADCAST_ADDRESS ، // تم تغيير التكوين وتعيينه لعدم الاحتفاظ بالتكوين ResponseStatus rs = e32ttl100.setConfiguration (التكوين ، WRITE_CFG_PWR_DWN_LOSE) ؛ Serial.println (rs.getResponseDescription ()) ، Serial.println (rs.code) ؛ printParameters (التكوين) ؛

الخطوة 15: شكرا

الآن لديك كل المعلومات للقيام بعملك ، لكنني أعتقد أنه من المهم عرض بعض الأمثلة الواقعية لفهم كل الاحتمالات بشكل أفضل.

  1. جهاز LoRa E32 لـ Arduino أو esp32 أو esp8266: الإعدادات والاستخدام الأساسي
  2. جهاز LoRa E32 لـ Arduino أو esp32 أو esp8266: مكتبة
  3. جهاز LoRa E32 لـ Arduino أو esp32 أو esp8266: التكوين
  4. جهاز LoRa E32 لـ Arduino أو esp32 أو esp8266: ناقل حركة ثابت
  5. جهاز LoRa E32 لـ Arduino أو esp32 أو esp8266: توفير الطاقة وإرسال البيانات المنظمة

موصى به: