当前目录:
D:\esp32s3
已经完成从旧项目:
D:\esp32\tb6612-ultrasonic-demo
到新开发板 ESP32-S3 的基础迁移。
当前迁移内容包括:
1. TB6612 超声驱动主程序已迁移
2. BLE GATT 控制通道已加入
3. 内置 PCM 音频数组已迁移
4. GPIO 已按 ESP32-S3 重新分配
5. README 已按你确认过的引脚规则重新整理
6. 闹钟 / 预设 / Wi‑Fi / NTP 骨架已加入
当前程序仍然保留这些模式:
off
carrier
tone
visible
melody
preset
当前产品化功能包括:
ESP32-S3 输出单路互补 40kHz
TB6612 A 路作为单路 H 桥驱动
PWM 使能脚做包络门控
可输出纯载波、单音、旋律和内置音频包络
BLE 小程序控制
闹钟配置与触发
Wi‑Fi 配网与自动重连
NTP 校时骨架
标准化事件 / 错误返回
固定状态字段 schema
为了新板上电更安全,当前版本默认行为已经改为:
上电默认 off
也就是:
启动后先不自动发超声
需要你在串口输入命令再启动输出
这和旧项目默认上电 melody 不同,是这次迁移里我主动做的安全调整。
本次迁移采用下面这组控制脚:
#define TB6612_IN1_GPIO GPIO_NUM_4
#define TB6612_IN2_GPIO GPIO_NUM_5
#define TB6612_PWM_ENABLE_GPIO GPIO_NUM_6
#define TB6612_STBY_GPIO GPIO_NUM_7含义:
| ESP32-S3 GPIO | 作用 |
|---|---|
| GPIO4 | 40kHz 正相信号 |
| GPIO5 | 40kHz 反相信号 |
| GPIO6 | TB6612 使能 / 包络门控 |
| GPIO7 | TB6612 待机控制 |
这组脚的优点是:
避开了 GPIO34-GPIO37 的 Flash/PSRAM 专用脚
避开了 GPIO43/GPIO44 的串口灯相关脚
避开了 GPIO47/GPIO48 的 USB / RGB 相关脚
避开了 GPIO0/GPIO45/GPIO46 的启动配置脚
连续、好接、便于排查
这部分按你确认过的规则整理。
前提:
以开发板正面为准
USB 口朝下
每一侧从上到下编号
| 左22 引脚号 | 信号 |
|---|---|
| 1 | 3V3 |
| 2 | 3V3 |
| 3 | RST |
| 4 | GPIO4 |
| 5 | GPIO5 |
| 6 | GPIO6 |
| 7 | GPIO7 |
| 8 | GPIO15 |
| 9 | GPIO16 |
| 10 | GPIO17 |
| 11 | GPIO18 |
| 12 | GPIO8 |
| 13 | GPIO3 |
| 14 | GPIO46 |
| 15 | GPIO9 |
| 16 | GPIO10 |
| 17 | GPIO11 |
| 18 | GPIO12 |
| 19 | GPIO13 |
| 20 | GPIO14 |
| 21 | 5V0 |
| 22 | GND |
| 右22 引脚号 | 信号 |
|---|---|
| 1 | GND |
| 2 | GPIO43 |
| 3 | GPIO44 |
| 4 | GPIO1 |
| 5 | GPIO2 |
| 6 | GPIO42 |
| 7 | GPIO41 |
| 8 | GPIO40 |
| 9 | GPIO39 |
| 10 | GPIO38 |
| 11 | GPIO37 |
| 12 | GPIO36 |
| 13 | GPIO35 |
| 14 | GPIO0 |
| 15 | GPIO45 |
| 16 | GPIO48 |
| 17 | GPIO47 |
| 18 | GPIO21 |
| 19 | GPIO20 |
| 20 | GPIO19 |
| 21 | GND |
| 22 | GND |
为了避免 TB6612 正反面丝印导致左右混淆,后面统一不用“左排/右排”描述,而是只用:
TB6612_控制侧
TB6612_功率侧
从上到下:
| 控制侧引脚号 | 信号 |
|---|---|
| 1 | PWMA |
| 2 | AIN2 |
| 3 | AIN1 |
| 4 | STBY |
| 5 | BIN1 |
| 6 | BIN2 |
| 7 | PWMB |
| 8 | GND |
从上到下:
| 功率侧引脚号 | 信号 |
|---|---|
| 1 | VM |
| 2 | VCC |
| 3 | GND |
| 4 | AO1 |
| 5 | AO2 |
| 6 | BO2 |
| 7 | BO1 |
| 8 | GND |
当前版本按“单路超声输出”设计,只使用 TB6612 的 A 路。
也就是:
只接 AIN1 / AIN2 / PWMA / STBY
只用 AO1 / AO2 驱动 1 路超声探头或 1 组并联探头
不使用 BIN1 / BIN2 / PWMB / BO1 / BO2
| ESP32-S3 排针 | 信号 | 接到 TB6612 | 说明 |
|---|---|---|---|
| 左22-4 | GPIO4 | 控制侧-3 AIN1 | 40kHz 正相 |
| 左22-5 | GPIO5 | 控制侧-2 AIN2 | 40kHz 反相 |
| 左22-6 | GPIO6 | 控制侧-1 PWMA | 使能 / 包络门控 |
| 左22-7 | GPIO7 | 控制侧-4 STBY | 待机控制 |
| 左22-1 或 左22-2 | 3V3 | 功率侧-2 VCC | TB6612 逻辑电源 |
| 左22-22 或 右22-1/21/22 | GND | 功率侧-3 GND 或 控制侧-8 GND | 共地 |
当前单路版本只接 A 路:
| ESP32-S3 GPIO | TB6612 信号 |
|---|---|
| GPIO4 | AIN1 |
| GPIO5 | AIN2 |
| GPIO6 | PWMA |
| GPIO7 | STBY |
| 信号 | 接法 |
|---|---|
| 外部电源正极 | 功率侧-1 VM |
| 外部电源负极 | 功率侧-3 GND 或 功率侧-8 GND |
| 超声探头两端 | 功率侧-4 AO1 与 功率侧-5 AO2 |
| BO1 / BO2 | 当前不接 |
如果你现在只接 1 块 TB6612,直接照下面接就行:
ESP32-S3 左22-4 GPIO4 -> TB6612 AIN1
ESP32-S3 左22-5 GPIO5 -> TB6612 AIN2
ESP32-S3 左22-6 GPIO6 -> TB6612 PWMA
ESP32-S3 左22-7 GPIO7 -> TB6612 STBY
ESP32-S3 3V3 -> TB6612 VCC
ESP32-S3 GND -> TB6612 GND
外部电源 + -> TB6612 VM
外部电源 - -> TB6612 GND
超声探头 -> AO1 + AO2
这一条必须满足:
ESP32-S3 GND
TB6612 GND
外部电源负极
必须连在一起。
否则 TB6612 可能无法正确识别 ESP32-S3 的控制电平。
推荐先这样试:
TB6612 VCC = ESP32-S3 3.3V
TB6612 VM = 外部 5V
稳定后再尝试:
9V
12V
但不要让大功率负载直接从开发板 5V 输出端硬带。
GPIO34-GPIO37:Flash / PSRAM 专用
GPIO43/GPIO44:串口灯相关
GPIO47/GPIO48:USB / RGB 相关
GPIO0/GPIO45/GPIO46:启动配置脚
如果后续需要模拟采样:
Wi‑Fi 开启时不要依赖 ADC2
优先使用 ADC1
开发板 5V-IN 默认不对外供电。
如果你需要 5V 外供,需要按板上焊盘规则处理,但不建议拿它去直接带功率负载。
SleepLamp-Ultrasonic
| 名称 | UUID | 方向 |
|---|---|---|
| Service | 7f2a0000-8f6d-4f4b-9f3a-2f5d6a000001 |
Primary |
| Command | 7f2a0001-8f6d-4f4b-9f3a-2f5d6a000001 |
App -> Device |
| Status | 7f2a0002-8f6d-4f4b-9f3a-2f5d6a000001 |
Device -> App |
| Wi‑Fi Config | 7f2a0003-8f6d-4f4b-9f3a-2f5d6a000001 |
App -> Device |
| Log/Event | 7f2a0004-8f6d-4f4b-9f3a-2f5d6a000001 |
Device -> App |
控制:
{"type":"set_mode","mode":"carrier"}
{"type":"set_mode","mode":"tone","tone_hz":1000}
{"type":"set_carrier","carrier_hz":40000}
{"type":"set_tone","tone_hz":523}
{"type":"set_duty","duty_low":20,"duty_center":50,"duty_high":80}
{"type":"set_output_profile","profile":"normal"}
{"type":"play_preset","preset":"wake_01"}
{"type":"stop_preset"}
{"type":"stop"}
{"type":"get_status"}闹钟:
{"type":"set_alarm","alarm_id":"a1","time":"07:30","enabled":true,"repeat":"daily","preset":"wake_01","profile":"normal"}
{"type":"get_alarm_list"}
{"type":"delete_alarm","alarm_id":"a1"}Wi‑Fi:
{"type":"wifi_config","ssid":"YourWiFi","password":"12345678"}
{"type":"wifi_clear"}| preset | 行为 |
|---|---|
wake_01 |
播放内置 PCM 音频一次 |
sleep_01 |
进入旋律模式 |
chime_01 |
输出 523Hz 包络提示音 |
当前状态 JSON 中包含:
fw_version
device_role
active_preset
alarm_count
next_alarm_time
wifi_state
ssid
ip
time_synced
output_profile
| 文件 | 作用 |
|---|---|
| main/tb6612_ultrasonic_demo.c | 主程序 |
| main/audio_clip.c | 内置 PCM 音频数组 |
| main/audio_clip.h | 音频数组声明 |
| main/CMakeLists.txt | main 组件配置 |
| CMakeLists.txt | 工程顶层配置 |
| sdkconfig.defaults | 默认 BLE 配置 |
这台机器上实际验证通过的方法如下。
当前机器不能直接裸跑 idf.py,需要先把环境变量指到实际安装位置:
$env:IDF_PATH='D:\esp\v6.0.1\esp-idf'
$env:IDF_TOOLS_PATH='C:\Espressif\tools'
$env:IDF_PYTHON_ENV_PATH='C:\Espressif\tools\python\v6.0.1\venv'
$env:ESP_IDF_VERSION='6.0.1'
$env:PATH='C:\Espressif\tools\python\v6.0.1\venv\Scripts;C:\Espressif\tools\cmake\4.0.3\bin;C:\Espressif\tools\ninja\1.12.1;C:\Espressif\tools\xtensa-esp-elf\esp-15.2.0_20251204\xtensa-esp-elf\bin;' + $env:PATHcd D:\esp32s3
if (Test-Path .\build) { Remove-Item -LiteralPath .\build -Recurse -Force }
& 'C:\Espressif\tools\python\v6.0.1\venv\Scripts\python.exe' 'D:\esp\v6.0.1\esp-idf\tools\idf.py' buildcd D:\esp32s3
& 'C:\Espressif\tools\python\v6.0.1\venv\Scripts\python.exe' 'D:\esp\v6.0.1\esp-idf\tools\idf.py' -p COM5 flash monitor如果端口不是 COM5,换成你的实际串口。
目标芯片是 ESP32-S3
分区表必须使用 single_app_large
本工程已经成功生成 bootloader.bin / partition-table.bin / esp32s3_parametric_alarm.bin
ESP_ROM_ELF_DIR environment variable is not defined
这个警告只影响 gdbinit 生成,不影响 build、flash 和正常运行。
进入 monitor 后可输入:
status
carrier
carrier 40000
tone
tone 523
visible
melody
audio
off
当前实现行为:
Wi‑Fi 凭据写入 NVS
重启后自动尝试重连
连接成功后启动 NTP
默认时区为 CST-8
时间同步成功后才会计算 next_alarm_time 并触发闹钟
当前 D:\esp32s3 已经从单纯的超声实验固件扩展成了一个 ESP32-S3 + BLE + 定向闹钟 的第一阶段原型:它可以通过 GPIO4/5/6/7 控制 TB6612 的 A 路输出单路超声载波与包络,并通过 BLE 让小程序控制模式、预设、闹钟和 Wi‑Fi 配网。
已经提供一个本地网页调试台:
D:\esp32s3\web-debug
主要文件:
| 文件 | 作用 |
|---|---|
| web-debug/index.html | 调试页面入口 |
| web-debug/styles.css | 页面样式和状态灯效果 |
| web-debug/app.js | Web Bluetooth 调试逻辑 |
| web-debug/serve.ps1 | 本地启动 HTTP 服务 |
通过 BLE 连接 SleepLamp-Ultrasonic
切换 off / carrier / tone / visible / melody / preset
设置 carrier_hz / tone_hz / output_profile / duty
发送 Wi‑Fi 配网和清除命令
新增 / 删除 / 读取闹钟
发送自定义 JSON 调试协议
显示状态 JSON 和事件日志
显示更完整的状态快照
对频率 / duty / Wi‑Fi / 闹钟字段做参数校验
对命令成功 / 失败给出明确提示
点击闹钟表格行回填到表单继续编辑
通过不同颜色的状态灯显示连接、模式、Wi‑Fi、时间同步、最近事件
当前网页会重点展示这些状态字段:
schema_version
device_name
fw_version
device_role
mode
active_preset
output_enabled
output_channel
ble_connected
carrier_hz
tone_hz
duty_low / duty_center / duty_high
output_profile
wifi_state
ssid
ip
time_synced
wifi_retry_count / wifi_retry_limit
alarm_count / alarm_capacity
next_alarm_time
last_event_code
last_event_message
last_error_code
uptime_ms
蓝牙连接:绿色=已连接,黄色=连接中,灰色=未连接,红色=连接失败
输出模式:灰=off,青=carrier,蓝=tone,黄=visible,粉=melody,紫=preset,绿=audio
Wi‑Fi:灰=未配置,黄=连接中,绿=已连接,橙=已断开,红=失败
时间同步:绿=已同步,黄=未同步
最近事件:青=普通事件,黄=警告,红=错误
Web Bluetooth 需要安全上下文,所以不要直接双击 index.html,要通过 localhost 打开。
先启动本地服务:
cd D:\esp32s3\web-debug
.\serve.ps1然后在 Chrome 或 Edge 里打开:
http://127.0.0.1:9001
1. 给 ESP32-S3 烧录当前固件
2. 打开网页调试台
3. 点击“连接设备”
4. 选择 SleepLamp-Ultrasonic
5. 观察状态灯和状态 JSON
6. 逐项调试模式、频率、Wi‑Fi、闹钟