فهرست مطالب:

ارتباط بی سیم LoRa 3 کیلومتر تا 8 کیلومتر با هزینه کم E32 (sx1278/sx1276) دستگاه Arduino ، Esp8266 یا Esp32: 15 مرحله
ارتباط بی سیم LoRa 3 کیلومتر تا 8 کیلومتر با هزینه کم E32 (sx1278/sx1276) دستگاه Arduino ، Esp8266 یا Esp32: 15 مرحله

تصویری: ارتباط بی سیم LoRa 3 کیلومتر تا 8 کیلومتر با هزینه کم E32 (sx1278/sx1276) دستگاه Arduino ، Esp8266 یا Esp32: 15 مرحله

تصویری: ارتباط بی سیم LoRa 3 کیلومتر تا 8 کیلومتر با هزینه کم E32 (sx1278/sx1276) دستگاه Arduino ، Esp8266 یا Esp32: 15 مرحله
تصویری: نمای کلی و پیکربندی ماژول EBYTE LoRa 2024, دسامبر
Anonim
ارتباط بی سیم LoRa 3 کیلومتر تا 8 کیلومتر با هزینه کم E32 (sx1278/sx1276) دستگاه برای Arduino ، Esp8266 یا Esp32
ارتباط بی سیم LoRa 3 کیلومتر تا 8 کیلومتر با هزینه کم E32 (sx1278/sx1276) دستگاه برای Arduino ، Esp8266 یا Esp32

من یک کتابخانه برای مدیریت EBYTE E32 بر اساس سری Semtech دستگاه LoRa ، دستگاه بسیار قدرتمند ، ساده و ارزان قیمت ایجاد می کنم.

شما می توانید نسخه 3Km را در اینجا ، نسخه 8Km را در اینجا پیدا کنید

آنها می توانند در فاصله 3000 تا 8000 متر کار کنند و ویژگی ها و پارامترهای زیادی دارند. بنابراین من این کتابخانه را برای ساده سازی استفاده ایجاد می کنم.

این یک راه حل برای بازیابی اطلاعات از سنسورهای کلان شهر یا کنترل هواپیماهای بدون سرنشین است.

تدارکات

آردوینو UNO

Wemos D1 mini

نسخه LoRa E32 TTL 100 3Km

نسخه 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 خارجی و بازگشت بالا در پایان انتقال داده استفاده کرد.

هنگام دریافت AUX LOW و بازگشت بالا هنگامی که بافر خالی است.

همچنین برای بازگرداندن خودکار به حالت عادی (در حالت روشن/خاموش/حالت برنامه/برنامه) استفاده می شود.

مرحله 4: طرحواره کاملاً متصل Esp8266

طرحواره کاملاً متصل Esp8266
طرحواره کاملاً متصل Esp8266
طرحواره کاملاً متصل Esp8266
طرحواره کاملاً متصل Esp8266

طرح اتصال esp8266 ساده تر است زیرا در همان ولتاژ ارتباطات منطقی (3.3v) کار می کند.

برای به دست آوردن ثبات خوب ، افزودن مقاومت کششی (4 ، 7 کیلو اهم) بسیار مهم است.

مرحله 5: طرحواره کاملاً متصل به آردوینو

طرح کامل آردوینو
طرح کامل آردوینو
طرح کامل آردوینو
طرح کامل آردوینو

ولتاژ کار آردوینو 5 ولت است ، بنابراین برای جلوگیری از آسیب ، ما باید یک تقسیم کننده ولتاژ را در پین RX M0 و M1 ماژول LoRa اضافه کنیم ، در اینجا می توانید اطلاعات بیشتری را دریافت کنید تقسیم ولتاژ: ماشین حساب و برنامه کاربردی.

می توانید از مقاومت 2 کیلو اهم به GND و 1 کیلو اهم از سیگنال استفاده کنید تا روی RX قرار داده شود.

مرحله 6: کتابخانه: سازنده

من مجموعه ای از سازندگان بسیار متعدد تهیه کردم ، زیرا ما می توانیم گزینه ها و موقعیت های بیشتری برای مدیریت داشته باشیم.

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 پین هایی هستند که عملکرد MODE را تغییر می دهند (به جدول بالا مراجعه کنید) ، من فکر می کنم این پین ها در "تولید" مستقیماً به صورت HIGH یا LOW به هم متصل می شوند ، اما برای آزمایش مفید است که توسط کتابخانه مدیریت شوند.

bpsRate حجم نرم افزاری نرم افزار است معمولاً سریال 9600 است (تنها نرخ باود در حالت برنامه/خواب)

یک مثال ساده این است

#شامل "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* ، byte auxPin ، UART_BPS_RATE bpsRate = UART_BPS_RATE_9600) ؛

LoRa_E32 (سریال سخت افزار* ، بایت 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* ، UART_BPS_RATE bpsRate = UART_BPS_RATE_9600) ؛

LoRa_E32 (سریال SoftwareSerial* ، byte auxPin ، UART_BPS_RATE bpsRate = UART_BPS_RATE_9600) ؛

LoRa_E32 (سریال SoftwareSerial* ، بایت auxPin ، بایت m0Pin ، بایت m1Pin ، UART_BPS_RATE bpsRate = UART_BPS_RATE_9600) ؛

مرحله 7: شروع کنید

دستور شروع برای راه اندازی سریال و پین در حالت ورودی و خروجی استفاده می شود.

void begin ()؛

در اجرا است

// راه اندازی همه پین ها و UART

e32ttl100.begin ()؛

مرحله 8: پیکربندی و روش اطلاعات

مجموعه ای از روش ها برای مدیریت پیکربندی و دریافت اطلاعات دستگاه وجود دارد.

ResponseStructContainer getConfiguration ()؛

ResponseStatus setConfiguration (پیکربندی پیکربندی ، PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE) ؛

ResponseStructContainer getModuleInformation ()؛

void printParameters (پیکربندی ساختار پیکربندی) ؛

ResponseStatus resetModule ()؛

مرحله 9: ظرف پاسخگو

برای ساده سازی مدیریت پاسخ ، من مجموعه ای از ظرف را ایجاد می کنم ، برای مدیریت بسیار مفید خطاها و بازگشت داده های عمومی.

وضعیت پاسخ

این یک محفظه وضعیت است و دارای 2 نقطه ورود ساده است ، با این کار می توانید کد وضعیت و توضیحات کد وضعیت را دریافت کنید

Serial.println (c.getResponseDescription ()) ؛ // توضیحات کد

Serial.println (کد c) ؛ // 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

ResponseContainer

این ظرف برای مدیریت پاسخ String ایجاد شده است و دارای 2 نقطه ورود است.

داده با رشته از پیام و وضعیت به عنوان نمونه ای از RepsonseStatus بازگردانده می شود.

ResponseContainer rs = e32ttl.receiveMessage ()؛

پیام رشته = rs.data؛

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

Serial.println (پیام) ؛

ResponseStructContainer

این محفظه "پیچیده تر" است ، من از آن برای مدیریت ساختار استفاده می کنم ، همان نقطه ورود ResponseContainer را دارد اما داده ها یک اشاره گر خالی برای مدیریت ساختار پیچیده هستند.

ResponseStructContainer c؛

c = e32ttl100.getConfiguration ()؛ // دریافت نشانگر پیکربندی قبل از سایر عملیات مهم است

پیکربندی پیکربندی = *(پیکربندی *) c.data؛

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

Serial.println (c.status.code) ؛

getConfiguration و setConfiguration

اولین روش getConfiguration است ، می توانید از آن برای بازیابی تمام داده های ذخیره شده روی دستگاه استفاده کنید.

ResponseStructContainer getConfiguration ()؛

در اینجا یک مثال استفاده می شود.

ResponseStructContainer c؛

c = e32ttl100.getConfiguration ()؛ // دریافت نشانگر پیکربندی قبل از سایر عملیات مهم است

پیکربندی پیکربندی = *(پیکربندی *) c.data؛

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

Serial.println (c.status.code) ؛

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

ساختار پیکربندی همه داده های تنظیمات را دارد و من یک سری تابع برای دریافت همه توضیحات تک داده اضافه می کنم.

configuration. ADDL = 0x0؛ // قسمت اول آدرس پیکربندی. 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؛ // ارتباط سرعت تنظیمات configuration. SPED.uartParity = MODE_00_8N1؛ // بیت برابری

برای به دست آوردن همه توضیحات ، تابع معادل همه ویژگی ها را دارید:

Serial.print (F ("چان:")) ؛ 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 ()) ؛

به همین ترتیب 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 (پیکربندی) ؛ 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؛ // تنظیمات پیکربندی تغییر کرده و تنظیم شده است که پیکربندی ResponseStatus rs = e32ttl100.setConfiguration را نگه ندارد (پیکربندی ، WRITE_CFG_PWR_DWN_LOSE) ؛ Serial.println (rs.getResponseDescription ()) ؛ Serial.println (rs.code) ؛ printParameters (پیکربندی) ؛

همه پارامترها بصورت ثابت مدیریت می شوند:

مرحله 10: گزینه اصلی پیکربندی

گزینه اصلی پیکربندی
گزینه اصلی پیکربندی

مرحله 11: ارسال پیام دریافت

ابتدا باید یک روش ساده اما مفید را برای بررسی اینکه آیا چیزی در بافر دریافت کننده وجود دارد ، معرفی کنیم

int در دسترس ()؛

به سادگی تعداد بایت های موجود در جریان فعلی را برمی گرداند.

مرحله 12: حالت انتقال معمولی

حالت انتقال معمولی
حالت انتقال معمولی

حالت انتقال معمولی/شفاف برای ارسال پیام به همه دستگاه ها با آدرس و کانال یکسان استفاده می شود.

روشهای زیادی برای ارسال/دریافت پیام وجود دارد ، ما قصد داریم به تفصیل توضیح دهیم:

ResponseStatus sendMessage (پیام رشته ای const) ؛

ResponseContainer ReceMessage ()؛

روش اول sendMessage است و برای ارسال String به دستگاه در حالت عادی استفاده می شود.

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

دستگاه دیگر به سادگی در حلقه انجام دهید

if (e32ttl.available ()> 1) {ResponseContainer rs = e32ttl.receiveMessage ()؛ پیام رشته = rs.data؛ // ابتدا اطلاعات Serial.println (rs.status.getResponseDescription ()) را دریافت کنید؛ Serial.println (پیام) ؛ }

مرحله 13: مدیریت ساختار

اگر می خواهید یک ساختار پیچیده ارسال کنید ، می توانید از این روش استفاده کنید

ResponseStatus sendMessage (const void *message، const uint8_t size) ؛ ResponseStructContainer دریافتMessage (اندازه const uint8_t) ؛

برای ارسال strucutre استفاده می شود ، به عنوان مثال:

struct Messaggione {نوع char [5]؛ پیام char [8]؛ bool mitico؛ }؛ struct Messaggione messaggione = {"TEMP"، "Peple"، true}؛ ResponseStatus rs = e32ttl.sendMessage (& messaggione، sizeof (Messaggione))؛ Serial.println (rs.getResponseDescription ()) ؛

و از طرف دیگر می توانید پیام را دریافت کنید تا

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

ساختار جزئی را بخوانید

اگر می خواهید قسمت اول پیام را برای مدیریت نوع بیشتری از strucutre بخوانید ، می توانید از این روش استفاده کنید.

ResponseContainer ReceInitialMessage (اندازه const uint8_t) ؛

من آن را برای دریافت یک رشته با نوع یا دیگر برای شناسایی ساختار مورد نظر برای بارگیری ایجاد می کنم.

struct Messaggione {// strucutre جزئی بدون پیام typechar [8]؛ bool mitico؛ }؛ نوع char [5]؛ // قسمت اول ساختار ResponseContainer rs = e32ttl.receiveInitialMessage (sizeof (نوع)) ؛ // رشته را در یک آرایه char (لازم نیست) memcpy (نوع ، rs.data.c_str () ، sizeof (نوع)) قرار دهید. Serial.println ("نوع خواندن:") ؛ Serial.println (rs.status.getResponseDescription ())؛ Serial.println (نوع) ؛ // بقیه ساختار ResponseStructContainer rsc = e32ttl.receiveMessage (sizeof (Messaggione)) را بخوانید ؛ struct Messaggione messaggione = *(Messaggione *) rsc.data؛

مرحله 14: حالت ثابت به جای حالت عادی

به همین ترتیب مجموعه ای از روش ها را برای استفاده در انتقال ثابت ایجاد می کنم

انتقال ثابت

شما فقط باید روش ارسال را تغییر دهید ، زیرا دستگاه مقصد مقدمه آدرس و کانال quando settato il fixed mode را دریافت نمی کند.

بنابراین برای پیام رشته شما دارید

ResponseStatus sendFixedMessage (بایت ADDL ، بایت ADDH ، بایت CHAN ، پیام String message) ؛ ResponseStatus sendBroadcastFixedMessage (بایت CHAN ، const string string) ؛

و برای ساختار شما

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

در اینجا یک مثال ساده

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 (پیکربندی) ؛ configuration. ADDL = BROADCAST_ADDRESS؛ configuration. 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: صرفه جویی در انرژی و ارسال داده های ساختار یافته

توصیه شده: