آموزش Espآموزش ESP32آموزش اینترنت اشیاپروژه های Esp

ساخت سرور بلوتوث کم مصرف BLE با ESP32 (+ نمایش میزان باتری)

در این پروژه ESP32 ما به طور کامل با ساخت یک سرور بلوتوث کم مصرف BLE آشنا میشویم. در اینجا ما از BLE ESP32 به عنوان سرور استفاده میکنیم.

هدفون های بی سیم ، دست بند های تناسب اندام ، اسپیکر های بلوتوث ، هدفون درون گوش ، تلفن های همراه ، لپ تاپ و … دستگاه های بلوتوث زیادی در اطراف ما وجود دارد و بیشتر این دستگاه ها باتری کار می کنند. آیا تاکنون فکر کرده اید که وقتی یک دستگاه بلوتوث را به تلفن همراه خود وصل می کنید ، چگونه می فهمد که دستگاه متصل یک رایانه یا یک دستگاه صوتی یا یک تلفن همراه است؟ برای بعضی از دستگاهها حتی ممکن است تلفن ما درصد باتری دستگاه متصل را به طور خودکار نشان دهد. چگونه این ها اتفاق می افتد؟ باید یک پروتکل مشترک بین تلفن و دستگاه بلوتوث به اشتراک گذاشته شود.

همچنین کار کامل در فیلم زیر نشان داده شده است.

آموزش ساخت سرور BLE با ESP32

در این مقاله یاد خواهیم گرفت که چگونه ESP32 BLE را به عنوان سرور پیکربندی کنیم و از سرویس GATT برای ارسال اطلاعات درباره سطح باتری استفاده کنیم. برای آزمایش ، مقادیر هارد کد شده از ESP32 را به عنوان درصد باتری به تلفن همراه خود از طریق سرویس BLE GATT ارسال می کنیم ، از این طریق موبایل ما فرض خواهد کرد که ESP32 یک باتری بلوتوث است که سعی در ارسال درصد باتری دارد. قبل از ادامه اجازه دهید چند اصطلاح پرکاربرد در زمینه BLE را معرفی کنیم. با راه اندازی سرور بلوتوث کم مصرف توسط ESP32 همراه باشید !

پیشنهاد میکنم قبل از خواندن این مقاله، کنترل وسایل خانه با موبایل اندروید و بلوتوث برد ESP32 را هم بخوانید زیرا به صورت مستقیم با هم ارتباط دارند. این پروژه نیازی به تنظیم سخت افزاری ندارد اما اطمینان حاصل کنید که نحوه برنامه نویسی ESP32 با آردوینو را بدانید.

همچنین برای آزمایش سرویس های BLE ما از برنامه nRF android در تلفن همراه خود استفاده می کنیم که می توان این نرم افزار را مستقیم از پلی استور بارگیری کرد. همچنین این نرم افزار در فروشگاه Itunes برای کاربران Iphone در دسترس است.

تنظیم ESP32 برای نمایش سطح باتری با سرویس GATT

تصور می کنیم که شما با سرویس GATT و چگونگی اجرای آن با استفاده از سرویس ها و مدل های مشخص آشنایی دارید. حال اجازه دهید به سمت برنامه برویم تا بدانیم چگونه GATT را در برد ESP32 با استفاده از نرم افزار Arduino پیاده سازی کنیم.

ما برنامه را با وارد کردن کتابخانه های مورد نیاز در پروژه خود شروع می کنیم.

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h> // کتابخانه برای استفاده از بلوتوث کم انرژی در حالت سرور
#include <BLE2902.h>

در مرحله بعد باید دستگاه Callback با سرور را برای دستگاه بلوتوث خود تعریف کنیم. قبل از این اجازه دهید تا بدانیم که عملکرد برگشتی یا همان Call Back در BLE چیست.

عملکرد برگشتی Call Back در BLE چیست؟

هنگامی که BLE به عنوان سرور در حال فعالیت است ، مهم است که عملکرد برگشتی سرور را تعریف کنید. انواع Call Back ها با BLE وجود دارد ، اما به عبارت ساده ، این موارد را به عنوان تأییدیه ای درنظر می گیرید تا مطمئن شوید که عمل به اتمام رسیده است. مثلا شما تغییری را در دستگاه مورد نظر انجام میدهید، دستگاه مورد نظر یک پیام برای شما ارسال میکند که این تغییر انجام شده است. به این پیام تایید تماس برگشتی یا همان Call Back میگویند.

ما از خطوط کد زیر برای انجام پاسخ به سرور استفاده می کنیم.

bool _BLEClientConnected = false;
class MyServerCallbacks : public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      _BLEClientConnected = true;
    };

    void onDisconnect(BLEServer* pServer) {
      _BLEClientConnected = false;
    }
};

در داخل تابع setup void ، ما برای ایجاد اشکال زدایی ، ارتباط سریال را در 115200 آغاز می کنیم و سپس دستگاه بلوتوث را از طریق عملکرد InitBLE آغاز می کنیم.

void setup() {
  Serial.begin(115200);
  Serial.println("Battery Level Indicator - BLE");
  InitBLE();
}

STARTBLE مکانی است که تمام عملیات ها در آن اتفاق می افتد. ما باید یک سرور بلوتوث ایجاد کنیم و از سرویس سطح باتری در اینجا استفاده کنیم. اما قبل از آن ما باید UUID را برای سرویس ، مشخصات و توصیف کننده برای خواندن سطح باتری تعریف کنیم (اگر نمیدانید این اصطلاحات چه هستند، مقاله بلوتوث کم مصرف چیست را بخوانید). در اینجا ما میخواهیم از سرویس باتری استفاده کنیم بنابراین UUID را باید به عنوان 0X180F تعریف کنیم. مانند تصویر زیر :

تنظیم ESP32 برای نمایش سطح باتری با سرویس GATT

تمامی این مراحل در کد پایانی انجام شده است و این اطلاعات فقط برای توضیح دادن نحوه کار پروژه است.

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید

نام BatterySerivce ، BatteryLevelCharacteristic و BatteryLevelDescriptor متغیرهای تعریف شده توسط کاربر هستند که ما در این برنامه استفاده می کنیم.

#define BatteryService BLEUUID((uint16_t)0x180F)
BLECharacteristic BatteryLevelCharacteristic(BLEUUID((uint16_t)0x2A19), BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY);
BLEDescriptor BatteryLevelDescriptor(BLEUUID((uint16_t)0x2901));

به عملکرد initBLE بر میگردیم. ابتدا باید سرور BLE را راه اندازی کرده و آن را با یک نام تبلیغ کنیم. خطوط زیر برای شروع BLE به عنوان سرور استفاده می شود. نامی که من به سرور BLe من داده ام “Battery BLE” است ، اما می توانید نام مورد نظر خود را انتخاب کنید.

 BLEDevice::init("BLE Battery");
  // Create the BLE Server
  BLEServer *pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());

بعد باید سرویس GATT را راه اندازی کنیم. UUID را قبلاً تعریف کرده ایم و می توانیم با استفاده از خط زیر سرویس را به سادگی شروع کنیم.

  BLEService *pBattery = pServer->createService(BatteryService);

پس از شروع سرویس می توانیم توصیفگر (descriptor) را با مشخصات پیوند دهیم و مقادیر را تنظیم کنیم. سرویس BLE2902 نیز مطابق شکل زیر در اینجا اضافه شده است.

  pBattery->addCharacteristic(&BatteryLevelCharacteristic);
  BatteryLevelDescriptor.setValue("Percentage 0 - 100");
  BatteryLevelCharacteristic.addDescriptor(&BatteryLevelDescriptor);
  BatteryLevelCharacteristic.addDescriptor(new BLE2902());

سرانجام همه چیز تنظیم شده است ، اکنون تمام چیزهایی که باقی مانده این است که از ESP32 بخواهیم تبلیغ کند تا دستگاه های دیگری مانند تلفن ما بتوانند آن را کشف کرده و به آن متصل شوند ، و هنگام اتصال به مشتری باید سرویس باتری را آغاز کند که می تواند توسط سطرهای زیر انجام شود.

  pServer->getAdvertising()->addServiceUUID(BatteryService);
  pBattery->start();
  // Start advertising
  pServer->getAdvertising()->start();

آخرین مرحله توصیف مقدار باتری در درصد است که باید برای مشتری (کلاینت) ارسال شود (یعنی تلفن همراه). این مقدار می تواند از 0-100 باشد. برای ساده نگهداشتن پروژه، من به صورت ساده مقدار باتری را عدد 57 قرار میدهیم و سپس آن را در هر 5 ثانیه افزایش میدهم. توجه داشته باشید که مقداری که ارسال می شود در قالب unit8_t است.

  uint8_t level = 57;

void loop() {
  BatteryLevelCharacteristic.setValue(&level, 1);
  BatteryLevelCharacteristic.notify();
  delay(5000);

  level++;
  Serial.println(int(level));

  if (int(level)==100)
  level=0;
}

تست سرویس GATT در ESP32 BLE

کد کامل پروژه در انتهای صفحه در فایل دانلودی قرار داده شده است. کد را در برد ESP32 خود بارگذاری کنید. سپس باید در تلفن همراه خود یک دستگاه با نام BLE Battery پیدا کنید.

سپس برنامه nRF اندروید را نصب کرده و آن را باز کرده و به دستگاه BLE Battery متصل شوید. (دانلود نرم افزار nRF) بخش Battery Service را گسترش داده و باید صفحه زیر را پیدا کنید.

تست سرویس GATT در ESP32 BLE

همانطور که مشاهده می کنید برنامه به طور خودکار تشخیص داده است که BLE خدمات باتری را ارائه می دهد و از ویژگی های سطح باتری به دلیل UUID که در برنامه استفاده کرده ایم ، برخوردار است. همچنین می توانید مقدار باتری فعلی را ببینید که 67٪ است.

نکته جالب در مورد استفاده از BLE این است که اکنون هر برنامه ای که با BLE کار کند فکر خواهد کرد که ESP32 شما یک دستگاه BLE است که میزان باتری را اطلاع می دهد. برای امتحان کردن، من از برنامه ای به نام BatON استفاده کردم و همانطور که مشاهده میکنید میزان درصد باتری را به صورت ناتیفیکشن نشان میدهد.

اکنون که یاد گرفته اید که چگونه از خدمات باتری BLE با ESP32 استفاده کنید ، می توانید سایر سرویس های GATT را امتحان کنید که بسیار جالب هستند مانند HID ، ضربان قلب و…

موارد موجود در فایل : سورس کامل

4.3 (6 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

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

2 نظر

  1. با سلام خدمت اقای رحیمی
    من میخاستم تو این پروژه بتونم شماره تلفن تماس گیرنده و یک ساعت دیجیتال را روی oled نمایش بدم.این کار ممکن هست؟ اگر امکان داره راهنمایی بفرمایید. تو اینترنت خیلی گشتم چیزی پیدا نکردم.ممنون

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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *