تکنولوژی BLE مربوط به بلوتوث بوده و کاربردهای مختلفی دارد. این تکنولوژی علاوه بر مصرف انرژی بهینه، سرعت تبادل قابل توجهی دارد. در این آموزش قصد داریم به بررسی تکنولوژی BLE در بردهای ESP32 بپردازیم همچنین دو پروژه با این محوریت انجام خواهیم داد. در ادامه مفاهیم مربوط به BLE و نحوه راه اندازی و استفاده از آن در بردهای ESP32 را شرح خواهم داد. برای آموزش های بیشتر به CiferTech مراجعه کنید، همچنین برای حمایت از من حتما پیج من در اینستاگرام را دنبال کنید. ^-^
بلوتوث BLE کممصرف
تکنولوژی بلوتوث BLE با عنوان Bluetooth4.0 در سال 2001 برای اولین بر معرفی شد و از نظر کلی تفاوتی که با مفهوم پیشین بلوتوث دارد، مصرف توان کمتر می باشد. بلوتوث BLE بیشترین استفاده را در اینترنت اشیا دارد زیرا در دیوایس های اینترنت اشیا یکی از چالش های موجود مصرف توان دستگاه ها می باشد که می توان برای مدت طولانی در یک مکان ثابت با یک باتری از آن ها استفاده کرد؟! خب BLE با این نظر که اگر تبادل اطلاعاتی صورت نگیرد در واقع غیر فعال یا خاموش می شود توان بسیار کمتری مصرف می کند و با یک باتری تا چندین ماه قابل استفاده خواهد بود.
معماری بلوتوث BLE کم مصرف
۱- لایه کاربرد یا APPS این لایه شامل منطق، رابط کاربری و مدیریت داده میشود.
۲- لایه HOST عبارتست از
- پروفایل دسترسی عمومی
- پروفایل مشخصات عمومی
- کنترل لینک منطقی و پروتکل سازگاری
- پروتکل مشخصه
- مدیر امنیت
- رابط کنترلکننده و هاست
۳- لایه کنترلکننده “Controller” عبارتست از
- رابط کنترلکننده هاست
- لایه ارتباط
- لایه فیزیکی
بلوتوث Bluetooth
بلوتوث (Bluetooth) نام یک استاندارد فناوری بیسیم با برد کم برای فرستادن پیام، عکس یا هر اطلاعات دیگر است که از لقب یک پادشاه منطقه اسکاندیناوی به نام هارالد بلاتند گرفته شده است. ارتباط ماژول های بلوتوث با فرکانسهای رادیویی صورت می پذیرد، هر ماژول بلوتوث دارای یک تراشه فرستنده یا گیرنده مربعیشکل است که در باند فرکانسی GHz ۲٫۴ تا GHz ۲٫۴۸ کار میکند. این فرکانس از این لحاظ انتخاب شده، که در سراسر جهان بهطور رایگان در دسترس است و محدودیتهای داشتن مجوز را ندارد.
برد ESP32 با بلوتوث BLE
تراشه ESP32 نسل پیشرفته ESP8266 است. یکی از تفاوتهای آن بلوتوث داخلیاش است. همچنین دارای هسته وایفای ۲,۴ گیگا هرتزی و بلوتوث داخلی تولید شده با تکنولوژی ۴۰ نانومتری شرکت TSMC است. این ماژول دارای بهترین پرفورمنس در مصرف انرژی بوده و با کمترین مصرف انرژی بهترین نتیجه را برای ما به همراه دارد. اگر بخواهیم دقیقتر به این برد نگاه کنیم باید بگوییم، یک chip است که پلتفرم NodeMCU در اون پیاده سازی شده که به این نوع چیپها System on a chip microcontrollers هم گفته میشود. دارای چندین پایه GPIO برای ارتباط با سخت افزارهای مختلف است. در زیر نمایی از این برد خارق العاده را مشاهده میکنید.
شرح پروژه بلوتوث BLE
در این آموزش دو نمونه پروژه را تست خواهیم کرد، در یکی از پروژه ها با استفاده از برد ESP32 یک دستگاه BLE می سازیم که توسط دیگر دستگاه ها از جمله موبایل هوشمند قابل شناسایی است و در دومین پروژه، قادر خواهیم بود دستگاه های اطراف که از BLE استفاده می کنند را تشخیص داد و همچنین مک آدرس های آن ها را به نمایش درآورد.
نصب افزونه ESP32 در Arduino IDE
در این آموزش از برد ESP32 استفاده می کنیم، در ادامه مراحل را برای نصب این برد در نرم افزار آردوینو دنبال کنید:
- ابتدا در نرم افزار Arduino IDE به مسیر File> Preferences بروید.
- لینک زیر را در بخش مشخص شده قرار دهید.
1 2 |
<span style="font-size: 14px;">https://dl.espressif.com/dl/package_esp32_index.json, http://arduino.esp8266.com/stable/package_esp8266com_index.json </span> |
- سپس به مسیر Tools > Board > Boards Manager بروید.
- در بخش board manager کلمه ESP32 را سرچ کنید و بر روی install کلیک کنید.
مثال 1 : دیوایس BLE
با آپلود این کد در برد ESP32، در واقع یک دیوایس BLE قابل شناسایی توسط سایر دستگاه ها ساخته ایم که اولین گام برای کار با BLE می باشد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<span style="font-size: 14px;">#include "SimpleBLE.h" #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED) #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it #endif SimpleBLE ble; void onButton(){ String out = "BLE32 name: "; out += String(millis() / 1000); Serial.println(out); ble.begin(out); } void setup() { Serial.begin(115200); Serial.setDebugOutput(true); pinMode(0, INPUT_PULLUP); Serial.print("ESP32 SDK: "); Serial.println(ESP.getSdkVersion()); ble.begin("ESP32 SimpleBLE"); Serial.println("Press the button to change the device's name"); } void loop() { static uint8_t lastPinState = 1; uint8_t pinState = digitalRead(0); if(!pinState && lastPinState){ onButton(); } lastPinState = pinState; while(Serial.available()) Serial.write(Serial.read()); }</span> |
- در نهایت ESP32 شما در جستجوی دستگاه های دیگر به شکل زیر به نمایش در خواهد آمد.
مثال 2 : اسکن دیوایس های BLE اطراف
در این مثال پس از آپلود کد و باز کردن سریال مانیتور در Arduino IDE، مک آدرس دستگاه های BLE اطراف برای شما به نمایش در خواهند آمد همچنین اطلاعی مانند نام دستگاه و قدرت ارسال سیگنال نیز در دسترس خواهد بود.
- در این قسمت کتابخانه های مورد نیاز را به کد اضافه کرده ایم.
1 2 3 4 |
<span style="font-size: 14px;">#include <BLEDevice.h> #include <BLEUtils.h> #include <BLEScan.h> #include <BLEAdvertisedDevice.h></span> |
- در این قسمت متغیر های مورد نیاز را تعریف می کینم.
1 2 3 4 5 |
<span style="font-size: 14px;">String knownBLEAddresses[] = {"aa:bc:cc:dd:ee:ee", "54:2c:7b:87:71:a2"}; int RSSI_THRESHOLD = -55; bool device_found; int scanTime = 5; //In seconds BLEScan* pBLEScan;</span> |
- کد کامل پروژه
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
<span style="font-size: 14px;">#include <BLEDevice.h> #include <BLEUtils.h> #include <BLEScan.h> #include <BLEAdvertisedDevice.h> String knownBLEAddresses[] = {"6E:bc:55:18:cf:7b", "53:3c:cb:56:36:02", "40:99:4b:75:7d:2f", "5c:5b:68:6f:34:96"}; int RSSI_THRESHOLD = -55; bool device_found; int scanTime = 5; //In seconds BLEScan* pBLEScan; class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { void onResult(BLEAdvertisedDevice advertisedDevice) { for (int i = 0; i < (sizeof(knownBLEAddresses) / sizeof(knownBLEAddresses[0])); i++) { //Uncomment to Enable Debug Information //Serial.println("*************Start**************"); //Serial.println(sizeof(knownBLEAddresses)); //Serial.println(sizeof(knownBLEAddresses[0])); //Serial.println(sizeof(knownBLEAddresses)/sizeof(knownBLEAddresses[0])); //Serial.println(advertisedDevice.getAddress().toString().c_str()); //Serial.println(knownBLEAddresses[i].c_str()); //Serial.println("*************End**************"); if (strcmp(advertisedDevice.getAddress().toString().c_str(), knownBLEAddresses[i].c_str()) == 0) { device_found = true; break; } else device_found = false; } Serial.printf("Advertised Device: %s \n", advertisedDevice.toString().c_str()); } }; void setup() { Serial.begin(115200); //Enable UART on ESP32 Serial.println("Scanning..."); // Print Scanning pinMode(LED_BUILTIN, OUTPUT); //make BUILTIN_LED pin as output BLEDevice::init(""); pBLEScan = BLEDevice::getScan(); //create new scan pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); //Init Callback Function pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster pBLEScan->setInterval(100); // set Scan interval pBLEScan->setWindow(99); // less or equal setInterval value } void loop() { // put your main code here, to run repeatedly: BLEScanResults foundDevices = pBLEScan->start(scanTime, false); for (int i = 0; i < foundDevices.getCount(); i++) { BLEAdvertisedDevice device = foundDevices.getDevice(i); int rssi = device.getRSSI(); Serial.print("RSSI: "); Serial.println(rssi); if (rssi > RSSI_THRESHOLD && device_found == true) digitalWrite(LED_BUILTIN, HIGH); else digitalWrite(LED_BUILTIN, LOW); } pBLEScan->clearResults(); // delete results fromBLEScan buffer to release memory }</span> |
- پس از آپلود کد و باز کردن سریال مانیتور در نرم افزار Arduino IDE، نتیجه به شکل زیر خواهد بود.
وسایل مورد نیاز
برد ESP32 با بلوتوث و وای فای
جمع بندی
بی شک تکنولوژی BLE یکی از تاثیر گذاترین راه های ارتباطی در اینترنت اشیا می باشد که بدلیل مصرف توان بسیار محدود می تواند بسیار کاربردی و مفید برای پروژه های iot ما باشد.