- Предварительные условия
- Необходимые материалы
- Оборудование
- Получите свой 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 должен переключать лампу переменного тока (нагрузка) при обнаружении или потере сигнала Bluetooth. Чтобы переключить эту нагрузку, мы будем использовать реле, а поскольку контакты GPIO ESP32 совместимы только с 3,3 В, нам нужен модуль реле, который может работать с 3,3 В. Просто проверьте, какой транзистор используется в модуле реле, если это BC548, вы можете создать свою собственную схему, следуя схеме ниже.
Предупреждение: Схема работает с постоянным сетевым напряжением 220 В переменного тока. Будьте осторожны с проводами под напряжением и убедитесь, что вы не создаете короткое замыкание. Вы были предупреждены.
Причина использования BC548 вместо BC547 или 2N2222 заключается в том, что они имеют низкое напряжение база-эмиттер, которое может срабатывать только при напряжении 3,3 В. Реле используется здесь реле 5V, поэтому мы включить его с Вином штифтом, который получает 5V образуют кабель питания. Контакт заземления соединен с землей цепи. Резистор R1 1K используется в качестве базового ограничителя тока резистора. Фазный провод подключается к нормально разомкнутому контакту реле, а общий контакт реле подключается к нагрузке, а другой конец нагрузки подключается к нейтрали. Вы можете поменять местами фазы и нейтраль, но будьте осторожны, не закорачивайте их напрямую. Ток всегда должен проходить через нагрузку (лампочку).Для простоты я использовал релейный модуль, а в качестве нагрузки здесь используется светодиодная лампа Focus. Моя установка выглядит примерно так, как показано ниже
Если вы хотите на данный момент отказаться от оборудования, вы можете использовать контакт GPIO 2 вместо вывода GPIO 13 для переключения встроенного светодиода на ESP32. Этот способ рекомендуется новичкам.
Получите свой Bluetooth-адрес сервера (адрес фитнес-браслета)
Как было сказано ранее, мы собираемся запрограммировать ESP32, чтобы он работал в качестве клиента (аналогично телефону) и подключался к серверу, которым является мой фитнес-браслет (Lenovo HW-01). Чтобы клиент мог подключиться к серверу, он должен знать Bluetooth-адрес сервера. У каждого сервера Bluetooth, такого как мой фитнес-браслет, есть собственный уникальный адрес Bluetooth, который является постоянным. Вы можете связать это с MAC-адресом вашего ноутбука или мобильного телефона.
Чтобы получить этот адрес с сервера, мы используем приложение под названием nRF connect от Nordic полупроводников, которое мы уже использовали в нашем предыдущем руководстве. Он доступен бесплатно как для пользователей 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, когда он находит наш сервер (фитнес-браслет), он проверяет идентификатор оборудования и будет переключать свет через вывод 13 GPIO. !, но с этим есть одна проблема. Все серверы BLE будут иметь радиус действия 10 метров, что слишком много. Так что, если мы пытаемся заставить бесконтактный переключатель включать свет при открытии двери, этот диапазон очень велик.
Чтобы уменьшить диапазон BLE-сервера, мы можем использовать опцию сопряжения. Сервер и клиент BLE будут оставаться в паре только в том случае, если оба они находятся на расстоянии 3-4 метров. Это идеально подходит для нашего приложения. Итак, мы заставляем ESP32 не только обнаруживать сервер BLE, но и подключаться к нему и проверять, остается ли он в паре. Пока они сопряжены, лампа переменного тока будет гореть, когда диапазон превышает диапазон, сопряжение будет потеряно, и лампа выключится. Полный пример программы ESP32 BLE, делающей то же самое, приведен в конце этой страницы. Ниже я разобью код на небольшие фрагменты и попытаюсь объяснить их.
После включения файла заголовка мы информируем ESP32 об адресе BLE, службе и характеристическом UUID, которые мы получили через приложение nRF connect, как описано в заголовках выше. Код выглядит следующим образом
статический BLEUUID serviceUUID («0000fee7-0000-1000-8000-00805f9b34fb»); // Служба UUID из fitnessband, полученного через NRF подключения приложения статической BLEUUID charUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // Характеристика UUID из fitnessband, полученного посредством СИФ подключения приложения Строка My_BLE_Address = "с7: f0: 69: f0: 68: 81"; // Оборудование Bluetooth MAC моего fitnessband , будет меняться для каждой полосы, полученной посредством NRF подключения приложения
Затем в программе есть connectToserver и MyAdvertisedDeviceCallback, к которым мы вернемся позже. Затем внутри функции настройки мы инициализируем последовательный монитор и заставляем BLE на ESP сканировать устройство. После завершения сканирования для каждого обнаруженного устройства BLE вызывается функция MyAdvertisedDeviceCallbacks .
Мы также включаем активное сканирование, так как мы питаем ESP32 от сети, для приложения батареи он отключается, чтобы снизить потребление тока. Триггерный вывод реле подключен к GPIO 13 в нашем оборудовании, поэтому мы также заявляем, что вывод 13 GPIO является выходом.
void setup () { Serial.begin (115200); // Запуск последовательного монитора Serial.println ("Программа сервера ESP32 BLE"); // Вступительное сообщение BLEDevice:: init (""); pBLEScan = BLEDevice:: getScan (); // создаем новое сканирование pBLEScan-> setAdvertisedDeviceCallbacks (new MyAdvertisedDeviceCallbacks ()); // Вызов класса, определенного выше pBLEScan-> setActiveScan (true); // активное сканирование потребляет больше энергии, но дает результаты быстрее pinMode (13, OUTPUT); // Объявляем вывод встроенного светодиода как выход }
Внутри функции 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 = новый BLEAddress (рекламируемыйDevice.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, и пытаемся подключиться к ней. При успешном соединении функция возвращает истину, а в противном случае - ложь. Обратите внимание, что для сопряжения с сервером необязательно иметь сервисный и характеристический 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 return false; // Получение ссылки на характеристику в службе удаленного BLE-сервера. pRemoteCharacteristic = pRemoteService->getCharacteristic (charUUID); if (pRemoteCharacteristic! = nullptr ) Serial.println ("- Нашли нашу характеристику"); вернуть истину; }
Если соединение установлено успешно, на выводе 13 GPIO устанавливается высокий уровень, и управление отправляется за пределы цикла с помощью оператора break. Парная логическая переменная также имеет значение true.
если (connectToserver (* Server_BLE_Address)) { paired = true; Serial.println ("******************** Светодиод включен ********************** ** "); digitalWrite (13, ВЫСОКИЙ); сломать; }
После успешного сопряжения и включения контакта GPIO мы должны проверить, находится ли устройство в зоне действия. Поскольку теперь устройство сопряжено, служба сканирования BLE больше не сможет его увидеть. Мы найдем его снова, только когда пользователь покинет зону. Поэтому нам просто нужно просканировать наш BLE-сервер, и если мы обнаружим, что нам нужно установить вывод GPIO на низкий уровень, как показано ниже.
if (Scaned_BLE_Address == My_BLE_Address && paired == true) { Последовательный. println («Наше устройство вышло из зоны действия»); пара = ложь; Серийный. println ("******************* LED OOOFFFFF ***********************"); digitalWrite (13, НИЗКИЙ); ESP.restart (); сломать; }
Работа и тестирование
Когда вы будете готовы с программой и настройкой оборудования, просто загрузите код в ESP32 и настройте всю настройку, как показано ниже.
Вы должны заметить, что лампа включается, как только фитнес-браслет (сервер) соединяется с ESP32. Вы также можете проверить это, заметив значок подключения Bluetooth на фитнес-браслете. После сопряжения просто попробуйте отойти от ESP32, и когда вы пересечете 3-4 метра, вы заметите, что символ Bluetooth на часах исчезнет и соединение будет потеряно. Теперь, если вы посмотрите на лампу, она погаснет. Когда вы входите обратно, устройство снова сопрягается, и включается свет. Полную работу проекта можно посмотреть на видео ниже.
Надеюсь, вам понравился проект и вы узнали что-то новое по пути. Если вы столкнулись с какой-либо проблемой в его работе, не стесняйтесь сообщать о проблеме на форумах или даже в разделе комментариев ниже.