ESP32-S3 控制 蓝牙
ESP32-S3 蓝牙实验 —— 手机控制 LED
本实验通过 ESP32-S3 蓝牙 实现手机控制 LED 灯开关。
通过手机安装蓝牙串口调试软件发送命令 "on" 或 "off" 控制 LED 灯亮灭。
一、实验名称
蓝牙实验
二、接线说明
| 设备 | ESP32-S3 引脚 |
|---|---|
| LED模块 D1 | 3 |
三、实验现象
- 程序下载成功后,ESP32-S3 作为 BLE 设备广播,蓝牙名称为
"ESP32test"。 - 手机安装蓝牙串口调试助手 APK,打开软件并连接 ESP32 蓝牙。
- 发送字符串
"on"或"off",控制开发板 LED 灯开关。
四、注意事项
- 确保手机和 ESP32 在可连接蓝牙范围内。
- 蓝牙串口调试助手可在工程目录找到 APK 文件。
- BLE UUID 已在代码中指定,开发者无需修改即可运行。
五、完整代码示例
#include "public.h"
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
// LED1 引脚定义
#define LED1 3
BLEServer *pServer = NULL;
BLECharacteristic * pTxCharacteristic;
bool deviceConnected = false;
bool oldDeviceConnected = false;
uint8_t txValue = 0;
// BLE 服务 UUID 和特征 UUID
#define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART service UUID
#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"
// BLE 服务器回调
class MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) { deviceConnected = true; };
void onDisconnect(BLEServer* pServer) { deviceConnected = false; };
};
// BLE 特征回调
class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string rxValue = pCharacteristic->getValue();
if (rxValue.length() > 0) {
Serial.println("*********");
Serial.print("Received Value: ");
for (int i = 0; i < rxValue.length(); i++)
Serial.print(rxValue[i]);
Serial.println();
Serial.println("*********");
// 根据接收值控制 LED
if(rxValue[0]=='o' && rxValue[1]=='n')
digitalWrite(LED1, HIGH); // 点亮 LED
else if(rxValue[0]=='o' && rxValue[1]=='f' && rxValue[2]=='f')
digitalWrite(LED1, LOW); // 熄灭 LED
}
}
};
void setup() {
Serial.begin(115200);
pinMode(LED1, OUTPUT); // 设置 LED 引脚为输出
// 初始化 BLE
BLEDevice::init("ESP32test");
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
// 创建 BLE 服务
BLEService *pService = pServer->createService(SERVICE_UUID);
// 创建 BLE 特征
pTxCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID_TX,
BLECharacteristic::PROPERTY_NOTIFY
);
pTxCharacteristic->addDescriptor(new BLE2902());
BLECharacteristic * pRxCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID_RX,
BLECharacteristic::PROPERTY_WRITE
);
pRxCharacteristic->setCallbacks(new MyCallbacks());
// 启动服务
pService->start();
// 开始广播
pServer->getAdvertising()->start();
Serial.println("Waiting a client connection to notify...");
}
void loop() {
if (deviceConnected) {
pTxCharacteristic->setValue(&txValue, 1);
pTxCharacteristic->notify();
txValue++;
delay(10); // 避免蓝牙栈拥塞
}
// 处理断开连接
if (!deviceConnected && oldDeviceConnected) {
delay(500);
pServer->startAdvertising();
Serial.println("start advertising");
oldDeviceConnected = deviceConnected;
}
// 处理新连接
if (deviceConnected && !oldDeviceConnected) {
oldDeviceConnected = deviceConnected;
}
}
六、代码讲解
- BLE 初始化
BLEDevice::init("ESP32test");
pServer = BLEDevice::createServer();
- 设置 ESP32 蓝牙名称,创建 BLE 服务器。
- 创建服务与特征
BLEService *pService = pServer->createService(SERVICE_UUID);
SERVICE_UUID:定义 BLE 服务。CHARACTERISTIC_UUID_RX:接收手机数据。CHARACTERISTIC_UUID_TX:向手机发送数据。
- 回调处理
pRxCharacteristic->setCallbacks(new MyCallbacks());
- 当手机发送数据时,通过
onWrite()回调处理,解析"on"或"off"控制 LED。
- 蓝牙连接状态
deviceConnected和oldDeviceConnected用于判断连接状态,自动重新广播。
七、实验效果
- ESP32-S3 广播 BLE 蓝牙
"ESP32test"。 - 手机连接蓝牙并发送
"on":LED 灯点亮。 - 手机发送
"off":LED 灯熄灭。 - 串口监控打印接收字符串和状态。
八、总结
本实验学习了:
- ESP32-S3 BLE 初始化与服务创建
- 手机通过 BLE 控制开发板 LED
- BLE 特征回调处理数据
- 自动处理蓝牙连接/断开状态
这是学习 蓝牙智能控制 和 物联网项目 的重要基础。

浙公网安备 33010602011771号