سلام بر همه همراهان اسمارت کامپ! امیدواریم حاله همگی عالی باشه. در این مقاله قصد داریم به طور تخصص به بررسی ماژول بلوتوث ESP32 بپردازیم. وقتی صحبت از به اشتراک گذاری داده ها در فواصل کوتاه با استفاده از امواج رادیویی با فرکانس فوق العاده بالا می شود، بلوتوث یکی از مطمئن ترین و موثرترین راه حل های ارتباط بی سیم برد کوتاه است. از آنجایی که فناوری بلوتوث در ابتدا به عنوان فناوری جایگزین کردن کابل در نظر گرفته شد، پیاده سازی آن در دستگاه های یکپارچه اجتناب ناپذیر شد. در حالی که میکروکنترلرهای محبوبی مانند ESP32، Raspberry Pi و Arduino Mega همگی به طور پیشفرض به ماژولهای بلوتوث مجهز هستند، سایرین را میتوان با افزودن ماژولهایی مانند HC 05 یا JDY-30 آماده به کار با بلوتوث کرد.
برای آشنایی با برنامه نویسی میکروکنترلرهای AVR به دو لینک زیر مراجعه کنید:
بلوتوث کم انرژی (BLE)
Raspberry Pi و ESP32 تنها میکروکنترلرهایی هستند که با ماژولهای فناوری کمانرژی بلوتوث عرضه میشوند. در حالی که بلوتوث سنتی برای انتقال داده در فواصل طولانی و پهنای باند وسیع بهینه شده است، BLE برای استفاده در برد کوتاه و کم مصرف بهینه شده است. به عنوان یک نتیجه از راندمان برتر آن در صرفه جویی در انرژی، انرژی کمتری را نسبت به بلوتوث سنتی با ضریب بیش از صد تنها با افت عملکرد ناچیز مصرف می کند. برخلاف بلوتوث سنتی که حتی در صورت عدم استفاده روشن میماند، BLE هر زمان که فعالانه در اتصال یا انتقال داده دخالت نداشته باشد، به حالت خواب میرود.
می تواند به یکی از چهار روش زیر عمل کند:
یک دستگاه جانبی داده ها را منتشر می کند و ارتباط با ابزارهای دیگر را تسهیل می کند.
پخش کننده ابزاری باشد که به صراحت برای انتشار اطلاعات طراحی شده است.
Observer - سخت افزار نظارت کننده داده باشد
دستگاه مرکزی یک هدف دوگانه داشته باشد: دستگاههای دیگر را اسکن کرده و به آنها متصل شود.
قبل از حضور BLE در صنعت، دو حالت اول توسط آشکارسازها و سایر ماشینهای صنعتی استفاده میشد، در حالی که رایانههای شخصی و تلفنهای همراه از دو حالت آخر استفاده میکردند. با این حال، بیشتر BLE اکنون به لطف پیشرفت های تکنولوژیکی از هر چهار روش انتقال پشتیبانی می کند. این روش های انتقال در ESP32 و Raspberry Pi در دسترس هستند. در جدول زیر می توانید تمایز گسترده بین سنتی و BLE را مشاهده کنید.
ESP32 چیست؟
ESP32 یک میکروکنترلر جدید سیستم بر روی یک تراشه System-on-a-Chip (SoC) است که شرکت توسط Espressif Systems توسعه یافته است، شرکتی که مسئول توسعه سیستم پرکاربرد ESP8266 SoC است. برای کسانی که به دنبال جایگزین 32 بیتی برای ESP8266 SoC هستند، Tensilica شما را با ریزپردازنده Xtensa LX6 خود که در انتخاب های تک هستهای و دو هستهای عرضه میشود و دارای WiFi و بلوتوث داخلی است، ارائه میکند.
یک تقویت کننده قدرت، یک تقویت کننده دریافت کم نویز، یک سوئیچ انتخاب آنتن، فیلترها و یک بالون برای تنظیم شدت سیگنال، همگی در ESP32 گنجانده شده اند، که البته این موارد در ESP8266 نیز وجود دارد. از آنجایی که ESP32 به اجزای خارجی بسیار کمی نیاز دارد، توسعه سخت افزار ساده شده است.
ESP32 با تکنولوژی 40 نانومتری کم مصرف TSMC تولید می شود که یکی دیگر از ویژگی های ضروری است که باید در نظر داشت. در نتیجه، استفاده از ESP32 برای توسعه برنامههای کاربردی با باتری مانند ساعتهای هوشمند، ردیابهای تناسب اندام، مانیتورهای کودک و سایر دستگاههای مشابه بسیار راحت است.
چندین روش کدگذاری ESP32
اگر سختافزار باکیفیت مانند ESP32 را بتوان به روشهای مختلف برنامهنویسی (کدگذاری) کرد، برای مخاطبان وسیعتری قابل دسترسی خواهد بود. همانطور که انتظار می رود، ESP32 با محیط های مختلف توسعه سازگار است.
اینها تنها چند نمونه از IDE های پرکاربرد (محیط های توسعه یکپارچه) هستند:
آردوینو IDE
PlatformIO IDE (در مقابل کد)
LUA
میکروپایتون
Espressif IDF (چارچوب توسعه اینترنت اشیا)
جاوا اسکریپت
به دلیل سادگی، از Arduino IDE برای کدنویسی ESP32 در پروژه های آینده استفاده خواهیم کرد.
چیدمان esp32
با استفاده از برد ESP32 DevKit به عنوان نمونه، میتوانیم طراحی با آن را بررسی کنیم تا در مورد اجزایی که معمولاً یک برد توسعه ESP32 را تشکیل میدهند، بیاموزیم.
در تصویر ضمیمه، میتوانید نحوه چیدمان برد توسعه ESP32 را مشاهده کنید.
توجه: در بازار ماژول های مختلفی از ESP32 است که از ماژول ESP-WROOM-32 استفاده می کنند. ماژول های مختلف دارای طرحها، پایهها و مجموعهای از ویژگیها هستند.
تعداد پین ها روی بردی که در اینجا به عنوان نمونه آورده شده است 30 تا است. برخی از بردها 36 پایه ای هستند، در حالی که برخی دیگر تعداد پایه کمتری دارند. بنابراین، قبل از هر گونه اتصال برد، باید بررسی کنید که چه تعداد پین مورد نیاز است و پین ها در موقعیت های صحیح قرار بگیرند
در تصویر بالا اجزای تشکیل دهنده برد ESP32 نشان داده شده است:
ماژول ESP-WROOM-32
دو ردیف پین IO (با 15 پین در هر طرف)
CP2012 USB – UART Bridge IC
رابط Micro-USB (برای تغذیه و برنامه نویسی)
آی سی رگولاتور 3.3 ولت AMS1117
دکمه فعال کردن (برای تنظیم مجدد)
دکمه بوت (برای چشمک زدن)
LED پاور (قرمز)
LED کاربر (آبی – متصل به GPIO2)
برخی از اجزای غیرفعال
پایه های DTR و RTS روی آیسی USB-to-UART برای قرار دادن خودکار ESP32 در حالت برنامهنویسی (در صورت لزوم) و برای خواباندن برد پس از برنامهنویسی مورد استفاده قرار میگیرند.
پایه های برد ESP32
بردهای ESP با 30 پین با پایه بندی تصویر بالا پشتیبانی می شوند. هر دو نوع 30 پایه و 36 پایه ای برد ESP در این آموزش پوشش داده خواهند شد.
اکنون که آشنایی مقدماتی با ESP32 پیدا کردید، وقت آن است که ببینید چگونه می توان از آن استفاده کرد.
اگرچه ESP32 یک گزینه مناسب برای بسیاری از مصارف است، اما برای برخی از کاربردها تخصصی تر و مناسب تر است. در این فصل، معیارهایی را که باید برای تصمیم گیری در مورد استفاده یا عدم استفاده از ESP32 در یک کاربرد خاص استفاده کنید، توضیح خواهیم داد. اگر فقط نیاز به اتصال چند دستگاه دارید ESP32 آنچه شما نیاز دارید را دارد و می توانید بدون تردید از آن استفاده کنید.
پشتیبانی داخلی ESP32 از شبکه های بی سیم یک نقطه قوت محسوب می شود. بنابراین، ESP32 یک میکروکنترلر ایدهآل برای یک کاربردهایی است که در آن اتصال WiFi قابل اعتماد دیگر یک دغدغه اصلی نیست، مانند یک سیستم نظارت بر محیط زیست مبتنی بر آزمایشگاه. شما نیازی به خرید یک ماژول شبکه جداگانه نخواهید داشت زیرا پشته WiFi دقیقاً در ماژول تعبیه شده است. اگر قصد دارید از ESP32 در یک برنامه ردیابی تلفن همراه استفاده کنید، به یک ماژول GSMیا LTE برای حفظ اتصال ثابت به سرور نیاز دارید. در نتیجه، ESP32 مزیت هزینه خود را از دست میدهد و ممکن است انتخاب شما یک میکروکنترلر ارزانتر که همچنان میتواند اهداف شما را محقق کند، باشد.
علاوه بر این، شتاب دهنده رمزگذاری سخت افزاری داخلی ESP32، آن را به انتخابی عالی برای هر پروژه ای که نیاز به برقراری ارتباط ایمن (HTTPS) دارد تبدیل می کند. بنابراین، اگر نیاز به محافظت از داده های حساس در برابر رهگیری دارید، استفاده از یک میکروکنترلر ESP32 نسبت به سایر ماژول ها که این ویژگی را ندارند ترجیح داده می شود. صنعت نظامی یکی از موارد استفاده ممکن برای اینترنت اشیا صنعتی است.
ESP32 با توجه به معماری دو هسته ای خود، یک انتخاب عالی برای برنامه های کاربردی داده فشرده است یعنی کاربردهایی که نیاز به پردازش و انتقال داده دارند تا روی هسته های جداگانه اتفاق بیفتد، همانطور که در مورد دریافت اطلاعات با باود ریت بالا صدق می کند. اینترنت اشیاء صنعتی نمونه ای از چنین پیاده سازی است.
GPIO و تجهیزات جانبی موجود یکی دیگر از مواردی است که باید مورد توجه قرار گیرد. سه کانال گیرنده/فرستنده ناهمزمان یونیورسال (UART) در ESP32 وجود دارد. اگر برنامه شما به بیش از سه کانال UART نیاز دارد، ممکن است لازم باشد میکروکنترلر دیگری را انتخاب کنید. به طور مشابه، ESPهایی با 34 پایه GPIOقابل برنامه ریزی برای بیشتر کاربردها بسیار مناسب هستند. با این حال، اگر برای برنامه شما به پین های ورودی/خروجی عمومی (GPIO) بیشتری نیاز است، ممکن است لازم باشد به میکروکنترلر دیگری مراجعه کنید.
با 1.5 مگابایت SPIFFS به طور پیش فرض، ESP32 فضای ذخیره سازی داخلی عالی تری نسبت به میکروکنترلرهای رقیب ارائه می دهد. ESP32 نیاز به فلش تراشه یا کارت SD اضافی را در صورتی که نیازهای ذخیره سازی داده شما کمتر از 1.5 مگابایت باشد، برطرف می کند. به عنوان یک امتیاز، ESP32 خودش به تنهایی مدیریت سطح بندی در SPIFFSرا به عهده دارد. با این وجود، اگر نیازهای ذخیره سازی داده شما را برآورده نکند، مزیت رقابتی ESP32 یک بار دیگر باطل می شود.
رم 520 کیلوبایتی در ESP32 نیز فضای کافی برای اکثر استفاده ها را ایجاد می کند. این تنها به یک مانع برای کارهای پرمصرف منابع مانند پردازش تصویر/فیلم تبدیل می شود.
اتصال بین دو ESP32
با استفاده از عملکرد داخلی بلوتوث کم انرژی (BLE) ESP32، دو میکروکنترلر ممکن است یک اتصال بی سیم بسیار کارآمد ایجاد کنند. با اتصال بلوتوث بین دو برد، یکی نقش سرور و دیگری نقش کلاینت را بر عهده می گیرد. برای این پروژه، یک ESP32 به عنوان سرور عمل می کند، داده ها را پخش می کند و اتصال را برقرار می کند، در حالی که ESP32 دیگر وظیفه کلاینت را بر عهده می گیرد و داده های پخش شده توسط سرور را دریافت می کند. از طریق اتصال BLE، ما رشته ها را بین دو esp32 رد و بدل خواهیم کرد.
ESP32 به عنوان یک سرور
اولین ESP32 ما به عنوان میزبان بلوتوث عمل خواهد کرد. به کلاینت، لینک و اطلاعات را ارائه می دهد. در زیر سورس کد آن آورده شده است:
"include "bleutils.h#
"include "bleserver.h#
define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b#define CHARACTERISTIC_UUID beb5483e-36e1-4688-b7f5-ea07361b26a8
void setup() {
Serial.begin(115200);
Serial.println("Starting BLE work!");
BLEDevice::init("ESP32 AS A BLE");
BLEServer *pServer = BLEDevice::createServer();
BLEService *pService = pServer->createService(SERVICE_UUID);
BLECharacteristic *pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE
);
pCharacteristic->setValue("Hi,other ESP32 here is your data");
pService->start();
// BLEAdvertising *pAdvertising = pServer->getAdvertising(); // this still is working for backward compatibility
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pAdvertising->setScanResponse(true);
pAdvertising->setMinPreferred(0x06);
pAdvertising->setMinPreferred(0x12);
BLEDevice::startAdvertising();
Serial.println("Characteristic defined!");
{
}()void loop
// put your main code here to run repeatedly:
delay(2000);
{
اشیای کد مانند ویژگی ها، اشیای BLE و اشیای تبلیغاتی همگی با استفاده از کلاس BLE ایجاد می شوند. با یک UUID مشخصه و یک UUID سرویس شروع می شود. شناسه منحصر به فرد جهانی (UUID) رشته ای از بایت است که می تواند ویژگی ها و قابلیت های یک دستگاه بلوتوث را مشخص کند. ابتدا سه شی از کلاس های BLEserver، مشخصه BLE و BLEService را با داده های لازم مقداردهی اولیه کردیم. سپس، پس از راهاندازی UUID، ویژگیها و خدمات سرور بلوتوث، آن را با استفاده از عملکرد تبلیغات شروع کلاس دستگاه BLE شروع کردیم. هر گونه اطلاعات، از خوانش حسگر گرفته تا معیارهای تجاری، می تواند از قبل تنظیم شده و تبلیغ شود. پس از فعال شدن این سرور، می توان از nRF Connect برای دسترسی به آن از هر دستگاه تلفن همراه استفاده کرد.
اسکنر را راه اندازی کنید و آن را به دستگاه بلوتوث خود پیوند دهید.
هنگامی که با ESP32 خود ارتباط برقرار کردید، ویژگی را بررسی کنید و متن خود را مشاهده کنید.
ESP32 به عنوان کلاینت
دومین esp32 به عنوان یک کلاینت عمل می کند و اطلاعاتی را از دستگاه میزبان درخواست می کند. تنها اطلاعات مورد نیاز برای برقراری ارتباط با سرور esp32 و استفاده از خدمات داده شده آن، UUID های آن سرویس ها و ویژگی هایی است که آنها شناسایی می کنند.
برنامه آن به شرح زیر است:
#include "BLEDevice.h"
//#include "BLEScan.h"
// The remote service we wish to connect to.
static BLEUUID serviceUUID("4fafc201-1fb5-459e-8fcc-c5c9c331914b");
// The Characteristic of the remote service we are interested in.
static BLEUUID charUUID("beb5483e-36e1-4688-b7f5-ea07361b26a8");
static boolean doConnect = false;
static boolean connected = false;
static boolean doScan = false;
static BLERemoteCharacteristic* pRemoteCharacteristic;
static BLEAdvertisedDevice* myDevice;
static void notifyCallback(
BLERemoteCharacteristic* pBLERemoteCharacteristic,
uint8_t* pData,
size_t length,
bool isNotify) {
Serial.print("Notify callback for characteristic ");
Serial.print(pBLERemoteCharacteristic->getUUID().toString().c_str());
Serial.print(" of data length ");
Serial.println(length);
Serial.print("data: ");
Serial.println((char*)pData);
}
class MyClientCallback : public BLEClientCallbacks {
void onConnect(BLEClient* pclient) {
}
void onDisconnect(BLEClient* pclient) {
connected = false;
Serial.println("onDisconnect");
}
};
bool connectToServer() {
Serial.print("Forming a connection to ");
Serial.println(myDevice->getAddress().toString().c_str());
BLEClient* pClient = BLEDevice::createClient();
Serial.println(" - Created client");
pClient->setClientCallbacks(new MyClientCallback());
// Connect to the remove BLE Server.
pClient->connect(myDevice); // if you pass BLEAdvertisedDevice instead of address, it will be recognized type of peer device address (public or private)
Serial.println(" - Connected to server");
// Obtain a reference to the service we are after in the remote BLE server.
BLERemoteService* pRemoteService = pClient->getService(serviceUUID);
if (pRemoteService == nullptr) {
Serial.print("Failed to find our service UUID: ");
Serial.println(serviceUUID.toString().c_str());
pClient->disconnect();
return false;
}
Serial.println(" - Found our service");
// Obtain a reference to the Characteristic in the service of the remote BLE server.
pRemoteCharacteristic = pRemoteService->getCharacteristic(charUUID);
if (pRemoteCharacteristic == nullptr) {
Serial.print("Failed to find our characteristic UUID: ");
Serial.println(charUUID.toString().c_str());
pClient->disconnect();
return false;
}
Serial.println(" - Found our characteristic");
// Read the value of the Characteristic.
if(pRemoteCharacteristic->canRead()) {
std::string value = pRemoteCharacteristic->readValue();
Serial.print("The characteristic value was: ");
Serial.println(value.c_str());
}
if(pRemoteCharacteristic->canNotify())
pRemoteCharacteristic->registerForNotify(notifyCallback);
connected = true;
return true;
}
/**
* Scan for BLE servers and find the first one that advertises the service we are looking for.
*/
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
/**
* Called for each advertising BLE server.
*/
void onResult(BLEAdvertisedDevice advertisedDevice) {
Serial.print("BLE Advertised Device found: ");
Serial.println(advertisedDevice.toString().c_str());
// We have found a device, let us now see if it contains the service we are looking for.
if (advertisedDevice.haveServiceUUID() && advertisedDevice.isAdvertisingService(serviceUUID)) {
BLEDevice::getScan()->stop();
myDevice = new BLEAdvertisedDevice(advertisedDevice);
doConnect = true;
doScan = true;
} // Found our server
} // onResult
}; // MyAdvertisedDeviceCallbacks
void setup() {
Serial.begin(115200);
Serial.println("Starting Arduino BLE Client application...");
BLEDevice::init("");
// Retrieve a Scanner and set the callback we want to use to be informed when we
// have detected a new device. Specify that we want active scanning and start the
// scan to run for 5 seconds.
BLEScan* pBLEScan = BLEDevice::getScan();
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan->setInterval(1349);
pBLEScan->setWindow(449);
pBLEScan->setActiveScan(true);
pBLEScan->start(5, false);
} //End of setup.
// This is the Arduino main loop function.
void loop() {
// If the flag "doConnect" is true then we have scanned for and found the desired
// BLE Server with which we wish to connect. Now we connect to it. Once we are
// connected, we set the connected flag to be true.
if (doConnect == true) {
if (connectToServer()) {
Serial.println("We are now connected to the BLE Server.");
} else {
Serial.println("We have failed to connect to the server; there is nothin more we will do.");
}
doConnect = false;
}
// If we are connected to a peer BLE Server, update the Characteristic each time we are reached
// with the current time since boot.
if (connected) {
String newValue = "Time since boot: " + String(millis()/1000);
Serial.println("Setting new characteristic value to \"" + newValue + "\"");
// Set the Characteristic's value to be the array of bytes that is a string.
pRemoteCharacteristic->writeValue(newValue.c_str(), newValue.length());
}else if(doScan){
BLEDevice::getScan()->start(0); // this is just an example of starting the scan after disconnect; most likely, there is a better way to do it in Arduino.
}
delay(1000); // Delay a second between loops.
} //End of loop
عملکرد این کد به ورودی های داده شده توسط کاربر بستگی دارد. در ابتدای کد، ما تعاریف ویژگی و سرویس UUID را ایجاد کردیم. در ابتدا، اشیاء BLERemoteCharacteristic و BLEAdvertisedDevice ایجاد می شوند و از عملکرد اتصال به سرور () برای برقراری ارتباط با سرور (سایر esp32) استفاده می شود. در پایان، داده های سرور را از طریق متغیرهای Characteristic و Service وارد می کند. این اعداد در مانیتور سریال شبیه به این هستند:
کاربردهای صنعتی
هنگامی که برق کافی برای رفت و آمد وجود ندارد، BLE مفید است. اکنون بیایید در مورد برخی از کاربردهای آن در دنیای واقعی صحبت کنیم:
روشهای کشاورزی هوشمند: میکروکنترلرهای با باتری با قابلیتهای ble، مانند ESP32یا Raspberry Pi، میتوانند برای هفتهها برای انتقال دادههای حسگرها از یک ESP32 به سایر تجهیزات برای بهینهسازی توسعه کشاورزی استفاده شوند.
کادر پزشکی درگیر: با استفاده از بلوتوث، یک میکروکنترلر میتواند دادهها را به تلفن همراه منتقل کند یا دادهها را به صورت محلی روی صفحه نمایش دهد، مانند ضربان قلب کاربر، سرعت اجرا یا هر داده دیگری که توسط سنسورها شناسایی میشود. همه این مقادیر را می توان به طور موثر و بدون نیاز به سیم ردیابی کرد.
ردیابی وضعیت زیست پزشکی: قابلیتهای BLE یک میکروکنترلر انتقال مستقیم دادهها را از مچبندهایی که علائم حیاتی مانند ضربان قلب و فشار خون را اندازهگیری میکنند به رایانه امکانپذیر میسازد.
یکی از مزایای بی شمار میکروکنترلرهای کوچک، اتوماسیون خانگی است. از مدیریت روشنایی گرفته تا قفل های اثر انگشتی درب، امکانات استفاده از دستگاه های BLE بی پایان است. چندین کاربرد جذاب دارد، از جمله:
هشدارهایی که در زمان از پیش تعیین شده خاموش می شوند تا به شما یادآوری کنند که اجاق گاز، پمپ آب، بخاری یا آبفشان را خاموش کنید.
ایمن سازی با دوربین های مدار بسته
درهای گاراژ را از راه دور با استفاده از یک دستگاه تلفن همراه کار کنید
اندازه گیری هایی که از انواع سنسورهای خانگی گرفته می شود.
نتیجه
در اینجا در مورد قطعات داخلی esp32 و نحوه استفاده از آن برای نوشتن برنامه های کاربردی آشنا شدیم. در نتیجه، ESP32 برای پشتیبانی از اکثر کاربردی پیشنهادی شما کافی است. اگر به دنبال ارتقاء ESP8266 هستید، ESP32 نسل بعدی است و از بلوتوث 4.2 و بلوتوث کم انرژی پشتیبانی می کند. این شامل هستههای CPU اضافی، وایفای سریعتر، GPIO بیشتر و این فناوریها است. ESP32 علاوه بر داشتن سنسور اثر هال و سنسور دما ، دارای پین های حسگر لمسی است که می تواند ESP32 را از خواب عمیق بیدار کند. با توجه به نیاز پروژه به تعداد پایه های زیاد GPIO ممکن است بهترین میکروکنترلرها برای تولید انبوه مناسب نباشند، در حالیکه ESP32 برای توسعه ایدهآل و نمونهسازی اولیه ایدهآل است.
دیدگاه خود را بنویسید