Руководство по ESP32 Bluetooth Classic

Основы ESP32: Bluetooth Classic

Основы ESP32: Bluetooth Classic

Большинство людей ассоциируют семейство микроконтроллеров ESP с WiFi, что вполне логично, ведь они стали основным решением для быстрого и простого подключения вашего проекта к сети. Однако, хотя возможность WiFi может быть главной звездой шоу, ESP32 также оснащён Bluetooth. Просто мы не видим, чтобы он использовался так часто.

Если вас интересует использование Bluetooth на ESP32, это руководство станет отличной отправной точкой.

О Bluetooth в ESP32

ESP32 поддерживает двухрежимный Bluetooth, что означает, что он поддерживает как Bluetooth Classic, так и Bluetooth Low Energy (BLE). Хотя эти два протокола имеют много общего, например архитектуру, и оба работают в диапазоне 2,4 ГГц ISM (Industrial, Scientific, and Medical), они довольно сильно отличаются друг от друга.

Bluetooth Classic

Оригинальная технология Bluetooth — та, с которой мы знакомы по подключению смартфонов к беспроводным наушникам — теперь известна как Bluetooth Classic. Если вы когда-либо использовали модули Bluetooth-to-Serial-Bridge, такие как HC-05 или HC-06 с Arduino, вы неосознанно использовали Bluetooth Classic.

Bluetooth Classic предназначен для непрерывной двунаправленной передачи данных с высокой пропускной способностью приложений (до 3 Мбит/с); он очень эффективен, но только на коротких расстояниях. Он использует более 79 каналов в диапазоне 2,4 ГГц ISM.

Этот тип Bluetooth в основном применяется в проектах, где необходимо непрерывно передавать данные, например потоковая передача аудио или передача файлов.

Это руководство научит вас использовать Bluetooth Classic на ESP32.

Bluetooth Low Energy (BLE)

Bluetooth LE, первоначально продвигавшийся как Bluetooth Smart и обычно называемый просто BLE, разработан для работы с очень низким энергопотреблением при сохранении аналогичного диапазона связи. Однако BLE — это гораздо больше, чем просто энергосберегающая версия Bluetooth Classic. BLE работает в том же диапазоне радиочастот, что и Bluetooth Classic, но использует другой набор из 40 каналов с более низкой скоростью передачи данных (до 1 Мбит/с).

Он хорошо подходит для IoT-проектов, где основной проблемой является энергопотребление — например, проект, в котором необходимо периодически пробуждать устройство, собирать данные датчиков, передавать их по Bluetooth, а затем возвращаться в спящий режим.

Поскольку использование ESP32 BLE немного сложнее, чем использование Bluetooth Classic, мы рассмотрели это в отдельном руководстве.

Основы ESP32: Bluetooth Low Energy (BLE)

Bluetooth Low Energy (BLE) сейчас повсюду. Если вы запустите сканер на телефоне и прогуляетесь по окрестностям, вы, несомненно, обнаружите…

/lastminuteengineers/esp32-ble-tutorial/index

Bluetooth Classic vs. BLE

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

Энергопотребление: Bluetooth Classic обычно потребляет больше энергии (около 1 Вт), тогда как BLE разработан для низкого энергопотребления (обычно от 0,01 до 0,5 Вт), что делает его подходящим для устройств с батарейным питанием, которым необходимо работать в течение длительного времени.

Скорость передачи данных: Bluetooth Classic обеспечивает более высокую скорость передачи данных, чем BLE, что делает его подходящим для проектов, требующих непрерывной и высокоскоростной передачи данных, тогда как BLE оптимизирован для коротких пакетов передачи данных.

Дальность: И BLE, и Classic могут покрывать расстояние до 100 метров, но точное расстояние зависит от окружающей среды и реализации.

Задержка: Соединения Bluetooth Classic имеют задержку до 100 мс, тогда как соединения BLE имеют задержку 6 мс. Имейте в виду, что чем меньше — тем лучше.

Совместимость: Bluetooth Classic более распространён в старых устройствах, тогда как BLE обычно используется в современных смартфонах и других гаджетах.

Посмотрите на таблицу ниже, в которой более подробно сравниваются BLE и Bluetooth Classic.

Bluetooth Classic

Bluetooth Low Energy (BLE)

Скорость передачи данных

1 Мбит/с для BR, 2-3 Мбит/с для EDR

500 кбит/с – 1 Мбит/с

Частотный диапазон

Диапазон 2,4 ГГц ISM

Диапазон 2,4 ГГц ISM

Количество каналов

79 каналов с интервалом 1 МГц

40 каналов с интервалом 2 МГц

Дальность связи

от 8 м до 100 м

от 8 м до 100 м

Энергопотребление

Высокое (до 1 Вт)

Низкое (от 0,01 Вт до 0,5 Вт)

Обязательно ли сопряжение устройств?

ДА

НЕ обязательно

Поддерживаемые топологии

Точка-точка (1:1)

Точка-точка (1:1), Широковещание (1:много), Mesh (много:много)

Метод модуляции

GFSK, π/4 DQPSK, 8 DPSK

GFSK

Задержка

35 мс

2-16 мс (в среднем 9 мс)

Стек протоколов Bluetooth ESP32

Прежде чем мы продолжим, важно понять стек протоколов Bluetooth. Это поможет вам понять, почему мы используем определённые функции в нашем коде.

По сути, стек протоколов Bluetooth разделён на две части: «стек хоста» и «стек контроллера».

Хост — это основной процессор, на котором работает стек Bluetooth. ESP-IDF в настоящее время поддерживает два стека хоста. Стек на основе BLUEDROID (по умолчанию) поддерживает как Bluetooth Classic, так и BLE. С другой стороны, стек на основе Apache NimBLE поддерживает только BLE.

Стек контроллера управляет радиомодулем Bluetooth. По сути, он действует как конвейер данных: последовательные данные, которые он получает, передаются через Bluetooth-соединение, а данные, поступающие со стороны Bluetooth, передаются хосту.

Стек протоколов Bluetooth ESP32

Интерфейс VHCI (программно реализованный виртуальный интерфейс HCI) обеспечивает связь между хостом и контроллером.

Для получения дополнительной информации ознакомьтесь с описанием архитектуры Bluetooth от Espressif.

Скетч Bluetooth Serial

Теперь давайте запрограммируем ESP32 так, чтобы он мог обмениваться данными с нашим смартфоном.

Мы будем использовать Arduino IDE для программирования ESP32, поэтому убедитесь, что у вас установлено дополнение ESP32, прежде чем продолжить:

Установка платы ESP32 в Arduino IDE

Микроконтроллер ESP32 быстро стал одной из самых популярных плат среди любителей, инженеров и людей, интересующихся Интернетом вещей (IoT)…

/lastminuteengineers/esp32-arduino-ide-tutorial/index

Откройте Arduino IDE и перейдите в File > Examples > BluetoothSerial > SerialtoSerialBT. Должен загрузиться следующий код.

#include "BluetoothSerial.h"

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

#if !defined(CONFIG_BT_SPP_ENABLED)
#error Serial Bluetooth not available or not enabled. It is only available for the ESP32 chip.
#endif

BluetoothSerial SerialBT;

void setup() {
  Serial.begin(115200);
  SerialBT.begin("ESP32test"); //Bluetooth device name
  Serial.println("The device started, now you can pair it with bluetooth!");
}

void loop() {
  if (Serial.available()) {
    SerialBT.write(Serial.read());
  }
  if (SerialBT.available()) {
    Serial.write(SerialBT.read());
  }
  delay(20);
}

После загрузки скетча откройте монитор последовательного порта на скорости 115200 бод. Вы должны увидеть сообщение: «The device started, now you can pair it with bluetooth!».

Вывод ESP32 Bluetooth Classic — скриншот 1

Объяснение кода

Этот код устанавливает двунаправленную последовательную Bluetooth-связь между двумя устройствами. Код начинается с подключения библиотеки BluetoothSerial.h, которая предоставляет необходимые функции для последовательных операций через Bluetooth.

#include "BluetoothSerial.h"

Следующий фрагмент кода проверяет, правильно ли включён Bluetooth.

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

#if !defined(CONFIG_BT_SPP_ENABLED)
#error Serial Bluetooth not available or not enabled. It is only available for the ESP32 chip.
#endif

Далее создаётся объект класса BluetoothSerial с именем SerialBT. Он инициализирует стек Bluetooth на ESP32 и управляет передачей и приёмом данных. Вы можете ознакомиться с файлом реализации этого класса здесь. Внутри этот класс использует Bluetooth Classic API IDF.

BluetoothSerial SerialBT;

В setup инициализируется последовательная связь на скорости 115200 бод.

Serial.begin(115200);

После этого вызывается метод begin() объекта BluetoothSerial, который выполняет низкоуровневую инициализацию стека Bluetooth. Этот метод принимает строковый аргумент с желаемым именем устройства Bluetooth. Это имя видно другим устройствам с поддержкой Bluetooth во время процесса обнаружения. По умолчанию оно называется ESP32test, но вы можете переименовать его и дать ему уникальное имя.

Обратите внимание, что этот метод возвращает логическое значение, указывающее, была ли инициализация успешной или нет. Пока мы не проверяли это значение, но для надёжного кода вы всегда должны включать проверки ошибок.

SerialBT.begin("ESP32test"); //Bluetooth device name

Секция loop обеспечивает двунаправленную передачу данных между монитором последовательного порта и последовательным Bluetooth ESP32.

Первый оператор if проверяет, есть ли данные на стандартном последовательном порту (например, когда вы отправляете данные из монитора последовательного порта на ПК). Если данные доступны, они считываются с помощью Serial.read() и отправляются через последовательное Bluetooth-соединение с помощью SerialBT.write(). Таким образом, любые данные, отправленные с вашего компьютера через последовательный порт, пересылаются на подключённое Bluetooth-устройство.

if (Serial.available()) {
  SerialBT.write(Serial.read());
}

Следующий оператор if проверяет, есть ли данные от последовательного Bluetooth-соединения (например, когда сопряжённое Bluetooth-устройство отправляет данные). Если данные доступны, они считываются с помощью SerialBT.read() и отправляются в монитор последовательного порта с помощью Serial.write(). Таким образом, любые данные, полученные от Bluetooth-устройства, пересылаются в ваш монитор последовательного порта.

if (SerialBT.available()) {
  Serial.write(SerialBT.read());
}

Подключение к телефону Android

Давайте настроим беспроводное соединение между ESP32 и телефоном Android. Процесс может отличаться в зависимости от устройства, но общие шаги довольно похожи.

  1. Убедитесь, что ESP32 включён и готов к установлению соединения.

  2. Теперь проведите вниз от верхней части экрана вашего телефона Android и убедитесь, что Bluetooth включён.

Включите Bluetooth на телефоне
  1. Нажмите и удерживайте значок Bluetooth, затем нажмите «Сопряжение нового устройства» и подождите несколько секунд.

Сопряжение нового Bluetooth-устройства
  1. Нажмите на имя Bluetooth-устройства, с которым вы хотите выполнить сопряжение (в нашем случае ESP32test). Следуйте инструкциям на экране.

Выберите ESP32test из всех обнаруженных устройств
  1. Для следующих шагов в этом руководстве вам потребуется приложение Bluetooth Terminal, установленное на вашем смартфоне. Мы рекомендуем использовать Android-приложение «Serial Bluetooth Terminal», доступное в Play Store.

Приложение Serial Bluetooth Terminal
  1. После установки запустите приложение «Serial Bluetooth Terminal». Нажмите на значок в верхнем левом углу и выберите «Devices».

Откройте меню и выберите Devices
  1. Вы должны увидеть список устройств, с которыми ранее выполнялось сопряжение. Выберите «ESP32test» из этого списка.

Выберите ESP32test из списка сопряжённых устройств
  1. Вы должны получить сообщение «Connected». Вот и всё! Ваш смартфон теперь успешно сопряжён с ESP32 и готов к обмену данными.

Телефон подключён к ESP32test
  1. Теперь введите что-нибудь в поле ввода внизу приложения, например, «Hi!»

Отправка сообщения из приложения на ESP32
  1. Вы должны мгновенно получить это сообщение в мониторе последовательного порта Arduino IDE.

Вывод ESP32 Bluetooth Classic — скриншот 2
  1. Вы также можете обмениваться данными между монитором последовательного порта и смартфоном. Введите что-нибудь в верхнем поле ввода монитора последовательного порта и нажмите кнопку «Send».

Отправка сообщения из монитора последовательного порта в приложение
  1. Вы должны мгновенно получить это сообщение в приложении Serial Bluetooth Terminal.

Приложение показывает полученное сообщение

Проект ESP32: Управление реле через Bluetooth

Давайте создадим простой проект, который позволяет управлять реле по беспроводной связи через Bluetooth. Это может быть полезно для домашней автоматизации, умного освещения, систем безопасности и других подобных применений.

Схема подключения

Подключите модуль реле к ESP32, как показано на следующей схеме. Схема показывает подключение для 2-канального модуля реле; подключение для другого количества каналов аналогично.

Подключение модуля реле к ESP32

Код ESP32

После завершения подключения попробуйте приведённый ниже скетч.

#include "BluetoothSerial.h"

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

#if !defined(CONFIG_BT_SPP_ENABLED)
#error Serial Bluetooth not available or not enabled. It is only available for the ESP32 chip.
#endif

// GPIO where relay is connected to
const int relayPin =  5;

// Handle received messages
String message = "";

// Create BluetoothSerial object
BluetoothSerial SerialBT;

void setup() {
  // Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
  Serial.begin(115200);

  // Initialize relayPin as an output
  pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, HIGH);

  // Initialize the Bluetooth stack
  SerialBT.begin("ESP32test"); //Bluetooth device name
  Serial.println("The device started, now you can pair it with bluetooth!");
}

void loop() {
  if (SerialBT.available()){
    char incomingChar = SerialBT.read();
    if (incomingChar != '\n'){
      message += String(incomingChar);
    }
    else{
      message = "";
    }
    Serial.write(incomingChar);
  }
  // Check received message and control output accordingly
  if (message == "on"){
    digitalWrite(relayPin, LOW);
  }
  else if (message == "off"){
    digitalWrite(relayPin, HIGH);
  }
  delay(20);
}

Тестирование кода

После загрузки скетча откройте монитор последовательного порта на скорости 115200 бод и нажмите кнопку EN. Вы должны увидеть сообщение: «The device started, now you can pair it with bluetooth!».

Вывод ESP32 Bluetooth Classic — скриншот 1

Запустите приложение Serial Bluetooth Terminal и подключитесь к вашему ESP32.

Теперь, когда вы наберёте «on» в поле ввода внизу приложения, реле должно мгновенно активироваться. Аналогично, ввод «off» немедленно деактивирует реле.

Отправка сообщений ON/OFF для управления реле

Кроме того, вы будете получать эти сообщения в мониторе последовательного порта Arduino IDE для целей мониторинга.

Вывод ESP32 Bluetooth Classic — скриншот 3

Приложение предлагает несколько макросов, которые можно настроить для сохранения стандартных сообщений. Например, вы можете связать M1 с сообщением «on», а M2 — с сообщением «off». Таким образом, вы можете легко управлять реле с помощью предопределённых макросов, добавляя дополнительный уровень удобства в ваш проект.

Макросы приложения Serial Bluetooth Terminal Редактирование макросов