ESP32 Bluetooth Classic с Arduino IDE – Начало работы
ESP32 поставляется с Wi-Fi, Bluetooth Low Energy и Bluetooth Classic. В этом руководстве вы узнаете, как использовать ESP32 Bluetooth Classic с Arduino IDE для обмена данными между ESP32 и Android-смартфоном.
Мы будем управлять выходом ESP32 и отправлять показания датчиков на Android-смартфон с помощью Bluetooth Classic.
Примечание
Этот проект совместим только с Android-смартфонами.
Смотрите видеоурок
Вы можете посмотреть видеоурок или продолжить чтение этой страницы для получения письменных инструкций.
Bluetooth Classic с ESP32
На данный момент использование Bluetooth Classic значительно проще, чем Bluetooth Low Energy. Если вы уже программировали Arduino с Bluetooth-модулем типа HC-06, то это очень похоже. Он использует стандартный последовательный протокол и функции.
В этом руководстве мы начнём с использования примера, который поставляется с Arduino IDE. Затем мы создадим простой проект для обмена данными между ESP32 и вашим Android-смартфоном.
Необходимые компоненты
Для выполнения этого руководства вам понадобятся следующие компоненты:
ESP32 DOIT DEVKIT V1 Board (см. Лучшие платы для разработки на ESP32)
Android-смартфон с Bluetooth
Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Приложение Bluetooth Terminal
Для продолжения работы с этим руководством вам необходимо установить приложение Bluetooth Terminal на свой смартфон.
Мы рекомендуем использовать Android-приложение «Serial Bluetooth Terminal», доступное в Play Store.
Serial to Serial Bluetooth
Мы будем программировать ESP32 с помощью Arduino IDE, поэтому убедитесь, что у вас установлено дополнение ESP32, прежде чем продолжить:
Mac и Linux: инструкции – ESP32 Board в Arduino IDE
Откройте Arduino IDE и перейдите в File > Examples > BluetoothSerial > SerialtoSerialBT.
Должен загрузиться следующий код.
//This example code is in the Public Domain (or CC0 licensed, at your option.)
//By Evandro Copercini - 2018
//
//This example creates a bridge between Serial and Classical Bluetooth (SPP)
//and also demonstrate that SerialBT have the same functionalities of a normal Serial
#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
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);
}
Как работает код
Этот код устанавливает двустороннюю последовательную Bluetooth-связь между двумя устройствами.
Код начинается с подключения библиотеки BluetoothSerial.
#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
Затем создайте экземпляр BluetoothSerial с именем SerialBT:
BluetoothSerial SerialBT;
setup()
В setup() инициализируйте последовательное соединение со скоростью 115200 бод.
Serial.begin(115200);
Инициализируйте последовательное Bluetooth-устройство и передайте в качестве аргумента имя Bluetooth-устройства. По умолчанию оно называется ESP32test, но вы можете переименовать его и дать ему уникальное имя.
SerialBT.begin("ESP32test"); //Bluetooth device name
loop()
В loop() отправляйте и получайте данные через Bluetooth Serial.
В первом операторе if мы проверяем, есть ли байты, получаемые через последовательный порт. Если есть, отправляем эту информацию через Bluetooth на подключённое устройство.
if (Serial.available()) {
SerialBT.write(Serial.read());
}
SerialBT.write() отправляет данные через Bluetooth Serial.
Serial.read() возвращает данные, полученные через последовательный порт.
Следующий оператор if проверяет, есть ли доступные для чтения байты в Bluetooth Serial порте. Если есть, мы записываем эти байты в Serial Monitor.
if (SerialBT.available()) {
Serial.write(SerialBT.read());
}
Будет легче понять, как именно работает этот скетч, при демонстрации.
Тестирование кода
Загрузите предыдущий код в ESP32. Убедитесь, что выбраны правильная плата и COM-порт.
После загрузки кода откройте Serial Monitor на скорости 115200 бод. Нажмите кнопку Enable на ESP32.
Через несколько секунд вы должны увидеть сообщение: «The device started, now you can pair it with bluetooth!».
Перейдите на свой смартфон и откройте приложение «Serial Bluetooth Terminal». Убедитесь, что Bluetooth на вашем смартфоне включен.
Чтобы подключиться к ESP32 в первый раз, вам нужно выполнить сопряжение с новым устройством.
Перейдите в Devices.
Нажмите на значок настроек и выберите Pair new device. Вы должны увидеть список доступных Bluetooth-устройств, включая ESP32test. Выполните сопряжение с ESP32test.
Затем вернитесь в Serial Bluetooth Terminal. Нажмите на значок вверху, чтобы подключиться к ESP32. Вы должны увидеть сообщение «Connected».
После этого введите что-нибудь в приложении Serial Bluetooth Terminal. Например, «Hello».
Вы должны мгновенно получить это сообщение в Serial Monitor Arduino IDE.
Вы также можете обмениваться данными между Serial Monitor и вашим смартфоном. Введите что-нибудь в верхней строке Serial Monitor и нажмите кнопку «Send».
Вы должны мгновенно получить это сообщение в приложении Serial Bluetooth Terminal.
Обмен данными через Bluetooth Serial
Теперь, когда вы знаете, как обмениваться данными через Bluetooth Serial, вы можете модифицировать предыдущий скетч, чтобы сделать что-то полезное. Например, управлять выходами ESP32 при получении определённого сообщения или отправлять данные на смартфон, такие как показания датчиков.
Проект, который мы создадим, будет отправлять показания температуры каждые 10 секунд на ваш смартфон. Мы будем использовать датчик температуры DS18B20.
Через Android-приложение мы будем отправлять сообщения для управления выходом ESP32. Когда ESP32 получает сообщение led_on, мы включаем GPIO, когда получает сообщение led_off, мы выключаем GPIO.
Схема подключения
Перед началом работы над этим проектом соберите схему по следующей электрической схеме.
Подключите светодиод к GPIO25, а вывод данных DS18B20 подключите к GPIO32.
Рекомендуемое чтение: Распиновка ESP32: Какие GPIO-выводы использовать?
Код
Для работы с датчиком температуры DS18B20 вам необходимо установить библиотеку One Wire от Paul Stoffregen и библиотеку Dallas Temperature. Следуйте приведённым ниже инструкциям для установки этих библиотек, если вы ещё этого не сделали.
Библиотека One Wire
Нажмите здесь, чтобы скачать библиотеку One Wire. У вас должен появиться .zip-файл в папке загрузок
Распакуйте .zip-файл, и вы должны получить папку OneWire-master
Переименуйте папку из OneWire-master в OneWire
Переместите папку OneWire в папку libraries вашей установки Arduino IDE
Наконец, перезапустите Arduino IDE
Библиотека Dallas Temperature
Нажмите здесь, чтобы скачать библиотеку Dallas Temperature. У вас должен появиться .zip-файл в папке загрузок
Распакуйте .zip-файл, и вы должны получить папку Arduino-Temperature-Control-Library-master
Переименуйте папку из Arduino-Temperature-Control-Library-master в DallasTemperature
Переместите папку DallasTemperature в папку libraries вашей установки Arduino IDE
Наконец, перезапустите Arduino IDE
После сборки схемы и установки необходимых библиотек скопируйте следующий скетч в Arduino IDE.
/*********
Rui Santos
Complete project details at https://randomnerdtutorials.com
*********/
// Load libraries
#include "BluetoothSerial.h"
#include <OneWire.h>
#include <DallasTemperature.h>
// Check if Bluetooth configs are enabled
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif
// Bluetooth Serial object
BluetoothSerial SerialBT;
// GPIO where LED is connected to
const int ledPin = 25;
// GPIO where the DS18B20 is connected to
const int oneWireBus = 32;
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);
// Handle received and sent messages
String message = "";
char incomingChar;
String temperatureString = "";
// Timer: auxiliar variables
unsigned long previousMillis = 0; // Stores last time temperature was published
const long interval = 10000; // interval at which to publish sensor readings
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(115200);
// Bluetooth device name
SerialBT.begin("ESP32");
Serial.println("The device started, now you can pair it with bluetooth!");
}
void loop() {
unsigned long currentMillis = millis();
// Send temperature readings
if (currentMillis - previousMillis >= interval){
previousMillis = currentMillis;
sensors.requestTemperatures();
temperatureString = String(sensors.getTempCByIndex(0)) + "C " + String(sensors.getTempFByIndex(0)) + "F";
SerialBT.println(temperatureString);
}
// Read received messages (LED control command)
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 =="led_on"){
digitalWrite(ledPin, HIGH);
}
else if (message =="led_off"){
digitalWrite(ledPin, LOW);
}
delay(20);
}
Как работает код
Давайте быстро рассмотрим код и посмотрим, как он работает.
Начнём с подключения необходимых библиотек. Библиотека BluetoothSerial для Bluetooth, а OneWire и DallasTemperature для датчика температуры DS18B20.
#include "BluetoothSerial.h"
#include <OneWire.h>
#include <DallasTemperature.h>
Создайте экземпляр BluetoothSerial с именем SerialBT.
BluetoothSerial SerialBT;
Создайте переменную ledPin для хранения номера GPIO, которым вы хотите управлять. В данном случае к GPIO25 подключён светодиод.
const int ledPin = 25;
Определите пин датчика DS18B20 и создайте объекты для его работы. Датчик температуры подключён к GPIO32.
// GPIO where the DS18B20 is connected to
const int oneWireBus = 32;
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);
Создайте пустую строку message для хранения полученных сообщений.
String message = "";
Создайте переменную типа char с именем incomingChar для сохранения символов, поступающих через Bluetooth Serial.
char incomingChar;
Переменная temperatureString хранит показания температуры для отправки через Bluetooth.
String temperatureString = "";
Создайте вспомогательные переменные таймера для отправки показаний каждые 10 секунд.
unsigned long previousMillis = 0; // Stores last time temperature was published
const long interval = 10000; // interval at which to publish sensor readings
setup()
В setup() установите ledPin как выход.
pinMode(ledPin, OUTPUT);
Инициализируйте ESP32 как Bluetooth-устройство с именем «ESP32».
SerialBT.begin("ESP32"); //Bluetooth device name
loop()
В loop() отправляйте показания температуры, читайте полученные сообщения и выполняйте соответствующие действия.
Следующий фрагмент кода проверяет, прошло ли 10 секунд с момента последнего считывания. Если пришло время отправить новое показание, мы получаем последнюю температуру и сохраняем её в градусах Цельсия и Фаренгейта в переменной temperatureString.
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
sensors.requestTemperatures();
temperatureString = " " + String(sensors.getTempCByIndex(0)) + "C " + String(sensors.getTempFByIndex(0)) + "F";
Затем, чтобы отправить temperatureString через Bluetooth, используйте SerialBT.println().
SerialBT.println(temperatureString);
Следующий оператор if читает входящие сообщения. Когда вы получаете сообщения через serial, вы получаете по одному символу за раз. Вы знаете, что сообщение закончилось, когда получаете \n.
Итак, мы проверяем, есть ли доступные данные в Bluetooth serial порте.
if (SerialBT.available()) {
Если есть, мы сохраняем символы в переменной incomingChar.
char incomingChar = SerialBT.read();
Если incomingChar отличается от \n, мы добавляем этот символ к нашему сообщению.
if (incomingChar!= '\n'){
message += String(incomingChar);
}
Когда мы заканчиваем чтение символов, мы очищаем переменную message. В противном случае все полученные сообщения будут добавляться друг к другу.
message = "";
После этого у нас есть два оператора if для проверки содержимого сообщения. Если сообщение – led_on, светодиод включается.
if (message =="led_on"){
digitalWrite(ledPin, HIGH);
}
Если сообщение – led_off, светодиод выключается.
else if (message =="led_off"){
digitalWrite(ledPin, LOW);
}
Тестирование проекта
Загрузите предыдущий скетч на вашу плату ESP32. Затем откройте Serial Monitor и нажмите кнопку Enable на ESP32. Когда вы получите следующее сообщение, вы можете перейти к смартфону и подключиться к ESP32.
Затем вы можете написать сообщения «led_on» и «led_off» для управления светодиодом.
В приложении есть несколько кнопок, в которых вы можете сохранить сообщения по умолчанию. Например, вы можете связать M1 с сообщением «led_on», а M2 с сообщением «led_off».
Теперь вы можете управлять GPIO ESP32.
В то же время вы должны получать показания температуры каждые 10 секунд.
Заключение
Подводя итог, ESP32 поддерживает BLE и Bluetooth Classic. Использование Bluetooth Classic так же просто, как использование последовательной связи и её функций.
Если вы хотите узнать, как использовать BLE с ESP32, вы можете прочитать наше руководство:
Мы надеемся, что это руководство оказалось для вас полезным. Для получения дополнительных проектов с ESP32 вы можете ознакомиться с нашей подборкой проектов: 20+ проектов и руководств для ESP32.
Это руководство является предварительным просмотром курса «Learn ESP32 with Arduino IDE». Если вам понравился этот проект, обязательно ознакомьтесь со страницей курса ESP32, где мы рассматриваем эту и многие другие темы, связанные с ESP32.
Источник: ESP32 Bluetooth Classic with Arduino IDE – Getting Started