- Предварителни условия
- Необходими материали
- Хардуер
- Вземете вашия Bluetooth адрес на сървър (Адрес на фитнес група)
- Получаване на услугата и характеристичен UUID на сървъра
- Програмиране на ESP32 да действа като клиент за приложение за превключване на близост
- Работа и тестване
Колко страхотно е да включите автоматично осветлението веднага щом влезете в дома си и да го изключите отново, когато си тръгнете! Да, просто приложение може да направи това вместо вас. Тук в този проект ще използваме 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
- AC натоварване (лампа)
- Релеен модул
Хардуер
Хардуерът за този проект на ESP32 BLE Client е доста обикновен, тъй като по-голямата част от магията се случва вътре в кода. ESP32 трябва да превключва лампа за променлив ток (Load), когато Bluetooth сигналът бъде открит или загубен. За превключване на това натоварване ще използваме реле и тъй като GPIO щифтовете на ESP32 са съвместими само с 3.3V, имаме нужда от релеен модул, който може да се задвижва с 3.3V. Просто проверете какъв транзистор се използва в модула за реле, ако е BC548, добре е да продължите да изграждате собствена схема, като следвате схемата по-долу.
Предупреждение: Веригата се занимава с директно 220V променливо напрежение в мрежата. Внимавайте с жиците под напрежение и се уверете, че не създавате късо съединение. Предупреден си.
Причината за използването на BC548 над BC547 или 2N2222 е, че те имат ниско напрежение на базовия емитер, което може да се задейства само с 3.3V. В релето се използва тук е 5V реле, така че ние го захранва с Вин щифт, който получава 5V образува захранващия кабел. Заземителният щифт е свързан със земята на веригата. В Резистор R1 1k се използва като база ток ограничител резистор. Фазовият проводник е свързан към NO щифта на релето, а общият щифт на релето е свързан към товара, а другият край на товара е свързан към неутрален. Можете да сменяте позицията на Фаза и Неутрално, но внимавайте да не ги съкратите директно. Токът винаги трябва да преминава през товара (крушка).Използвал съм модул за реле, за да улесня нещата и тук натоварването е LED лампа Focus. Моята настройка изглежда по-долу по следния начин
Ако искате да пропуснете хардуера засега, можете да използвате GPIO 2 пина вместо GPIO 13, за да превключите бордовия светодиод на 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 да действа като клиент за приложение за превключване на близост
Идеята на програмата е да накара 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 на услугата на фитнес лента, получена чрез статично приложение BLEUUID charUUID на приложението nRF connect ("0000fee7-0000-1000-8000-00805f9b34fb"); // Характеристичен UUID на фитнес лентата, получен чрез приложение за свързване nRF 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 Server program"); // Встъпително съобщение BLEDevice:: init (""); pBLEScan = BLEDevice:: getScan (); // създаване на ново сканиране pBLEScan-> setAdvertisedDeviceCallbacks (ново MyAdvertisedDeviceCallbacks ()); // Извикваме класа, който е дефиниран по-горе pBLEScan-> setActiveScan (true); // активното сканиране използва повече енергия, но постига резултати по-бързо pinMode (13, OUTPUT); // Деклариране на вградения LED щифт като изход }
Във функцията MyAdvertisedDeviceCallbacks отпечатваме ред, който ще изброи името и друга информация за откритите BLE устройства. Нуждаем се от хардуерния идентификатор на BLE устройството, което е било открито, за да можем да го сравним с желаното. Затова използваме променливата Server_BLE_Address, за да получим адреса на устройството и след това също да го преобразуваме от тип BLEAddress в низ.
клас MyAdvertisedDeviceCallbacks: публичен 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 ("Намерено устройство: -)… свързване към сървъра като клиент"); ако (connectToserver (* Server_BLE_Address)) {
Във функцията connectToserver използваме UUID за сдвояване с BLE сървъра (фитнес лента). За да се свърже със сървър, ESP32 трябва да действа като клиент, така че ние създаваме клиент чрез функцията createClient () и след това се свързваме с адреса на BLE сървъра. След това търсим услугата и характеристиката, използвайки стойностите на UUID, и се опитваме да се свържем с нея. Когато връзката е успешна, функцията връща true, а ако не - 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 се прави високо и контролата се изпраща извън цикъла с помощта на инструкцията за прекъсване. Булевата променлива сдвоена също е зададена да бъде истина.
if (connectToserver (* Server_BLE_Address)) { paired = true; Serial.println ("******************** LED включен ********************** ** "); 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 на часовника изчезва и връзката се губи. Сега, ако погледнете лампата, тя ще бъде изключена. Когато се върнете обратно, устройството отново се сдвоява и светлината се включва. Цялостната работа на проекта може да бъде намерена във видеото по-долу.
Надявам се, че проектът ви е харесал и сте научили нещо ново по пътя. Ако сте се сблъскали с някакъв проблем при задействането му, не се колебайте да публикувате проблема във форуми или дори в раздела за коментари по-долу