
Основы 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, мы рассмотрели это в отдельном руководстве.
Bluetooth Low Energy (BLE) сейчас повсюду. Если вы запустите сканер на телефоне и прогуляетесь по окрестностям, вы, несомненно, обнаружите…
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, передаются хосту.
Интерфейс VHCI (программно реализованный виртуальный интерфейс HCI) обеспечивает связь между хостом и контроллером.
Для получения дополнительной информации ознакомьтесь с описанием архитектуры Bluetooth от Espressif.
Скетч Bluetooth Serial
Теперь давайте запрограммируем ESP32 так, чтобы он мог обмениваться данными с нашим смартфоном.
Мы будем использовать Arduino IDE для программирования ESP32, поэтому убедитесь, что у вас установлено дополнение ESP32, прежде чем продолжить:
Микроконтроллер ESP32 быстро стал одной из самых популярных плат среди любителей, инженеров и людей, интересующихся Интернетом вещей (IoT)…
Откройте 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!».
Объяснение кода
Этот код устанавливает двунаправленную последовательную 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. Процесс может отличаться в зависимости от устройства, но общие шаги довольно похожи.
Убедитесь, что ESP32 включён и готов к установлению соединения.
Теперь проведите вниз от верхней части экрана вашего телефона Android и убедитесь, что Bluetooth включён.
Нажмите и удерживайте значок Bluetooth, затем нажмите «Сопряжение нового устройства» и подождите несколько секунд.
Нажмите на имя Bluetooth-устройства, с которым вы хотите выполнить сопряжение (в нашем случае ESP32test). Следуйте инструкциям на экране.
Для следующих шагов в этом руководстве вам потребуется приложение Bluetooth Terminal, установленное на вашем смартфоне. Мы рекомендуем использовать Android-приложение «Serial Bluetooth Terminal», доступное в Play Store.
После установки запустите приложение «Serial Bluetooth Terminal». Нажмите на значок в верхнем левом углу и выберите «Devices».
Вы должны увидеть список устройств, с которыми ранее выполнялось сопряжение. Выберите «ESP32test» из этого списка.
Вы должны получить сообщение «Connected». Вот и всё! Ваш смартфон теперь успешно сопряжён с ESP32 и готов к обмену данными.
Теперь введите что-нибудь в поле ввода внизу приложения, например, «Hi!»
Вы должны мгновенно получить это сообщение в мониторе последовательного порта Arduino IDE.
Вы также можете обмениваться данными между монитором последовательного порта и смартфоном. Введите что-нибудь в верхнем поле ввода монитора последовательного порта и нажмите кнопку «Send».
Вы должны мгновенно получить это сообщение в приложении Serial Bluetooth Terminal.
Проект ESP32: Управление реле через Bluetooth
Давайте создадим простой проект, который позволяет управлять реле по беспроводной связи через Bluetooth. Это может быть полезно для домашней автоматизации, умного освещения, систем безопасности и других подобных применений.
Схема подключения
Подключите модуль реле к ESP32, как показано на следующей схеме. Схема показывает подключение для 2-канального модуля реле; подключение для другого количества каналов аналогично.
Код 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!».
Запустите приложение Serial Bluetooth Terminal и подключитесь к вашему ESP32.
Теперь, когда вы наберёте «on» в поле ввода внизу приложения, реле должно мгновенно активироваться. Аналогично, ввод «off» немедленно деактивирует реле.
Кроме того, вы будете получать эти сообщения в мониторе последовательного порта Arduino IDE для целей мониторинга.
Приложение предлагает несколько макросов, которые можно настроить для сохранения стандартных сообщений. Например, вы можете связать M1 с сообщением «on», а M2 — с сообщением «off». Таким образом, вы можете легко управлять реле с помощью предопределённых макросов, добавляя дополнительный уровень удобства в ваш проект.