- المتطلبات المسبقة
- المواد المطلوبة
- المعدات
- احصل على عنوان Bluetooth الخاص بالخادم (عنوان نطاق اللياقة)
- الحصول على UUID الخاص بالخدمة والخصائص
- برمجة ESP32 ليعمل كعميل لتطبيق Proximity Switch
- العمل والاختبار
كم هو رائع أن تشعل الأضواء تلقائيًا بمجرد دخولك إلى منزلك وإيقاف تشغيله مرة أخرى عند المغادرة! نعم ، يمكن لتطبيق بسيط القيام بذلك نيابة عنك. هنا في هذا المشروع، سوف نستخدم ESP32 كعميل بليه و الفرقة اللياقة البدنية كخادم بليه ، لذلك عندما يأتي شخص يرتدي الفرقة اللياقة البدنية في نطاق ESP32 بلوتوث، وESP32 يكتشف أنه وتشغيل الضوء. يمكن استخدام أي أجهزة Bluetooth ذات إمكانات خادم BLE كجهاز مشغل للتحكم في أي جهاز منزلي باستخدام ESP32.
لقد اكتشفنا بالفعل وظائف BLE (Bluetooth Low Energy) لوحدة ESP32 وأنا سعيد جدًا بها. لإعطاء خلاصة ، تحتوي هذه الوحدة على كل من Bluetooth الكلاسيكية و Bluetooth Low Energy (BLE) ، ويمكن استخدام Bluetooth الكلاسيكي لنقل الأغاني أو الملفات ويمكن استخدام خيار BLE للتطبيقات المحسّنة للبطارية مثل إشارات Bluetooth ، ونطاقات اللياقة البدنية ، والقرب ، إلخ. من الممكن أيضًا استخدامه كبلوتوث تسلسلي مثل وحدات HC-05 أو HC-06 لمشاريع وحدة التحكم الدقيقة البسيطة.
كما تعلم ، يمكن لـ ESP32 BLE العمل في وضعين مختلفين. أحدهما هو وضع الخادم الذي ناقشناه بالفعل من خلال الاستفادة من خدمة الجات لتقليد خدمة مؤشر مستوى البطارية. في هذا التمرين ، عمل ESP32 كخادم وعمل هاتفنا المحمول كعميل. الآن ، دعونا نشغل ESP32 كعميل ونحاول توصيله بخوادم BLE الأخرى مثل فرقة اللياقة الخاصة بي.
جميع خوادم BLE بما في ذلك سوار اللياقة الخاص بي في وضع إعلان ثابت بحيث يمكن اكتشافها دائمًا عند فحصها بواسطة العميل. من خلال الاستفادة من هذه الميزة ، يمكننا استخدام نطاقات اللياقة هذه كمفتاح تقارب ، مما يعني أن أحزمة اللياقة هذه مرتبطة دائمًا بيد المستخدم ومن خلال المسح بحثًا عن النطاق يمكننا اكتشاف ما إذا كان الشخص ضمن النطاق. هذا هو بالضبط ما سنفعله في هذه المقالة. وسوف برمجة ESP32 للعمل كعميل بليه وتعمل باستمرار على الاحتفاظ مسح لأجهزة BLE. إذا وجدنا شريط اللياقة في النطاق ، فسنحاول الاتصال به وإذا كان الاتصال ناجحًا ، فيمكننا تشغيل مصباح كهربائي عن طريق تبديل أحد دبابيس GPIO على ESP32. الطريقة موثوقة لأن كل خادم BLE(نطاق اللياقة) سيكون له معرّف فريد للأجهزة ، لذا لن يتطابق جهازي خادم BLE. ممتع أليس كذلك؟ !!! الآن ، دعنا نبني
المتطلبات المسبقة
في هذه المقالة ، أفترض أنك على دراية بالفعل بكيفية استخدام لوحة ESP32 مع Arduino IDE ، إذا لم ترجع إلى البدء في البرنامج التعليمي ESP32.
لقد قمنا بتقسيم ESP32 Bluetooth الكامل إلى ثلاثة أقسام لسهولة الفهم. لذلك يوصى بالاطلاع على أول دورتين تعليميتين قبل البدء بهذا.
- تسلسلي Bluetooth على ESP32 تبديل LED من الهاتف المحمول
- خادم BLE لإرسال بيانات مستوى البطارية إلى الهاتف المحمول باستخدام خدمة GATT
- عميل BLE للبحث عن أجهزة BLE والعمل كمنارة.
لقد قمنا بالفعل بتغطية أول دورتين تعليميتين ، وهنا ننتقل إلى آخر درس لشرح ESP32 كعميل BLE.
المواد المطلوبة
- مجلس التنمية ESP32
- تحميل التيار المتردد (المصباح)
- وحدة الترحيل
المعدات
الأجهزة الخاصة بمشروع ESP32 BLE Client هذا واضحة جدًا لأن معظم السحر يحدث داخل الكود. يجب على ESP32 تبديل مصباح التيار المتردد (تحميل) عند اكتشاف إشارة Bluetooth أو فقدها. لتبديل هذا الحمل ، سنستخدم Relay ، وبما أن دبابيس GPIO في ESP32 متوافقة فقط مع 3.3 فولت ، فإننا نحتاج إلى وحدة ترحيل يمكن تشغيلها بجهد 3.3 فولت. فقط تحقق من الترانزستور المستخدم في وحدة الترحيل إذا كان BC548 ، فأنت على ما يرام ، وإلا قم ببناء دائرتك الخاصة باتباع مخطط الدائرة أدناه.
تحذير: تتعامل الدائرة مع جهد التيار المتردد المباشر 220 فولت. كن حذرًا مع الأسلاك الحية وتأكد من عدم إنشاء دائرة كهربائية قصيرة. لقد تم تحذيرك.
السبب وراء استخدام BC548 على BC547 أو 2N2222 هو أن لديهم جهدًا منخفضًا للباعث الأساسي يمكن تشغيله بجهد 3.3 فولت فقط. و تتابع المستخدمة هنا هي تتابع 5V ، ولذا فإننا السلطة مع دبوس فين الذي يحصل 5V تشكيل كابل الطاقة. الدبوس الأرضي متصل بأرض الدائرة. يستخدم المقاوم R1 1K كمقاوم محدد للتيار الأساسي. يتم توصيل سلك الطور بدبوس NO الخاص بالمرحل ويتم توصيل الدبوس المشترك الخاص بالمرحل بالحمل ويتم توصيل الطرف الآخر للحمل بالمحايد. يمكنك تبديل موضع المرحلة والمحايدة ولكن احرص على عدم قصرهما مباشرة. يجب أن يمر التيار دائمًا عبر الحمل (المصباح).لقد استخدمت وحدة الترحيل لإبقاء الأمور بسيطة والحمل هنا هو مصباح التركيز LED. يبدو إعدادي مثل هذا أدناه
إذا كنت ترغب في تخطي الجهاز في الوقت الحالي ، يمكنك استخدام دبوس GPIO 2 بدلاً من دبوس GPIO 13 لتبديل مؤشر LED الموجود على اللوحة ESP32. هذه الطريقة موصى بها للمبتدئين.
احصل على عنوان Bluetooth الخاص بالخادم (عنوان نطاق اللياقة)
كما قيل سابقًا ، سنقوم ببرمجة ESP32 ليعمل كعميل (على غرار الهاتف) والاتصال بخادم هو فرقة اللياقة الخاصة بي (Lenovo HW-01). لكي يتصل العميل بالخادم ، يجب أن يعرف عنوان البلوتوث الخاص بالخادم. كل خادم Bluetooth مثل سوار اللياقة الخاص بي هنا ، له عنوان Bluetooth الفريد الخاص به والذي يكون دائمًا. يمكنك ربط هذا بعنوان MAC الخاص بجهاز الكمبيوتر المحمول أو الهاتف المحمول.
للحصول على هذا العنوان من الخادم ، نستخدم تطبيقًا يسمى nRF connect من أشباه الموصلات الاسكندنافية التي استخدمناها بالفعل في برنامجنا التعليمي السابق. إنه متاح مجانًا لمستخدمي IOS و Android. ما عليك سوى تنزيل التطبيق وتشغيله والبحث عن أجهزة Bluetooth القريبة. سيقوم التطبيق بسرد جميع أجهزة BLE التي يعثر عليها. تم تسمية Mine باسم HW-01 ، ما عليك سوى إلقاء نظرة أسفل اسمه وستجد عنوان جهاز الخادم كما هو موضح أدناه.
لذا فإن عنوان جهاز ESP32 BLE الخاص بشريط اللياقة الخاص بي هو C7: F0: 69: F0: 68: 81 ، سيكون لديك مجموعة مختلفة من الأرقام بنفس التنسيق. فقط قم بتدوين ذلك لأننا سنحتاج عندما نقوم ببرمجة ESP32.
الحصول على UUID الخاص بالخدمة والخصائص
حسنًا ، لقد حددنا الآن خادمنا باستخدام عنوان BLE ولكن للتواصل معه نحتاج إلى التحدث بلغة الخدمة وخصائصها ، والتي ستفهمها إذا كنت قد قرأت البرنامج التعليمي السابق. في هذا البرنامج التعليمي ، أستخدم خاصية الكتابة لخادمي (فرقة اللياقة) للاقتران بها. لذلك ، من أجل الاقتران بالجهاز ، نحتاج إلى UUID المميز لإعلان الخدمة والذي يمكننا الحصول عليه مرة أخرى باستخدام نفس التطبيق.
فقط اضغط على زر الاتصال في التطبيق الخاص بك وابحث عن بعض خصائص الكتابة ، حيث سيعرض التطبيق UUID للخدمة و UUID المميز. المنجم مبين أدناه
هنا UUID للخدمة و UUID المميز الخاص بي هو نفسه ، لكن لا يجب أن يكون هو نفسه. لاحظ أسفل UUID الخاص بخادمك. تم تدوين المنجم باسم
خدمة UUID: 0000fee7-0000-1000-8000-00805f9b34fb المميزة UUID: 0000fee7-0000-1000-8000-00805f9b34fb
ليس من الضروري استخدام خصائص الكتابة ؛ يمكنك استخدام أي خدمة صالحة و UUID المميز للخادم الذي يظهر في التطبيق.
برمجة ESP32 ليعمل كعميل لتطبيق Proximity Switch
تتمثل فكرة البرنامج في جعل ESP32 يعمل كعميل يستمر في البحث عن أجهزة Bluetooth عندما يجد خادمنا (نطاق اللياقة) يتحقق من معرف الجهاز وسوف يقوم بتبديل الضوء من خلال دبوس GPIO 13. حسنًا! ! ولكن هناك مشكلة واحدة في ذلك. سيكون نطاق جميع خوادم BLE 10 أمتار وهو عدد كبير جدًا. لذلك إذا كنا نحاول جعل مفتاح القرب لتشغيل ضوء فتح الباب ، فهذا النطاق مرتفع جدًا.
لتقليل نطاق خادم BLE ، يمكننا استخدام خيار الاقتران. سيظل خادم BLE والعميل متزاوجين فقط إذا كان كلاهما ضمن مسافة 3-4 أمتار. هذا مثالي لتطبيقنا. لذلك ، نجعل ESP32 ليس فقط لاكتشاف خادم BLE ولكن أيضًا للاتصال به والتأكد من أنه لا يزال مقترنًا. طالما تم إقرانهما ، سيظل مصباح التيار المتردد قيد التشغيل ، وعندما يتجاوز النطاق الاقتران ، سيتم فقده وسيتم إيقاف تشغيل المصباح. ويرد مثال برنامج ESP32 BLE الكامل للقيام بنفس الشيء في نهاية هذه الصفحة. أدناه هنا ، سأقسم الكود إلى مقتطفات صغيرة وأحاول شرحها.
بعد تضمين ملف الرأس ، نقوم بإبلاغ ESP32 عن عنوان BLE والخدمة والمعرف الفريد المميز الذي حصلنا عليه من خلال تطبيق nRF connect كما هو موضح في العناوين أعلاه. يبدو الرمز أدناه
ثابت BLEUUID serviceUUID ("0000fee7-0000-1000-8000-00805f9b34fb")؛ // معرف الخدمة UUID الخاص بشبكة اللياقة البدنية التي تم الحصول عليها من خلال تطبيق اتصال nRF الثابت BLEUID charUUID ("0000fee7-0000-1000-8000-00805f9b34fb") ؛ // UUID المميز لنطاق اللياقة الذي تم الحصول عليه من خلال تطبيق الاتصال nRF String My_BLE_Address = "c7: f0: 69: f0: 68: 81" ؛ // الأجهزة التي تعمل بتقنية Bluetooth MAC في نطاق اللياقة البدنية الخاص بي ، ستختلف لكل نطاق يتم الحصول عليه من خلال تطبيق اتصال nRF
يتبع ذلك في البرنامج ، لدينا connectToserver و MyAdvertisedDeviceCallback الذي سنعود إليه لاحقًا. ثم داخل وظيفة الإعداد ، نقوم بتهيئة الشاشة التسلسلية ونجعل BLE على ESP للبحث عن الجهاز. بعد اكتمال الفحص لكل جهاز BLE اكتشف الوظيفة MyAdvertisedDeviceCallbacks .
نقوم أيضًا بتمكين الفحص النشط نظرًا لأننا نقوم بتشغيل ESP32 بالطاقة الرئيسية ، بالنسبة لتطبيق البطارية ، يتم إيقاف تشغيله لتقليل الاستهلاك الحالي. يتم توصيل دبوس مشغل الترحيل بـ GPIO 13 في أجهزتنا ، لذلك نعلن أيضًا أن دبوس GPIO 13 كإخراج.
إعداد باطل () { Serial.begin (115200) ؛ // بدء تشغيل جهاز العرض التسلسلي Serial.println ("برنامج خادم ESP32 BLE") ؛ // رسالة مقدمة BLEDevice:: init ("")؛ pBLEScan = BLEDevice:: getScan () ، // إنشاء مسح جديد pBLEScan-> setAdvertisedDeviceCallbacks (جديد MyAdvertisedDeviceCallbacks ()) ؛ // استدعاء الفئة التي تم تعريفها أعلاه pBLEScan-> setActiveScan (true) ؛ // يستخدم الفحص النشط مزيدًا من الطاقة ، ولكن الحصول على نتائج أسرع pinMode (13 ، الإخراج) ؛ // قم بتعريف دبوس LED المدمج كإخراج }
داخل وظيفة MyAdvertisedDeviceCallbacks ، نقوم بطباعة سطر يسرد الاسم والمعلومات الأخرى لأجهزة BLE التي تم اكتشافها. نحتاج إلى معرف الجهاز الخاص بجهاز BLE الذي تم اكتشافه حتى نتمكن من مقارنته بالجهاز المطلوب. لذلك نستخدم المتغير Server_BLE_Address للحصول على عنوان الجهاز ثم أيضًا لتحويله من نوع BLEAddress إلى سلسلة.
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { void onResult (BLEAdvertisedDevice advertisedDevice) { Serial.printf ("نتيجة المسح:٪ s \ n"، advertisedDevice.toString (). c_str ())؛ Server_BLE_Address = new BLEAddress (advertisedDevice.getAddress ()) ؛ Scaned_BLE_Address = Server_BLE_Address-> toString (). c_str () ؛ } }؛
داخل وظيفة الحلقة ، نقوم بالمسح لمدة 3 ثوانٍ ونضع النتيجة داخل foundDevices وهو كائن من BLEScanResults. إذا وجدنا جهازًا واحدًا أو أكثر عن طريق المسح ، نبدأ في التحقق مما إذا كان عنوان BLE المكتشف يتطابق مع العنوان الذي أدخلناه في البرنامج. إذا كانت المطابقة إيجابية ولم يتم إقران الجهاز في وقت سابق ، نحاول الاقتران به باستخدام وظيفة connectToserver. لقد استخدمنا أيضًا بعض العبارات التسلسلية لفهم الغرض.
while (foundDevices.getCount ()> = 1) { if (Scaned_BLE_Address == My_BLE_Address && paired == false) { Serial.println ("العثور على الجهاز: -)… الاتصال بالخادم كعميل") ؛ إذا (connectToserver (* Server_BLE_Address)) {
داخل وظيفة connectToserver ، نستخدم UUID للاقتران مع خادم BLE (نطاق اللياقة). للاتصال بخادم ، يجب أن يعمل ESP32 كعميل ، لذلك نقوم بإنشاء عميل باستخدام وظيفة createClient () ثم الاتصال بعنوان خادم BLE. ثم نبحث عن الخدمة والمميزات باستخدام قيم UUID ونحاول الاتصال بها. عندما يكون الاتصال ناجحًا ، تقوم الوظيفة بإرجاع صواب وإذا لم يكن الأمر كذلك فإنها ترجع خطأ. لاحظ أنه ليس إلزاميًا أن يكون لديك UUID خاص بالخدمة وخاصية الاقتران مع الخادم ، فهو يتم فقط لفهمك.
bool connectToserver (BLEAddress pAddress) { BLEClient * pClient = BLEDevice:: createClient () ؛ Serial.println ("- عميل تم إنشاؤه") ؛ // الاتصال بخادم BLE. pClient-> connect (pAddress) ؛ Serial.println ("- متصل بشريط اللياقة") ؛ // احصل على إشارة إلى الخدمة التي نسعى وراءها في خادم BLE البعيد. BLERemoteService * pRemoteService = pClient-> getService (serviceUUID) ؛ if (pRemoteService! = nullptr) { Serial.println ("- Found our service") ؛ العودة صحيح } آخر إرجاع خطأ؛ // احصل على مرجع للخاصية في خدمة خادم BLE البعيد. pRemoteCharacteristic = pRemoteService->getCharacteristic (charUUID) ؛ إذا (pRemoteCharacteristic! = nullptr) Serial.println ("- وجدت خاصيتنا") ؛ العودة صحيح }
إذا كان الاتصال ناجحًا ، فإن GPIO pin 13 يكون مرتفعًا ويتم إرسال عنصر التحكم خارج الحلقة باستخدام تعليمة break. تم أيضًا تعيين المتغير المنطقي المقترن ليكون صحيحًا.
إذا (connectToserver (* Server_BLE_Address)) { paired = true ؛ Serial.println ("******************** تم تشغيل LED ********************** ** ") ؛ digitalWrite (13 ، عالية) ؛ استراحة؛ }
بعد نجاح الاقتران وتشغيل دبوس GPIO ، يتعين علينا التحقق مما إذا كان الجهاز لا يزال في النطاق. نظرًا لأنه تم إقران الجهاز الآن ، فلن تتمكن خدمة فحص BLE من رؤيته بعد الآن. سنجدها مرة أخرى فقط عندما يغادر المستخدم المنطقة. لذلك علينا ببساطة البحث عن خادم BLE للخارج وإذا اكتشفنا أنه يتعين علينا ضبط دبوس GPIO على منخفض كما هو موضح أدناه
إذا (Scaned_BLE_Address == My_BLE_Address && paired == true) { Serial. println ("خرج أجهزتنا عن النطاق") ؛ زوج = خطأ ؛ مسلسل. println ("********************** LED OOOFFFFF **************************") ؛ digitalWrite (13 ، منخفض) ؛ ESP.restart () ، استراحة؛ }
العمل والاختبار
بمجرد أن تصبح جاهزًا مع البرنامج وإعداد الأجهزة ، ما عليك سوى تحميل الكود إلى ESP32 وترتيب الإعداد بالكامل كما هو موضح أدناه.
يجب أن تلاحظ تشغيل المصباح بمجرد أن يتزاوج حزام اللياقة (الخادم) مع ESP32. يمكنك أيضًا التحقق من ذلك من خلال ملاحظة رمز اتصال Bluetooth على سوار اللياقة البدنية. بمجرد الاقتران ، حاول الابتعاد عن ESP32 وعندما تعبر 3-4 أمتار ستلاحظ اختفاء رمز Bluetooth الموجود على الساعة وفقد الاتصال. الآن ، إذا نظرت إلى المصباح فسيتم إطفاءه. عندما تعود إلى الجهاز ، يتم إقرانه مرة أخرى ويتم تشغيل الضوء. يمكن العثور على العمل الكامل للمشروع في الفيديو أدناه.
آمل أن تكون قد استمتعت بالمشروع وتعلمت شيئًا جديدًا في الطريق. إذا واجهت أي مشكلة في تشغيلها ، فلا تتردد في نشر المشكلة على المنتديات أو حتى في قسم التعليقات أدناه