Модули Bluetooth, например HC-05 и HC-06, легко настраиваются и просты в использовании с Arduino IDE, но у них есть некоторые недостатки, например, высокое энергопотребление и поддержка только протокола Bluetooth V2.0. Cтоит отметить, что в ESP32 есть два вида Bluetooth: один – Bluetooth Classic, а другой – BLE (Bluetooth Low Energy).
В чем отличие Bluetooth Classic от Bluetooth Low Energy?
Bluetooth Low Energy потребляет меньше энергии, чем Bluetooth Classic. Протокол более энергоэффективен за счет наличия заранее определенных интервалов, во время которых происходит отключения модуля. Однако, он не используется для передачи файлов или музыки.
BLE также позволяет определить тип подключенного устройства, а также отображать некоторые характеристики устройства (например, уровень заряда батареи в Bluetooth-наушниках или фитнесс-браслете)
Устройства BLE работают с Bluetooth V4.0 и могут работать как в роли сервера, так и клиента, что делает BLE идеальным для маяков, смарт-часов, фитнес-трекеров и т. д.
Bluetooth Classic используется для передачи файлов и других данных. Почти у всех устройств BLE есть классические функции Bluetooth, связанные с первоначальным вариантом протокола. Bluetooth, используемый в таких модулях, как HC-05, представляет собой версию Bluetooth Classic, известную, как Bluetooth SSP (Serial Port Protocol). Это означает, что Bluetooth работает по стандартному последовательному протоколу, что упрощает отправку и получение данных без значительных задержек.
В данной статье будем использовать Serial Bluetooth для ESP32, установим соединение между платой и смартфоном и будем отправлять команды на плату для переключения состояния светодиода на плате.
Пишем скетч
Скетч данного проекта приведен в конце этой статьи. А пока разобьем код на небольшие фрагменты и попытаемся понять их. Если вы уже работали с модулям Bluetooth, такими как HC-05, то скетч покажется вам знакомым.
Суть программы – инициализировать последовательное соединение по Bluetooth и ожидать получения данных от сопряженных устройств. Если полученное значение равно «1», то включаем светодиод, если «0» – отключаем.
Сначала подключаем библиотеку, которая определяет работу модуля Bluetooth платы по протоколу Bluetooth SSP.
1 |
#include "BluetoothSerial.h" |
Следующее, что нужно – объект для действий, связанных с протоколом Bluetooth.
1 |
BluetoothSerial ESP_BT; |
Далее, внутри функции void setup() указываем инициализацию последовательной связи со скоростью 9600 бод и создаем соединение по Bluetooth с названием «ESP32_LED_Control», это будет имя хоста, отображаемое телефоном при попытке сопряжения. Наконец, объявляем вывод для светодиода в качестве выходного, поскольку мы собираемся управлять им с помощью полученной по Bluetooth команды.
1 2 3 4 5 6 7 8 9 10 11 12 |
void setup() { Serial.begin(9600); ESP_BT.begin("ESP32_LED_Control"); Serial.println("Bluetooth Device is Ready to Pair"); pinMode (LED_BUILTIN, OUTPUT); } |
Внутри функции loop проверяем, есть ли какие-либо данные, поступающие по Bluetooth. Если есть – считываем и сохраняем в переменную. Выводим полученное сообщение в монитор порта.
1 2 3 4 5 6 7 |
if (ESP_BT.available()) { incoming = ESP_BT.read(); Serial.print("Received:"); Serial.println(incoming); |
Теперь любые полученные данные сохраняются в этой переменной, поэтому можно напрямую сравнить эту переменную с ожидаемым значением и выполнить требуемое действие. Необходимо учесть, что полученное сообщение будет типа char, поэтому необходимо перевести полученное сообщение в десятичное представление. В нашем случае для char ‘0’ десятичное значение равно 48, а для char ‘1’ – 49. Эти значения можно найти в таблице ASCII для каждого символа.
Сравниваем полученное значение с 48 и 49 для проверки на логические 0 и 1 соответственно. Если «0», то выключаем светодиод и выводим сообщение о выключении светодиода и выполняем обратные действия для «1».
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
if (incoming == 49) { digitalWrite(LED_BUILTIN, HIGH); ESP_BT.println("LED turned ON"); } if (incoming == 48) { digitalWrite(LED_BUILTIN, LOW); ESP_BT.println("LED turned OFF"); } |
Теперь проверим работу Bluetooth платы. Подключаем ESP32 к компьютеру выбираем плату и порт. После загрузки запускаем монитор порта для отладки и открываем список устройств Bluetooth на телефоне. Должно обнаружиться устройство с именем ESP32_LED_Control.
Теперь можно открыть любое приложение Bluetooth Terminal из Google Play на своем смартфоне. В терминале вводим 1 или 0 и нажимаем «Отправить».
Плата должна получить сообщение и включить светодиод, а также выдать об этом сообщение. Также можно увидеть полученные данные в мониторе порта (в десятичном представлении).
Скетч проекта
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
#include <BluetoothSerial.h> BluetoothSerial ESP_BT; <em>// </em><em>Объект</em><em> Bluetooth</em> int incoming; int LED_BUILTIN = 2; void setup() { Serial.begin(9600); <em>// Запускаем последовательный монитор со скоростью </em><em>9600</em> ESP_BT.begin("ESP32_LED_Control"); <em>// </em><em>Имя</em> <em>хоста</em><em> Bluetooth</em> Serial.println("Bluetooth Device is Ready to Pair"); pinMode (LED_BUILTIN, OUTPUT);<em>// </em><em>вывод</em> <em>светодиода</em> } void loop() { if (ESP_BT.available()) <em>// Проверяем, не получили ли мы что-либо по Bluetooth</em> { incoming = ESP_BT.read(); <em>// Считываем данные</em> Serial.print("Received:"); Serial.println(incoming); if (incoming == 49) { digitalWrite(LED_BUILTIN, HIGH); ESP_BT.println("LED turned ON"); } if (incoming == 48) { digitalWrite(LED_BUILTIN, LOW); ESP_BT.println("LED turned OFF"); } } delay(20); } |
3 комментария. Оставить новый
Хорошая статья! Про Bluetooth на ESP-32 на русском языке в сети мало информации. Спасибо. Хотелось бы увидеть и про a2dp режим.
При сопряжении с блютузом пароль не нужен?
У этой платы вроде три uart. Как выбрать другой uart
ДЛЯ ESP32 WEMOS D1
светодиод ТАК работать не будет при компиляции выпадает ошибка.(вероятно он не на том пине)
если убрать все про диод работает отлично-))
да последняя бибилотека с гитхбаба по теме блютуза на 3.02.2023
какая то ключная у меня с ней так и не скомпелировалось
а вот с предыдущей без проблем.
но может у меня конечно руки кривые. не спорю)))