цифровая электроника
вычислительная техника
встраиваемые системы

 
» » » Датчик приближения Bluetooth на ESP32 – обнаружение присутствия устройств BLE

Датчик приближения Bluetooth на ESP32 – обнаружение присутствия устройств BLE

Автор: Mike(admin) от 2-09-2020, 08:35

Датчики приближения можно охарактеризовать как единственные в своем роде переключатели, которые обнаруживают близлежащий объект с помощью света, электромагнитного поля или звука. Как правило, эти типы устройств предназначены для обнаружения близлежащих объектов, и часто большинство из этих датчиков будет использоваться в практических целях. Но есть обстоятельства, когда объект находится далеко от датчика или объект блокируется препятствием, в таких ситуациях мы можем использовать устройства BLE (Bluetooth Low Energy) для обнаружения и определения близости объекта. ESP32 имеет встроенные возможности BLE, которые пригодятся в этом деле.


Датчик приближения Bluetooth на ESP32 – обнаружение присутствия устройств BLE

В этой статье мы покажем вам, как создать простой детектор присутствия BLE с помощью ESP32 и Arduino IDE.


До практической части, ознакомимся немного с теорией. BLE – это сокращение от Bluetooth Low Energy, и оно вошло в нашу повседневную жизнь в 2011 году, потому что в то время все крупные производители начали встраивать технологию BLE в свои устройства. BLE – это технология беспроводной связи с низким энергопотреблением, которая была разработана для приложений с батарейным питанием, которые можно использовать для связи между устройствами на небольшом расстоянии. Некоторые из устройств, которые вы используете каждый день, имеют встроенный Bluetooth, например ваш смартфон, умные часы, беспроводные наушники, беспроводные колонки, устройства умного дома и многое другое. В них есть встроенный Bluetooth для связи или получения данных о местоположении.


BLE – относительно новая технология, и протокол BLE был разработан Bluetooth Special Interest Group (SIG) с основной целью сделать устройства с низким энергопотреблением реальностью. Хотя название недавно созданного протокола осталось прежним, недавно разработанный протокол BLE не был обратно совместим, что означает, что наши устройства Bluetooth Classic не могут взаимодействовать с устройствами BLE, несмотря на это, данная технология позволила разработчикам производить оборудование с очень низким энергопотреблением, то есть эффективные устройства, которые могут работать месяцами и даже годами на небольшой батарее типа «таблетка».


BLE использует иерархическую структуру данных для отправки и получения информации. Устройство BLE, выступающее в качестве сервера, будет передавать сервисы и характеристики, которые могут быть обнаружены клиентом, и после успешного обмена информацией устройства BLE могут обмениваться данными друг с другом одновременно. С технической точки зрения, весь этот информационный стек известен как атрибут устройства BLE. И он определен и реализован с использованием профиля GATT (Generic Attributes). В этих профилях у нас есть сервисы, характеристики и значения в иерархическом порядке. Сервисы содержат характеристики, а характеристика содержит значение; читая характеристику, мы можем прочитать значения и изменения значений с течением времени.


Характеристики могут быть обработаны для включения информации для чтения или записи. Устройства, содержащие компоненты чтения, могут публиковать информацию, а устройства, содержащие характеристики записи, могут получать данные от клиента.


Профиль GATT, в котором определяются услуги и характеристики, известен как универсальный уникальный идентификатор (UUID). Есть некоторые стандартные услуги и характеристики, определенные и зарезервированные корпорацией SIG, если мы прочитаем UUID устройства BLE, мы можем сразу определить, что это за устройство. Данные BLE передаются и принимаются очень маленькими пакетами, пакет BLE имеет всего 31 байт, когда пакет TCP имеет размер 60 или более байтов. Наконец, важно помнить, что пакет BLE должен быть правильно структурирован, который затем может быть последовательно сериализован и десериализован как на сервере, так и на стороне клиента.


Как было сказано ранее, датчики приближения могут обнаруживать объекты с помощью света, электромагнитных волн или звука. Серверы BLE регулярно транслируют вещательные сигналы, чтобы клиенты могли их искать и подключаться к ним. Этот вещательный сигнал содержит уникальный адрес BLE MAC (Media Access Control), который очень похож на MAC-адрес, используемый в Wi-Fi, поскольку наш модуль ESP32 имеет встроенный Bluetooth, мы могли бы легко обнаружить этот транслируемый сигнал и сравнить его с таблицей поиска, чтобы обнаружить присутствие известного устройства. После проверки устройства мы можем включить свет локально или, например, использовать Adafruit IO для запуска уведомления в нашем приложении для Android.


Датчик приближения Bluetooth на ESP32 – обнаружение присутствия устройств BLE

Для этого проекта нам понадобится не так много компонентов, это плата ESP32 и устройство с поддержкой BLE, здесь мы используем MI Band, можно также использовать смартфон с поддержкой BLE.


Датчик приближения Bluetooth на ESP32 – обнаружение присутствия устройств BLE

Для демонстрации мы запрограммируем наш контроллер ESP32 на обнаружение известного маяка BLE, и мы зажжем встроенный светодиод, как только известное устройство окажется близко к нему. Полный код для ESP32 приведен далее.



#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>
String knownBLEAddresses[] = {"6E:bc:55:18:cf:7b", "53:3c:cb:56:36:02", "40:99:4b:75:7d:2f", "5c:5b:68:6f:34:96"};
int RSSI_THRESHOLD = -55;
bool device_found;
int scanTime = 5;
BLEScan* pBLEScan;
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
    void onResult(BLEAdvertisedDevice advertisedDevice) {
      for (int i = 0; i < (sizeof(knownBLEAddresses) / sizeof(knownBLEAddresses[0])); i++)
      {
        //Uncomment to Enable Debug Information
        //Serial.println("*************Start**************");
        //Serial.println(sizeof(knownBLEAddresses));
        //Serial.println(sizeof(knownBLEAddresses[0]));
        //Serial.println(sizeof(knownBLEAddresses)/sizeof(knownBLEAddresses[0]));
        //Serial.println(advertisedDevice.getAddress().toString().c_str());
        //Serial.println(knownBLEAddresses[i].c_str());
        //Serial.println("*************End**************");
        if (strcmp(advertisedDevice.getAddress().toString().c_str(), knownBLEAddresses[i].c_str()) == 0)
                        {
          device_found = true;
                          break;
                        }
        else
          device_found = false;
      }
      Serial.printf("Advertised Device: %s \n", advertisedDevice.toString().c_str());
    }
};
void setup() {
  Serial.begin(115200);
  Serial.println("Scanning...");
  pinMode(LED_BUILTIN, OUTPUT);
  BLEDevice::init("");
  pBLEScan = BLEDevice::getScan();
  pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  pBLEScan->setActiveScan(true);
  pBLEScan->setInterval(100);
  pBLEScan->setWindow(99);
}
void loop() {
  BLEScanResults foundDevices = pBLEScan->start(scanTime, false);
  for (int i = 0; i < foundDevices.getCount(); i++)
  {
    BLEAdvertisedDevice device = foundDevices.getDevice(i);
    int rssi = device.getRSSI();
    Serial.print("RSSI: ");
    Serial.println(rssi);
    if (rssi > RSSI_THRESHOLD && device_found == true)
      digitalWrite(LED_BUILTIN, HIGH);
    else
      digitalWrite(LED_BUILTIN, LOW);
  }
  pBLEScan->clearResults();
}

Загрузите код в ESP32. Поднося близко устройство с BLE, вы сможете увидеть, как загорается светодиод на плате.




© digitrode.ru


Теги: ESP32, Bluetooth, датчик расстояния




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий