ESP32-S3-DevKitC-1使用
此模块有WiFi+BLT两大功能引脚功能定义参考ESP32-S3硬件WiFi功能蓝牙功能有 ESP-Bluedroid 和 ESP-NimBLE 两个主机,其主要区别如下:虽然两者都支持低功耗蓝牙,但 ESP-NimBLE 需要的堆和 flash 空间更少蓝牙是现在非常常用的一种无线通讯技术,ESP32集成了蓝牙功能蓝牙区别。
淘宝购买的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可实现与蓝牙通信
更多推荐



所有评论(0)