淘宝购买的ESP32-S3-DevKitC-1,根据官网的教程学习

一、模块简介

此模块有WiFi+BLT两大功能
在这里插入图片描述
引脚功能定义参考ESP32-S3硬件

WiFi功能
在这里插入图片描述
蓝牙功能
在这里插入图片描述
有 ESP-Bluedroid 和 ESP-NimBLE 两个主机,其主要区别如下:
虽然两者都支持低功耗蓝牙,但 ESP-NimBLE 需要的堆和 flash 空间更少

二、Arduino开发

2.1下载Arduino

有两个版本,一个免安装的压缩包,一个安装文件,都一样。

2.2 安装ESP32开发板包

打开软件,下载ESP32对应的开发板包,选择对应的设备型号
1.如果找到合适的json文件添加到下载失败说明网络不好,需要挂梯子

https://dl.espressif.com/dl/package_esp32_index.json,
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json, https://arduino.esp8266.com/stable/package_esp8266com_index.json
https://static-cdn.m5stack.com/resource/arduino/package_m5stack_index.json

在这里插入图片描述

2.在github上下载esp的包,手动安装到arduino的设备目录下
github下载链接

https://github.com/espressif/arduino-esp32?tab=readme-ov-file

在这里插入图片描述
在C盘安装的用户目录下,新建文件夹并添加文件。在hardware下新建esp32还有packet对应版本的文件(上面的3.2.0,新建文件夹要对应)

C:\Users\a8344\AppData\Local\Arduino15\packages\arduino\hardware\esp32\3.2.0

解压包后复制文件到3.2.0中,重启Arduino
在这里插入图片描述

就可以在开发板中选择ESP32-S3了
在这里插入图片描述

在这里插入图片描述
测试,使用USB连接开发板,编写代码运行

2.3 Arduino简单了解

主要函数
在这里插入图片描述
下载外设驱动
搜索需要的外设并下载安装
在这里插入图片描述

2.4 问题,安装3.2.0无法编译程序

解决方案,修改ESP32的开发板包,修改到稳定版本2.6.0
下载工具一键配置esp32_package_2.0.9_arduinome.exe
可以正常使用

三、ESP32-S3低功耗蓝牙原理

3.1 蓝牙简介

蓝牙是现在非常常用的一种无线通讯技术,ESP32集成了蓝牙功能
在这里插入图片描述
蓝牙区别
在这里插入图片描述

3.2 ESP32-S3蓝牙架构

低功耗蓝牙 (Bluetooth Low Energy, Bluetooth LE)
参考链接乐鑫
在这里插入图片描述
Bluetooth LE 的分层架构
在这里插入图片描述
主机层协议

  • GAP 层 - 定义设备的连接
    在这里插入图片描述
  • GATT/ATT 层 - 数据表示与交换
    – ATT 的全称是属性协议 (Attribute Protocol, ATT),定义了一种称为属性 (Attribute) 的基本数据结构,以及基于服务器/客户端架构的数据访问方式
    – GATT 的全称是通用属性规范 (Generic Attribute Profile)

即,设备通过GAP连接,GATT交换数据实现通信
在这里插入图片描述

3.3 ESP32-S3设备发现

广播 (Advertising) 与扫描 (Scanning) 是 Bluetooth LE 设备在进入连接前在设备发现 (Device Discovery) 阶段的工作状态
在这里插入图片描述

广播
  • 广播数据包发送频段 2.4 GHz ISM 频段
  • 2.4 GHz ISM 频段非常拥挤可能会与其他无线通信协议发生数据冲突,如 2.4 GHz WiFi
  • Bluetooth LE 上也应用了自适应跳频技术 (Adaptive Frequency Hopping, AFH) ,会自动判断RF信道拥挤程度,自动跳频
    在这里插入图片描述
  • 扩展广播 蓝牙 5.0 标准引入了 扩展广播 (Extended Advertising) 特性 扩展数据包
    在这里插入图片描述
  • 广播间隔 广播间隔 (Advertising Interval)。广播间隔可取的范围为 20 ms 到 10.24 s ,取值步长为 0.625 ms
  • 广播数据包 预置码+访问地址+协议数据单元+循环冗余校验和

广播数据包
详解
在这里插入图片描述
协议数据单元PDU
在这里插入图片描述

扫描
  • 广播者只会在广播信道,即编号为 37-39 的三个信道发送广播数据 在对应的通道去扫描
  • 广播者启用了扩展广播特性,则会在主广播信道发送 ADV_EXT_IND ,在次广播信道发送 AUX_ADV_IND ,并在 ADV_EXT_IND 指示 AUX_ADV_IND 所在的次广播信道
  • 扫描窗口与扫描间隔
    在这里插入图片描述
  • 扫描请求与扫描响应
    在这里插入图片描述
3.4 连接
  • 发起连接
    在这里插入图片描述
  • 连接间隔:中央设备与外围设备会周期性地进行数据交换,这个数据交换的周期被称为连接间隔 (Connection Interval)
  • 连接事件
    在这里插入图片描述
    在这里插入图片描述
  • 连接参数:超时参数、外围设备延迟、最大传输单元
    在这里插入图片描述
  • MTU:最大传输单元 (Maximum Transmission Unit, MTU) 指的是单个 ATT 数据包的最大字节数
    在这里插入图片描述
3.5 数据交换

GATT 服务是 Bluetooth LE 连接中两个设备进行数据交换的基础设施,其最小数据单元是属性
在这里插入图片描述

Bluetooth LE 中存在两种类型的 UUID ,如下

SIG 定义的 16 位 UUID
厂商自定义的 128 位 UUID

在这里插入图片描述
特征数据声明和特征数据值
eg:UUID0x2803是0x2A37的特征数据声明,包含0x2A37的信息
在这里插入图片描述
特征数据描述符
特征数据描述符起到对特征数据进行补充说明的作用。最常见的特征数据描述符是客户端特征数据配置描述符 (Client Characteristic Configuration Descriptor, CCCD),下由 CCCD 代指。当特征数据支持由服务器端发起的 数据操作 (通知或指示)时,必须使用 CCCD 描述相关信息;这是一个可读写属性,用于 GATT 客户端告知服务器是否需要启用通知或指示,写值操作也被称为订阅 (Subscribe) 或取消订阅

3.5 服务

在这里插入图片描述

属性表解析
在这里插入图片描述
GATT数据操作
客户端:

  • 写(无需响应)
    服务端:
  • 通知
  • 指示

四、Arduino开发ESP32-S3

4.1工程准备

安装Arduino软件以及开发板包(2.0.6)
学习蓝牙串口接收与发送,可以自由控制蓝牙,使用手机蓝牙与S3交互

4.2

使用 BLEDevice.h作为核心驱动,开发本工程
不能使用#include <BluetoothSerial.h>,原因esp32s3芯片只支持BLE低功耗蓝牙

#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>

// 定义BLE服务和特征UUID
#define SERVICE_UUID           "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART服务UUID
#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E" // 接收特征UUID
#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E" // 发送特征UUID

// 定义BLE对象
BLEServer *pServer = NULL;
BLECharacteristic *pTxCharacteristic;
BLEService *pService;

// 设备连接状态
bool deviceConnected = false;
bool oldDeviceConnected = false;

// 接收数据的回调类
class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      deviceConnected = true;
      Serial.println("设备已连接");
    };

    void onDisconnect(BLEServer* pServer) {
      deviceConnected = false;
      Serial.println("设备已断开连接");
    }
};

// 接收特征的回调类
class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string rxValue = pCharacteristic->getValue();

      if (rxValue.length() > 0) {
        Serial.print("蓝牙接收: ");
        for (int i = 0; i < rxValue.length(); i++) {
          Serial.print(rxValue[i]);
        }
        Serial.println();
      }
    }
};

void setup() {
  // 初始化串口通信
  Serial.begin(115200);
  Serial.println("ESP32-S3 BLE串口程序启动");

  // 初始化BLE设备
  BLEDevice::init("ESP32-S3"); // 设置BLE设备名称

  // 创建BLE服务器
  pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());

  // 创建BLE服务
  pService = pServer->createService(SERVICE_UUID);

  // 创建发送特征
  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("等待客户端连接...");
}

void loop() {
  // 处理设备连接状态变化
  if (!deviceConnected && oldDeviceConnected) {
    delay(500); // 给蓝牙栈一个时间
    pServer->startAdvertising(); // 重新开始广播
    Serial.println("开始广播");
    oldDeviceConnected = deviceConnected;
  }
  
  if (deviceConnected && !oldDeviceConnected) {
    oldDeviceConnected = deviceConnected;
  }

  // 检查串口是否有数据输入
  if (Serial.available()) {
    String input = Serial.readString();
    Serial.print("串口接收并已转发: ");
    Serial.println(input);
    
    // 通过BLE发送数据
    if (deviceConnected) {
      pTxCharacteristic->setValue(input.c_str());
      pTxCharacteristic->notify();
    }
  }

  delay(10); // 延迟以减少CPU使用率
}

在这里插入图片描述
在对应服务打开 WRITE 与 NOTIFY可实现与蓝牙通信

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐