ESP32-S3 控制 蓝牙

ESP32-S3 蓝牙实验 —— 手机控制 LED

本实验通过 ESP32-S3 蓝牙 实现手机控制 LED 灯开关。

通过手机安装蓝牙串口调试软件发送命令 "on""off" 控制 LED 灯亮灭。


一、实验名称

蓝牙实验


二、接线说明

设备 ESP32-S3 引脚
LED模块 D1 3

三、实验现象

  1. 程序下载成功后,ESP32-S3 作为 BLE 设备广播,蓝牙名称为 "ESP32test"
  2. 手机安装蓝牙串口调试助手 APK,打开软件并连接 ESP32 蓝牙。
  3. 发送字符串 "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;
    }
}

六、代码讲解

  1. BLE 初始化
BLEDevice::init("ESP32test");
pServer = BLEDevice::createServer();
  • 设置 ESP32 蓝牙名称,创建 BLE 服务器。
  1. 创建服务与特征
BLEService *pService = pServer->createService(SERVICE_UUID);
  • SERVICE_UUID:定义 BLE 服务。
  • CHARACTERISTIC_UUID_RX:接收手机数据。
  • CHARACTERISTIC_UUID_TX:向手机发送数据。
  1. 回调处理
pRxCharacteristic->setCallbacks(new MyCallbacks());
  • 当手机发送数据时,通过 onWrite() 回调处理,解析 "on""off" 控制 LED。
  1. 蓝牙连接状态
  • deviceConnectedoldDeviceConnected 用于判断连接状态,自动重新广播。

七、实验效果

  1. ESP32-S3 广播 BLE 蓝牙 "ESP32test"
  2. 手机连接蓝牙并发送 "on":LED 灯点亮。
  3. 手机发送 "off":LED 灯熄灭。
  4. 串口监控打印接收字符串和状态。

八、总结

本实验学习了:

  • ESP32-S3 BLE 初始化与服务创建
  • 手机通过 BLE 控制开发板 LED
  • BLE 特征回调处理数据
  • 自动处理蓝牙连接/断开状态

这是学习 蓝牙智能控制物联网项目 的重要基础。

posted @ 2025-08-16 15:25  jeikerxiao  阅读(399)  评论(0)    收藏  举报