آموزش اتصال ماژول LoRa SX1278 به ESP32
محتویات
LoRa یک تکنولوژی مبتنی بر امواج رادیویی هست که توسط شرکت Semtech معرفی شده و برای انتقال اطلاعات دو جهته با مسافتهای طولانی بدون مصرف انرژی زیاد مورد استفاده قرار میگیرد. اگر به تازگی با LoRa آشنا شدید، در مورد تکنولوژی LoRa و LoRaWAN بیاموزید و راهاندازی LoRa با اردوینو و Raspberry pi را مورد بررسی قرار دهید.
در این آموزش می آموزیم که چگونه می توانیم ماژول LoRa SX1278 را با استفاده از ESP32 راه اندازی کنیم. در اینجا ما از دو ماژول LoRa استفاده خواهیم کرد ( ارسال کننده اطلاعات و دریافت کننده اطلاعات ) – یکی را با استفاده از ESP32 و دیگری با برد آردوینو راه اندازی میکنیم. ESP32 داده های آب و هوا یک شهر را از API میگیرد و آن را از طریق فرستنده LoRa ارسال میکند. سپس آردوینو با استفاده گیرنده LoRa داده ها را دریافت کرده و روی LCD 16×2 نمایش می دهد. بنابراین ESP32 LoRa به عنوان فرستنده و Arduino LoRa به عنوان یک گیرنده عمل خواهند کرد. یک OLED نیز به ESP32 وصل شده است تا دما و رطوبت را در سمت فرستنده نمایش دهد.
قطعات مورد نیاز
- ESP32
- Arduino Uno
- شیلد Lora برای Arduino
- ماژول LoRa -02 SX1278 (×2)
- ماژول 16*2 LCD
- ماژول صفحه نمایش OLED
- برد برد
- سیم جامپر
با استفاده از لینک زیرمیتوانید به فایل ها (PCB) و تمام مراحل برای ساخت شیلد LoRa برای Arduino دسترسی پیدا کنید.
مدار LoRa با ESP32
شکل مدار بخش فرستنده (سرور) و گیرنده (کلاینت) ماژول LoRa در زیر آورده شده است. در این پروژه قصد داریم با استفاده از ماژول LoRa SX1278 داده های آب و هوا را از ماژول ESP32 به آردوینو Uno منتقل کنیم. داده های دما و رطوبت با استفاده از یک API از اینترنت به وسیله ESP32 دریافت میشوند و سپس آن ها را با استفاده از ماژول LoRa به آردوینو ارسال می کند.
قسمت فرستنده LoRa به وسیله ESP32
در قسمت ارسال، ما از ESP32 با ماژول LoRa و صفحه نمایش OLED استفاده می کنیم. ترسیم مدار این پروژه در زیر نشان داده شده است.
در جدول زیر نام پین ها و اتصالات به صورت کامل آورده شده است.
LoRa SX1278 Module | ESP32 |
3.3V | 3.3V |
GND | GND |
NSS | D5 |
DIO0 | D2 |
SCK | D18 |
MISO | D19 |
MOSI | D23 |
RST | D14 |
OLED Pin | ESP32 Pin |
Vcc | 3.3v |
GND | GND |
SCL | D22 |
SDA | D21 |
ما قبلا از صفحه نمایش OLED در بسیاری از پروژه ها استفاده کردیم.
راه اندازی قسمت دریافت LoRa به وسیله Arduino
در قسمت دریافت اطلاعات، ما ازشیلد Lora برایArduino استفاده می کنیم. ( این شیلد قبلاً برای پروژه ردیاب GPS مبتنی بر Lora طراحی شده. برای دریافت فایل Gerber و سایر اطلاعات در مورد شیلد LoRa می توانید روی لینک زیر کلیک کنید.)
این شیلد شامل ماژول SX1278 433MHz با رگولاتور 3.3 ولت است که با استفاده از رگولاتور متغیر LM317 طراحی شده است. این شیلد مستقیماً در بالای آردوینو قرار می گیرد و قابلیت های LoRa را برای آن فراهم می کند. ترسیم مداری کامل شیلدLoRa در تصاویر زیر آورده شده است:
ساخت لینک API برای دریافت اطلاعات آب و هوا
همانطور که قبلا دراین مقاله به آن اشاره شد، به یک لینک API برای دریافت داده های آب و هوا از اینترنت نیاز هست . در اینجا قصد داریم از وبسایت Weather API استفاده کنیم که دارای یک API بسیار ساده برای استفاده است و به ما این امکان را می دهد که اطلاعات آب و هوا را دریافت و بروزرسانی کنیم. بنابراین برای دریافت لینک API در وبسایت Weather API ثبت نام کنید.
پس از ثبت نام، به قسمت « My Account » بروید و API را دریافت کنید.
(API key یک کلید برای ارسال درخواست و دریافت اطلاعات می باشد.)
روی تب API Explorer کلیک کنید.
حالا در صفحه API explorer، نام شهر و API (دریافتی در قسمت قبل) را وارد کنید.
سپس به پایین اسکرول کنید و روی دکمه «Show Response » کلیک کنید تا درخواست ارسال شود. پس از آن API key را به شما می دهد.
لینک API خود را کپی کنید و در یک مرورگر پیست کنید و خروجی کار باید شبیه به زیر باشد. ( یک متغیر JSON )
پس از دریافت داده JSON حال باید کدی را بنویسیم که بتواند داده های مورد نیازمان را از متغیر JSON استخراج کنیم و به آن مطابق با نیاز های خود دسترسی داشته باشیم. برای این کار، وارد سایت ArduinoJson Assistant میشویم و داده های JSON را در قسمت Input پیست میکنیم.
حالا به پایین اسکرول کنید تا زمانی که به قسمت parsing program برسید. در این قسمت کد هایی که برای شما مفید هستند را کپی کنید.
کد های ارسال اطلاعات ESP32 با استفاده از LoRa
کد کامل قسمت فرستنده و گیرنده LoRa در انتهای این مقاله آورده شده است. در اینجا ما چند قسمت مهم از کد را توضیح می دهیم.
ابتدا تمام کتابخانه های مورد نیاز را اضافه میکنیم. SPI.h برای ارتباط SPI بین ESP32 و LoRa استفاده می شود، کتابخانه Wire.h برای ارتباط بین دستگاه های با پروتکل ارتباطی I2C استفاده می شود (OLED).
می توانید کتابخانه های مورد نیاز را از اینجا دانلود کنید.
#include <HTTPClient.h> #include <WiFi.h> #include <ArduinoJson.h> #include <SPI.h> #include <LoRa.h> #include <Wire.h> #include<SH1106.h>
سپس با استفاده از کد زیر OLED را تنظیم میکنیم برای این کار باید مقادیر آدرس و پین های ESP32 متصل به OLED را وارد کنیم.
مطابق کد زیر.
SH1106 display(0x3c, 21, 22);
ESP32 برای دریافت اطلاعات به اینترنت نیاز دارد پس باید آن را به یک وای فای متصل کنیم برای این کار باید نام و رمز عبور وای فای را ذخیره کنیم که طبق کد زیر آن ها را در دو متغیر ( که در کد زیر آمده است ) ذخیره میکنیم.
const char* ssid = "Wi-fi Name"; const char* pass = "Password";
بعد از آن پین های متصل به LoRa را تعریف میکنیم.
#define ss 5 #define rst 14 #define dio0 2
حال لینک API را (که قبلا ایجاد کرده بودیم) وارد میکنیم تا از طریق آن بتوانیم دما و رطوبت را دریافت کنیم.
Const char* url = "http://api.weatherapi.com/v1/current.json?key=ade61a8aef37445d8c0100632202407&q=Jaipur";
در داخل تابع setup، سریال مانیتور را با نرخ 115200 برای برای دیباگ کردن تنظیم میکنیم ، همچنین صفحه نمایش OLED و ارتباط LoRa را با تابع () begin راه ندازی می کنیم.
Serial.begin(115200); Serial.println(ssid); WiFi.begin(ssid, pass); while (WiFi.status() != WL_CONNECTED) { delay(500); } LoRa.setPins(ss, rst, dio0); while (!LoRa.begin(433E6)) { } LoRa.setSyncWord(0xF3); }
اکنون در تابع loop بررسی می کنیم که آیا فایل JSON توسط ESP32 دریافت می شود یا خیر و با استفاده از کد زیر داده های JSON را روی سریال مانیتور پرینت می کنیم.
int httpCode = https.GET(); if (httpCode > 0) { String payload = https.getString(); char charBuf[500]; payload.toCharArray(charBuf, 500); Serial.println(payload);
پس از آن از کدی را که به وسیله ArduinoJson Assistant تولید کردیم استفاده میکنیم. این کد به ما کمک میکند تا اطلاعات دما و رطوبت شهر مورد نظر را از متغیر JSON دریافت کنیم.
const size_t capacity = JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(8) + JSON_OBJECT_SIZE(23) + 490; DynamicJsonDocument doc(capacity); const char* json = "{\"location\":{\"name\":\"Jaipur\",\"region\":\"Rajasthan\",\"country\":\"India\",\"lat\":26.92,\"lon\":75.82,\"tz_id\":\"Asia/Kolkata\",\"localtime_epoch\":1595741089,\"localtime\":\"2020-07-26 10:54\"},\"current\":{\"last_updated_epoch\":1595740520,\"last_updated\":\"2020-07-26 10:45\",\"temp_c\":31,\"temp_f\":87.8,\"is_day\":1,\"condition\":{\"text\":\"Mist\",\"icon\":\"//cdn.weatherapi.com/weather/64x64/day/143.png\",\"code\":1030},\"wind_mph\":0,\"wind_kph\":0,\"wind_degree\":0,\"wind_dir\":\"N\",\"pressure_mb\":1008,\"pressure_in\":30.2,\"precip_mm\":0,\"precip_in\":0,\"humidity\":66,\"cloud\":50,\"feelslike_c\":32.2,\"feelslike_f\":89.9,\"vis_km\":5,\"vis_miles\":3,\"uv\":8,\"gust_mph\":7.2,\"gust_kph\":11.5}}"; deserializeJson(doc, json); long current_last_updated_epoch = current["last_updated_epoch"]; const char* current_last_updated = current["last_updated"]; // int current_temp_c = current["temp_c"]; // 31 int current_humidity = current["humidity"]; // 66
حال در مرحله آخر، مقادیر دما و رطوبت را به گیرنده LoRa ارسال میکنیم.
LoRa.beginPacket(); LoRa.print("Temperature: "); LoRa.print(current_temp_c); LoRa.print("c"); LoRa.print("Humidity: "); LoRa.print(current_humidity); LoRa.endPacket();
کد های دریافت اطلاعات Arduino از LoRa
به طور مشابه، کتابخانه ماژول LoRa و LCD را اضافه می کنیم و مشخص می کنیم که LCD به کدام پین ها متصل است.
#include <SPI.h> #include <LoRa.h> #include <LiquidCrystal.h> constintrs = 8, en = 7, d4 = 6, d5 = 5, d6 = 4, d7 = 3; LiquidCrystallcd(rs, en, d4, d5, d6, d7);
در داخل تابع loop، داده ها را به صورت پک شده از ماژول فرستنده دریافت می کنیم. پس از دریافت پک داده ها از گیرنده LoRa، آردوینو شروع به خواندن آنها به صورت کاراکتر می کند و آنها را روی LCD چاپ می کند. هنگامی که کلمه کلیدی “c” را دریافت می کند، باقی اطلاعات را بر روی خط دوم چاپ میکند.
void loop() { intpacketSize = LoRa.parsePacket(); if (packetSize) { Serial.print("Received packet '"); while (LoRa.available()) { char incoming = (char)LoRa.read(); if (incoming == 'c') { lcd.setCursor(0, 1); } else { lcd.print(incoming); }
نحوه کارکرد ESP32-LoRa
پس از آماده شدن سخت افزار و برنامه، کدهای زیر را در ماژول های ESP32 و Arduino آپلود کنید. ESP32 مقادیر را به ماژول فرستنده میدهد و ماژول فرستنده مقادیر دما و رطوبت را به ماژول گیرنده ارسال می کند. ماژول گیرنده LoRa آنها را مطابق شکل زیر بر روی LCD متصل به آردوینو نمایش می دهد.
موارد موجود در فایل : سورس کامل
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود