- Передумови
- Необхідні матеріали
- Апаратне забезпечення
- Отримайте свою Bluetooth-адресу сервера (адреса фітнес-групи)
- Отримання сервісу та характеристичного UUID сервера
- Програмування ESP32 на роль клієнта для програми Proximity Switch
- Робота та тестування
Як круто бути автоматично вмикати світло, як тільки ви увійдете додому, і вимикати його знову, коли виходите! Так, простий додаток може це зробити за вас. У цьому проекті ми будемо використовувати ESP32 як клієнта BLE, а фітнес-діапазон як BLE-сервер, тож, коли людина, яка носить фітнес-ремінець, потрапляє в діапазон ESP32 Bluetooth, ESP32 виявляє це і вмикає світло. Будь-які пристрої Bluetooth, які мають можливості сервера BLE, можуть бути використані як пристрій запуску для управління будь-яким побутовим приладом за допомогою ESP32.
Ми вже досліджували функції BLE (Bluetooth Low Energy) модуля ESP32, і я дуже в захваті від цього. Щоб підбити підсумок, цей модуль має як класичний Bluetooth, так і Bluetooth з низьким енергоспоживанням (BLE), класичний Bluetooth можна використовувати для передачі пісень або файлів, а опцію BLE можна використовувати для додатків, оптимізованих для батареї, таких як маяки Bluetooth, фітнес-смуги, близькість тощо. Також можна використовувати його як послідовний Bluetooth, як модулі HC-05 або HC-06, для простих проектів мікроконтролера.
Як відомо, ESP32 BLE може працювати в двох різних режимах. Один - це режим сервера, який ми вже обговорювали, використовуючи послугу GATT для імітації служби індикатора рівня заряду акумулятора. У цій вправі ESP32 діяв як сервер, а наш мобільний телефон - як клієнт. Тепер давайте будемо експлуатувати ESP32 як клієнт і спробувати підключити його до інших серверів BLE, таких як мій фітнес-діапазон.
Усі сервери BLE, включаючи мій фітнес-діапазон, перебувають у постійному режимі реклами, тобто їх завжди можна виявити при скануванні клієнтом. Використовуючи цю функцію, ми можемо використовувати ці фітнес-стрічки як перемикач наближення, тобто ці фітнес-стрічки завжди прив’язані до руки користувача, і скануючи смугу, ми можемо виявити, чи знаходиться людина в межах зони досяжності. Це саме те, що ми збираємось робити в цій статті. Ми запрограмуємо ESP32 діяти як клієнт BLE і постійно продовжувати сканувати пристрої BLE; якщо ми знайдемо фітнес-діапазон в діапазоні, ми спробуємо підключитися до нього, і якщо з’єднання буде успішним, ми можемо спрацювати лампочку, перемикаючи один із штифтів GPIO на ESP32. Метод надійний, оскільки кожен BLE-сервер(фітнес-група) матиме унікальний апаратний ідентифікатор, тому жоден пристрій сервера BLE не буде ідентичним. Цікаво, правда? !!! А тепер, давайте будувати
Передумови
У цій статті я припускаю, що ви вже знайомі з тим, як користуватися платою ESP32 з Arduino IDE, якщо не повернутися до початку роботи з підручником ESP32.
Ми розділили повний ESP32 Bluetooth на три сегменти для зручності розуміння. Тому рекомендується пройти перші два підручники, перш ніж починати з цього.
- Послідовний Bluetooth на ESP32, що перемикає світлодіод з мобільного телефону
- BLE-сервер для передачі даних про рівень заряду акумулятора на мобільний телефон за допомогою служби GATT
- Клієнт BLE для сканування пристроїв BLE та виступу в якості маяка.
Ми вже розглянули перші два підручники, тут ми переходимо до останнього, щоб пояснити ESP32 як клієнт BLE.
Необхідні матеріали
- Рада з розробки ESP32
- Навантаження змінного струму (лампа)
- Модуль реле
Апаратне забезпечення
Апаратне забезпечення для цього проекту ESP32 BLE Client є досить простим, оскільки більшість магії відбувається всередині коду. ESP32 повинен перемикати лампу змінного струму (Load), коли сигнал Bluetooth виявлений або втрачений. Для перемикання цього навантаження ми будемо використовувати реле, а оскільки штифти GPIO ESP32 сумісні лише на 3,3 В, нам потрібен модуль реле, який можна приводити в дію на 3,3 В. Просто перевірте, який транзистор використовується в модулі реле, якщо це BC548, то вам варто піти ще побудувати власну схему, дотримуючись схеми нижче.
Попередження: Схема працює з прямою напругою мережі змінного струму 220 В. Будьте обережні з дротами під напругою і переконайтеся, що не створюєте короткого замикання. Вас попередили.
Причиною використання BC548 над BC547 або 2N2222 є те, що вони мають низьку напругу базового випромінювача, яка може спрацьовувати лише з 3,3 В. Реле використовується тут реле 5V, тому ми включити його з Вином штифтом, який отримує 5V утворюють кабель живлення. Штифт заземлення з'єднаний із землею ланцюга. Резистор R1 1K використовується в якості базового обмежувача струму резистора. Фазний провід підключений до контакту NO реле, а загальний штифт реле - до навантаження, а інший кінець навантаження - до нейтралі. Ви можете поміняти місцями Фаза та Нейтраль, але подбайте, щоб їх не скорочувати безпосередньо. Струм завжди повинен проходити через навантаження (лампочку).Я використав модуль Relay, щоб зробити речі простішими, і тут завантажується світлодіодна лампа Focus. Моє налаштування виглядає приблизно так нижче
Якщо ви хочете поки що пропустити апаратне забезпечення, ви можете використовувати GPIO 2 pin замість GPIO 13 pin для перемикання вбудованого світлодіода на ESP32. Цей метод рекомендований для початківців.
Отримайте свою Bluetooth-адресу сервера (адреса фітнес-групи)
Як вже говорилося раніше, ми збираємося запрограмувати ESP32 на функцію клієнта (подібно до телефону) та підключення до сервера, який є моєю фітнес-групою (Lenovo HW-01). Щоб клієнт підключився до сервера, він повинен знати адресу сервера Bluetooth. Кожен сервер Bluetooth, як мій фітнес-клуб тут, має свою унікальну адресу Bluetooth, яка є постійною. Ви можете пов’язати це з MAC-адресою вашого ноутбука або мобільного телефону.
Щоб отримати цю Адресу з сервера, ми використовуємо додаток під назвою nRF connect із північних напівпровідників, який ми вже використовували для попереднього підручника. Він доступний безкоштовно як для IOS, так і для користувачів Android. Просто завантажте, запустіть програму та скануйте пристрої Bluetooth поблизу. Програма перелічить усі знайдені пристрої BLE. Шахта називається 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, службу та характеристику UUID, яку ми отримали за допомогою програми підключення nRF, як це пояснювалося в наведених вище заголовках. Код виглядає, як показано нижче
статична BLEUUID serviceUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // Службовий UUID фітнес-смуги, отриманий через додаток nRF connect статичний BLEUUID charUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // Характеристичний UUID фітнес-смуги, отриманої через додаток nRF connect String My_BLE_Address = "c7: f0: 69: f0: 68: 81"; // Апаратне забезпечення Bluetooth MAC мого фітнес-браслета буде відрізнятися для кожного діапазону, отриманого за допомогою програми nRF connect
Слідом за що в програмі ми маємо connectToserver і MyAdvertisedDeviceCallback , який ми повернемося пізніше. Потім всередині функції налаштування ми ініціалізуємо послідовний монітор і робимо BLE на ESP для сканування пристрою. Після завершення сканування для кожного виявленого пристрою BLE викликається функція MyAdvertisedDeviceCallbacks .
Ми також вмикаємо активне сканування, оскільки живимо ESP32 від електромережі, для батареї він вимкнений, щоб зменшити споживання струму. Релейний тригерний штифт підключений до GPIO 13 у нашому обладнанні, тому ми також заявляємо, що штифт GPIO 13 є вихідним.
void setup () { Serial.begin (115200); // Запуск послідовного монітора Serial.println ("Програма сервера ESP32 BLE"); // Вступне повідомлення BLEDevice:: init (""); pBLEScan = BLEDevice:: getScan (); // створюємо нове сканування pBLEScan-> setAdvertisedDeviceCallbacks (нове MyAdvertisedDeviceCallbacks ()); // Виклик класу, визначеного вище pBLEScan-> setActiveScan (true); // активне сканування використовує більше енергії, але швидше отримує результати pinMode (13, ВИХІД); // Оголосимо вбудований світлодіодний штифт як вихідний }
Усередині функції MyAdvertisedDeviceCallbacks ми друкуємо рядок, в якому буде вказано назву та іншу інформацію про виявлені пристрої BLE. Нам потрібен апаратний ідентифікатор пристрою BLE, який було виявлено, щоб ми могли порівняти його з потрібним. Тому ми використовуємо змінну Server_BLE_Address, щоб отримати адресу пристрою, а потім також перетворити її з типу BLEAddress на рядок.
клас MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { void onResult (BLEAdvertisedDevice advertisedDevice) { Serial.printf ("Результат сканування:% s \ n", advertisedDevice.toString (). c_str ()); Server_BLE_Address = новий 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 ("Знайдено пристрій: -)… підключення до сервера як клієнта"); if (connectToserver (* Server_BLE_Address)) {
Усередині функції connectToserver ми використовуємо UUID для з'єднання з сервером BLE (фітнес-група). Для підключення до сервера ESP32 повинен діяти як клієнт, тому ми створюємо клієнта за допомогою функції createClient (), а потім підключаємось до адреси сервера BLE. Потім ми шукаємо послугу та характеристику, використовуючи значення UUID, і намагаємось підключитися до неї. Коли з'єднання успішне, функція повертає істину, а якщо ні, повертає false. Зверніть увагу, що для підключення до сервера з сервером не обов’язково мати службу та характерний UUID, це робиться лише для вашого розуміння.
bool connectToserver (BLEAddress pAddress) { BLEClient * pClient = BLEDevice:: createClient (); Serial.println ("- Створений клієнт"); // Підключення до сервера BLE. pClient-> підключення (pAddress); Serial.println ("- Підключено до фітнес-смужки"); // Отримаємо посилання на службу, яку ми шукаємо, на віддаленому сервері BLE. BLERemoteService * pRemoteService = pClient-> getService (serviceUUID); if (pRemoteService! = nullptr) { Serial.println ("- Знайдено наш сервіс"); повернути істинно; } else повертає false; // Отримати посилання на характеристику в службі віддаленого сервера BLE. pRemoteCharacteristic = pRemoteService->getCharacteristic (charUUID); if (pRemoteCharacteristic! = nullptr) Serial.println ("- Знайдено нашу характеристику"); повернути істинно; }
Якщо підключення вдале, GPIO-штифт 13 робиться високим, а керування передається за межі циклу за допомогою оператора break. Логічна змінна в парі також має значення true.
якщо (connectToserver (* Server_BLE_Address)) { paired = true; Serial.println ("Світлодіод ******************** Увімкнено ********************** ** "); digitalWrite (13, HIGH); перерву; }
Після успішного сполучення та ввімкнення шпильки GPIO ми повинні перевірити, чи пристрій все ще знаходиться в зоні дії. Оскільки зараз пристрій у парі, служба сканування BLE більше не зможе його бачити. Ми знайдемо його знову лише тоді, коли користувач покине зону. Отже, нам просто потрібно сканувати BLE-сервер, і якщо ми виявимо, нам доведеться встановити низький рівень GPIO, як показано нижче
if (Scaned_BLE_Address == My_BLE_Address && paired == true) { Серійний. println ("Наш пристрій вийшов за межі дальності"); парний = хибний; Послідовний. println ("******************** LED OOOFFFFF ************************"); digitalWrite (13, LOW); ESP.restart (); перерву; }
Робота та тестування
Після того, як ви готові до програми та налаштування обладнання, просто завантажте код на ESP32 і розташуйте всю настройку, як показано нижче.
Ви повинні помітити, як лампа вмикається, як тільки фітнес-група (сервер) поєднується з ESP32. Ви також можете перевірити це, помітивши символ підключення Bluetooth на фітнес-ремінці. Після створення пари просто спробуйте піти від ESP32, і коли ви перейдете 3-4 метри, ви помітите, що символ Bluetooth на годиннику зникає, а зв’язок втрачається. Тепер, якщо поглянути на лампу, вона буде вимкнена. Коли ви повертаєтеся назад, пристрій знову сполучається і світло вмикається. З повною роботою проекту можна ознайомитись у відео нижче.
Сподіваюся, вам сподобався проект і ви дізналися щось нове по дорозі. Якщо ви зіткнулися з будь-якою проблемою з приводу її роботи, сміливо публікуйте проблему на форумах або навіть у розділі коментарів нижче