ESP32-S3 接入扣子(Coze)API:让你的开发板拥有 AI 大脑
前言
你有没有想过,按一下开发板上的按钮,ESP32-S3 就能自动读取温湿度传感器数据,然后把数据”告诉”一个 AI 助手,让它给出建议——整个过程不需要掏出手机或电脑,全部在一块手掌大小的开发板上完成?
这并不是天方夜谭。通过扣子(Coze)平台的 API 接口,配合 ESP32-S3 的 Wi-Fi 能力,完全可以实现这个场景。ESP32-S3 作为边缘端,负责数据采集和简单逻辑处理;扣子平台上的 AI 智能体则承担复杂理解和回复生成。两者的分工有点像:ESP32-S3 是”眼、耳、手”,扣子 AI 是”大脑”。
本文从零开始,完整覆盖从扣子智能体创建、ESP-IDF 环境配置、代码修改到最终烧录调试的全流程。相比市面上的粗糙教程,我会重点解释为什么要这样做,并补充 API 调用的底层原理和常见问题的排查思路。
一、准备工作
1.1 硬件清单
| 设备 | 说明 |
|---|---|
| ESP32-S3 开发板 | 推荐 HiWonder 或 Espressif DevKitC,板载 USB-C 接口 |
| DHT11 温湿度传感器 | 3 引脚模块(VCC/GND/Data),Data 脚默认接 GPIO4 |
| 按键 | 任意轻触开关,一端接 GPIO11,一端接地(可自定义) |
| USB-C 数据线 | 承担供电和程序烧录,建议用带数据线的 |
| 电脑 | Windows/macOS/Linux 均可,需要安装 ESP-IDF |
⚠️ 注意:ESP32-S3 有多个型号,内存大小直接影响能否稳定运行。如果烧录时出现内存不足错误,检查一下模块型号(
idf.py size可以查看各段内存占用)。
1.2 软件环境
ESP-IDF v5.1+ 是必须的。安装方式有三种,按需选择:
- 独立安装(推荐):下载 ESP-IDF 安装器,全量安装约 2GB,包含编译器、SDK 和烧录工具。
- VS Code 插件:安装
Espressif IDF插件后,可直接在 VS Code 内管理项目、烧录和串口监视,对新手更友好。 - Docker:如果你熟悉容器化,可以用官方镜像
espressif/idf避免污染本机环境,但烧录串口需要额外映射。
安装完成后,在终端验证:
1
2
idf.py --version
# 期望输出类似:v5.1.4
1.3 前置知识(快速过一遍)
- ESP-IDF 项目结构:一个项目至少包含
main/CMakeLists.txt、main/idf_component.yml和源代码文件。编译产物在build/目录。 - FreeRTOS 任务:ESP-IDF 基于 FreeRTOS,多个外设驱动以任务形式并行运行。
- HTTP 请求:ESP32 通过
esp_http_client发起 HTTP 请求,Coze API 是标准的 REST API,所以这个能力是原生支持的。 - Wi-Fi 连接:
esp_wifi库处理连接,代码中只需要填入 SSID 和密码。
以上知识在下面的实操中会逐步展开,不需要提前精通。
二、在扣子平台创建智能体
2.1 注册与登录
访问 coze.cn,使用手机号或抖音账号登录(国内版)。如果你有海外账号,可以用 coze.com,但 API 域名和认证方式略有不同——本文以 coze.cn 为准。
2.2 新建智能体
登录后在工作台点击 “创建 Bot”,填写:
- Bot 名称:例如
环境监测助手 - Bot 描述:填写你希望 AI 做什么,比如”接收温湿度数据,根据数值给出穿衣建议或健康提醒”
- 图标:可上传或让 AI 自动生成
填好后,在左侧 “人设与开场白” 区域,用自然语言描述 AI 的角色定位:
1
2
3
你是一个贴心的环境监测助手。用户会发送温度和湿度数据,
你根据数值判断当前环境舒适度,并给出实用建议(如"建议添衣"、"注意开窗通风"等)。
每次回复尽量简洁,因为用户通过小屏幕查看。
描述越具体,AI 的回复越符合预期。保存后可以先在扣子自带的对话窗口测试几条。
2.3 部署为 API(关键步骤)
这一步是把智能体暴露为 HTTP 接口,是整个流程的核心。
在 Bot 编辑页面,点击左侧 “发布” 按钮,然后点击 “为 API 创建 Bot” 或 “部署”(不同版本界面略有差异)。
部署成功后,你会看到一个状态为 “已上线” 的 Bot。
2.4 获取 Bot ID 和 API Token
Bot ID(也叫 Project ID / Bot ID)获取方式:
在 Bot 详情页的 URL 中可以看到,例如:
1
https://www.coze.cn/app/7369169481794912293/chat
URL 中 /app/ 后面那一串数字就是你的 Bot ID(或 Space ID,具体以 API 文档为准)。也可以在 Bot 设置页的 “开发配置” 或 “API 信息” 栏目中直接复制。
⚠️ 注意:扣子平台的 Bot ID 和 API Token 是不同的东西。Bot ID 用于标识你是调用哪个 Bot,Token 是身份验证凭证,两者缺一不可。
Personal Access Token (PAT) 获取方式:
- 点击右上角头像 → “设置”
- 找到 “API Token” 或 “个人访问令牌”
- 点击 “创建 Token”,填写名称(如
ESP32-S3-Dev),设置有效期 - 复制并保存好这个 Token——它只显示一次,刷新页面后就再也看不到了
你的 Token 形如 pat_xxxxxxxxxxxx,格式固定为 pat_ 开头。
⚠️ 安全警告:Token 相当于你的账号密码,绝对不要提交到任何公开仓库或代码托管平台。建议在
wifi_conn.h这类本地文件中配置,并在.gitignore中忽略此类文件。
三、下载并准备例程项目
3.1 获取例程代码
完整的 ESP32-S3 + 扣子 API 例程开源在 GitCode 上:
1
2
仓库:https://gitcode.com/NUCAILab/ESP32-S3
目录:tem 文件夹
可以用 git clone 拉取整个仓库,然后进入 tem 目录;也可以在网页端直接下载 ZIP 包解压。
项目结构大致如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
tem/
├── main/
│ ├── CMakeLists.txt
│ ├── coze_api.c # 扣子 API 调用核心逻辑
│ ├── coze_api.h
│ ├── wifi_conn.c # Wi-Fi 连接
│ ├── wifi_conn.h
│ ├── dht11.c # DHT11 驱动
│ ├── dht11.h
│ ├── button.c # 按键事件处理
│ ├── button.h
│ └── main.c # 主入口
├── CMakeLists.txt
└── sdkconfig.defaults
3.2 新建 ESP-IDF 项目
因为每个人的 ESP-IDF 安装路径不同,下载的例程不能直接编译,需要重新创建项目骨架:
- 打开 VS Code(已安装 ESP-IDF 插件),按
Ctrl+Shift+P,输入ESP-IDF: New Project - 填写项目名称(如
coze_env_monitor)和保存路径,目标芯片选ESP32-S3,模板选 “Empty”(空白模板) - 点击创建,等待项目初始化完成
然后,将 tem/main/ 目录下的所有文件复制到新项目的 main/ 目录中,覆盖默认的 main.c 和 CMakeLists.txt。
3.3 menuconfig 关键配置
这是最容易踩坑的地方,很多新手卡在这里。
在 VS Code 终端或系统终端中进入项目目录,执行:
1
idf.py menuconfig
依次展开:
1
Component config → ESP-TLS
找到 “Allow potentially insecure options”(允许使用不安全的选项),按空格勾选。展开后会多出几个子选项,把下面新出现的选项也全部勾选:
1
2
→ Allow option to skip certificate verification
→ Allow configurations with missing certificates
这是因为 ESP32 内置的 CA 根证书列表可能不包含 api.coze.cn 的证书,直接跳过证书验证最省事。
⚠️ 生产环境注意:跳过证书验证意味着请求可能被中间人劫持,仅推荐在开发和调试阶段使用。正式产品中应当将扣子的 CA 证书添加到固件中。
按 S 保存,按 Q 退出。
四、代码配置详解
4.1 wifi_conn.h — Wi-Fi 配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// wifi_conn.h
#ifndef WIFI_CONN_H
#define WIFI_CONN_H
// ⚠️ 替换为你自己的 Wi-Fi 信息
// 建议使用 2.4GHz 网络,ESP32-S3 不支持 5GHz Wi-Fi
#define WIFI_SSID "Your_WiFi_Name"
#define WIFI_PASSWORD "Your_WiFi_Password"
// 连接超时时间(秒)
#define WIFI_CONNECT_TIMEOUT 15
void wifi_init(void);
#endif
⚠️ 常见问题:如果开发板在有 5GHz 双频路由器环境下搜不到 Wi-Fi,换到 2.4GHz 频段即可。多数家庭路由器将 2.4G 和 5G 设为同一名称,但 ESP32-S3 只能连 2.4G。
4.2 dht11.h — 传感器引脚配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// dht11.h
#ifndef DHT11_H
#define DHT11_H
#include "driver/gpio.h"
// ⚠️ DHT11 的 DATA 引脚,默认使用 GPIO4
// 如果你的传感器接在其他引脚,修改这里即可
#define DHT11_DATA_PIN GPIO_NUM_4
// DHT11 使用单总线协议,不需要额外配置时钟引脚
#define DHT11_POWER_PIN GPIO_NUM_5 // 可选:GPIO 控制传感器供电
// 读取间隔(毫秒),DHT11 建议不低于 1000ms
#define DHT11_READ_INTERVAL_MS 2000
/**
* 初始化 DHT11 传感器
*/
void dht11_init(void);
/**
* 读取一次温湿度数据
* @param temperature 输出参数,温度值(单位:℃)
* @param humidity 输出参数,湿度值(单位:%RH)
* @return 0 成功,-1 失败
*/
int dht11_read(float *temperature, float *humidity);
#endif
⚠️ DHT11 精度说明:DHT11 精度较低(温度 ±2℃,湿度 ±5%),适合教学和粗略监测场景。如果需要更高精度,可以替换为 DHT22(SHT30 更佳),代码接口类似,只需调整驱动库。
4.3 button.c — 按键引脚配置
1
2
3
4
5
6
7
8
9
10
// button.c(关键部分)
#include "driver/gpio.h"
// ⚠️ 按键 GPIO,按钮一端接此引脚,另一端接地(GND)
// 板载用户按键通常接 GPIO0 或 GPIO9,可以根据原理图修改
#define BUTTON_GPIO GPIO_NUM_11
// 按键去抖动时间(毫秒)
#define BUTTON_DEBOUNCE_MS 50
⚠️ 注意:ESP32-S3 的部分引脚是 Strapping Pins(启动配置引脚),在上电时会参与启动模式判断。GPIO0、GPIO2、GPIO3 等属于此类引脚。如果你的按键接在这些引脚上,芯片可能无法正常启动。建议使用 GPIO11、GPIO13、GPIO14 等普通 GPIO。
4.4 coze_api.c — 扣子 API 核心配置(重点)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// coze_api.c(核心部分)
// ⚠️ 1. 扣子 API 基础 URL(国际版用 api.coze.com,国内版用 api.coze.cn)
#define COZE_BASE_URL "https://api.coze.cn"
// ⚠️ 2. Bot ID:从扣子平台 Bot 详情页获取
// 格式是一串数字,不是带连字符的 UUID
#define COZE_BOT_ID "你的Bot_ID_数字"
// ⚠️ 3. Personal Access Token:从扣子平台设置页获取
// 格式为 pat_xxxxxxxx
#define COZE_TOKEN "pat_xxxxxxxxxxxxxxxxxxxxxxxx"
// 每次对话的会话标识,建议用设备唯一标识(如芯片 MAC 地址)
// 这里用固定字符串作为演示,生产环境建议动态生成
#define COZE_USER_ID "esp32s3_device_001"
Coze API v3 调用流程详解
理解 API 调用流程,能让你在出错时快速定位问题。整个流程分为三个阶段:
阶段一:发起对话(POST /v3/chat)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 构造请求体
cJSON *root = cJSON_CreateObject();
cJSON_AddStringToObject(root, "bot_id", COZE_BOT_ID);
cJSON_AddStringToObject(root, "user_id", COZE_USER_ID);
cJSON_AddBoolToObject(root, "stream", false); // 非流式返回
// 消息内容数组(Coze API v3 要求的消息格式)
cJSON *messages = cJSON_CreateArray();
// 用户消息:把温湿度数据拼接成文字
char user_msg[256];
snprintf(user_msg, sizeof(user_msg),
"当前温度:%.1f℃,湿度:%.1f%%,请给出建议。",
temperature, humidity);
cJSON *msg = cJSON_CreateObject();
cJSON_AddStringToObject(msg, "role", "user");
cJSON_AddStringToObject(msg, "content", user_msg);
cJSON_AddStringToObject(msg, "content_type", "text");
cJSON_AddItemToArray(messages, msg);
cJSON_AddItemToObject(root, "additional_messages", messages);
// 发送 POST 请求
// Headers 必须包含:Authorization: Bearer <PAT>
阶段二:轮询查询状态(GET /v3/chat/retrieve)
扣子 API 是异步的——你发送消息后,服务器不会立刻返回 AI 回复,而是返回一个 chat_id 和 conversation_id,你需要轮询查询对话状态:
1
2
3
4
5
6
7
8
9
10
// 轮询直到 status == "completed" 或 "failed"
while (1) {
vTaskDelay(pdMS_TO_TICKS(2000)); // 每 2 秒查询一次
// GET /v3/chat/retrieve?chat_id=xxx&conversation_id=xxx
// 检查 status 字段:
// "in_progress" → 继续等待
// "completed" → 获取回复
// "failed" → 出错,退出
}
⚠️ 轮询间隔建议:官方建议间隔 1-3 秒,太频繁可能被限流,太慢会拖长等待时间。ESP32 的
vTaskDelay基于 FreeRTOS,不会阻塞 CPU。
阶段三:获取回复(GET /v3/chat/message/list)
状态变为 completed 后,通过 chat_id 和 conversation_id 获取消息列表:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// GET /v3/chat/message/list?chat_id=xxx&conversation_id=xxx
// 返回的消息数组中,type="answer" 的那条消息,content 字段就是 AI 的回复文本
cJSON *msg_item = cJSON_GetArrayItem(msgs, i);
const char *type = cJSON_GetObjectItem(msg_item, "type")->valuestring;
if (strcmp(type, "answer") == 0) {
// 提取回复内容
const char *reply = cJSON_GetObjectItem(msg_item, "content")->valuestring;
printf("[Coze] AI 回复: %s\n", reply);
// ⚠️ ESP32-S3 内存有限(512KB SRAM),回复内容可能很长
// 这里做一个简单的截断,只显示前 256 个字符,避免内存溢出
// 实际项目中可以用 OLED 或语音模块展示
printf("[Coze] (截断显示) %.256s\n", reply);
}
⚠️ 内存限制:ESP32-S3 的可用堆内存约 200KB 左右(取决于 Wi-Fi、驱动等占用),AI 回复内容可能达到数千字节。例程中对回复做了截断处理,避免
printf或字符串操作时缓冲区溢出。实际项目可以通过串口分片输出,或使用 OLED 显示摘要。
五、编译烧录与测试
5.1 编译
1
idf.py build
如果前面的 menuconfig 配置正确,编译应该顺利完成。常见的编译错误及解决:
| 错误信息 | 原因 | 解决方法 |
|---|---|---|
esp_tls.c: xxx: certificate verification failed | 未开启 insecure 选项 | 重新执行 idf.py menuconfig,确保跳过证书验证已勾选 |
region 'iram0_0_seg' overflowed | 代码体积超 IRAM | 减少日志输出,或在 sdkconfig 中调整分区表 |
Wi-Fi: Scan started 后无后续 | Wi-Fi 连接失败 | 确认 SSID 和密码正确,路由器是否开启 2.4GHz |
5.2 烧录
1
idf.py -p /dev/ttyUSB0 flash monitor
将 /dev/ttyUSB0 替换为你电脑上的实际串口名(Windows 是 COM3 等,macOS 是 /dev/cu.usbserial-*)。
烧录成功后,终端会自动进入串口监视模式,你应该能看到以下日志:
1
2
3
4
I (xxx) wifi: Wi-Fi started
I (xxx) wifi: Connected to AP SSID: Your_WiFi_Name
I (xxx) coze: Wi-Fi connected, IP: 192.168.x.x
I (xxx) coze: Waiting for button press...
5.3 测试交互
- 按下 GPIO11 上的按键,开发板读取 DHT11 数据并发起 API 请求
- 等待几秒(包含 API 响应延迟),串口会打印 AI 回复
1
2
3
[Coze] AI 回复: 当前温度23.5℃,湿度60%,体感舒适。建议适当开窗通风,
保持室内空气流通。
[Coze] (截断显示) 当前温度23.5℃,湿度60%,体感舒适。建议适当开窗通风...
如果看到 HTTP 401 Unauthorized 或 401 错误,说明 Token 填写有误或已过期,请到扣子平台重新生成。
如果看到 HTTP 400 Bad Request,检查 bot_id 格式是否正确(应该是纯数字字符串,不是 UUID)。
六、Coze API v3 请求/响应格式详解
为了让你在调试时更得心应手,以下是完整的 API 格式说明。
6.1 发起对话
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
POST https://api.coze.cn/v3/chat
Authorization: Bearer pat_xxxxxxxxxxxxxxxxxxxx
Content-Type: application/json
{
"bot_id": "1234567890123456789",
"user_id": "esp32s3_device_001",
"stream": false,
"additional_messages": [
{
"role": "user",
"content": "当前温度:23.5℃,湿度:60%,请给出建议。",
"content_type": "text"
}
]
}
关键字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
bot_id | string | 智能体 ID,必填 |
user_id | string | 用户标识,建议用设备唯一 ID,便于会话管理 |
stream | boolean | false=等待完整回复,true=流式(SSE),ESP32 建议用 false |
additional_messages | array | 消息列表,目前只需传用户消息 |
响应(第一步):
1
2
3
4
5
6
7
8
9
{
"code": 0,
"msg": "success",
"data": {
"chat_id": "7301234567890123456",
"conversation_id": "7301234567890123456",
"status": "in_progress"
}
}
6.2 轮询查询状态
1
2
GET https://api.coze.cn/v3/chat/retrieve?chat_id=7301234567890123456&conversation_id=7301234567890123456
Authorization: Bearer pat_xxxxxxxxxxxxxxxxxxxx
响应:
1
2
3
4
5
6
7
8
9
10
11
{
"code": 0,
"msg": "success",
"data": {
"id": "7301234567890123456",
"conversation_id": "7301234567890123456",
"status": "completed",
"created_at": 1715000000,
"completed_at": 1715000005
}
}
6.3 获取回复内容
1
2
GET https://api.coze.cn/v3/chat/message/list?chat_id=7301234567890123456&conversation_id=7301234567890123456&type=answer
Authorization: Bearer pat_xxxxxxxxxxxxxxxxxxxx
响应:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"code": 0,
"msg": "success",
"data": {
"messages": [
{
"id": "7301234567890123458",
"conversation_id": "7301234567890123456",
"chat_id": "7301234567890123456",
"role": "assistant",
"type": "answer",
"content": "当前温度23.5℃,湿度60%,体感舒适。建议适当开窗通风。",
"content_type": "text",
"created_at": 1715000005
}
],
"meta": {
"total_count": 1
}
}
}
⚠️ 错误码速查:
code: 0= 成功code: 401= Token 无效或已过期code: 403= 没有权限访问该 Botcode: 429= 请求过于频繁,限流,稍后重试code: 500= 扣子服务端内部错误
七、常见问题排查
7.1 Wi-Fi 连接失败
现象:串口一直打印 Wi-Fi: Connect to AP... 然后超时。
排查顺序:
- 确认 SSID 和密码完全正确(注意大小写和特殊字符)
- 确认路由器开启了 2.4GHz 频段(ESP32-S3 不支持 5GHz)
- 确认路由器没有开启 AP 隔离(部分企业路由默认开启)
- 检查附近是否有强干扰源(如微波炉、蓝牙设备)
- 在
wifi_conn.c中加入更详细的日志
7.2 API 调用返回 401 Unauthorized
原因:Token 填写错误、Token 过期或 Bot 未部署上线。
排查方法:
- 在扣子平台确认 Bot 状态是 “已上线”,草稿状态无法通过 API 访问
- 重新生成 PAT,并在代码中更新(注意不要有前后空格)
- 用 Python 在电脑上快速测试 Token 是否有效:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import requests
token = "pat_你的token"
bot_id = "你的bot_id"
resp = requests.post(
"https://api.coze.cn/v3/chat",
headers={
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
},
json={
"bot_id": bot_id,
"user_id": "test_pc",
"stream": False,
"additional_messages": [
{
"role": "user",
"content": "你好,测试",
"content_type": "text"
}
]
}
)
print(resp.status_code, resp.json())
7.3 回复内容截断/乱码
原因:ESP32-S3 的串口缓冲区或堆内存有限。
解决思路:
- 截断:这是例程设计上的取舍,ESP32 端只展示前 N 个字符。如果需要完整内容,可以将回复存到 SD 卡或通过 UART 转发到电脑端。
- 乱码:确认串口波特率为
115200,终端编码设为 UTF-8。
7.4 内存溢出(Panic)
现象:烧录后运行一段时间,串口输出 Guru Meditation Error 或重启循环。
原因:主要是在 cJSON 解析大型响应时,堆内存耗尽。
排查方法:
1
idf.py size
查看各段内存占用,确保 dram0_0_seg(动态内存区)使用率不超过 80%。
7.5 DHT11 读取失败
现象:dht11_read 返回 -1,串口输出 Failed to read DHT11。
排查顺序:
- 确认接线正确:VCC→3.3V,GND→GND,DATA→GPIO4
- 确认 DATA 引脚与代码中
DHT11_DATA_PIN定义一致 - 检查杜邦线接触是否良好,尝试换一根杜邦线
- 在 DHT11 的 VCC 和 GND 之间并联一个 100nF 去耦电容,位置越靠近传感器越好
八、进阶方向
8.1 语音对话(WebSocket 流式 API)
当前例程使用的是 轮询模式(非流式),用户按下按键后需要等待数秒才能看到回复。要实现更流畅的交互体验,可以改用 流式 API:
- 将
stream字段设为true,改用 SSE(Server-Sent Events) 连接 - 在数据到达时边接收边播放 TTS 语音,而不是等完整回复
- ESP32-S3 可以配合
MAX98357I2S DAC 或pam8003功放模块实现语音播报
扣子的流式 API 返回格式为 SSE,每收到一个 token(词元)就推送一次数据,延迟可以从 3-5 秒降低到首字响应 < 500ms。
8.2 小智 AI 固件方案
如果觉得 ESP-IDF 开发门槛较高,也可以考虑社区爱好者开发的 小智 AI 固件。这是一类将 ESP32-S3 配置为智能音箱的项目,板子插上麦克风和扬声器,通过自然语言对话操控设备。目前社区已有多个成熟方案,支持语音唤醒、连续对话和流式回复,感兴趣的可以在 GitHub 搜索 ESP32-s3 小智AI 相关项目。
8.3 多 Bot 切换
一个 ESP32-S3 可以连接多个扣子 Bot,根据不同传感器数据触发不同的 AI 助手:
1
2
3
温度 > 30℃ → 触发"空调助手" Bot
PM2.5 > 150 → 触发"空气净化助手" Bot
光照 < 100 lux → 触发"智能照明助手" Bot
只需在代码中维护一个 Bot ID 映射表,根据条件选择对应的 Bot ID 发起请求即可。
8.4 OTA 远程更新
ESP32-S3 支持 OTA(Over-The-Air) 无线升级,可以将扣子 API 的 URL 配置改为动态获取,由云端控制推送固件更新,无需用户手动烧录。具体做法是在扣子 Bot 的插件或工作流中,增加一个”下发固件地址”的节点,ESP32 定期轮询该接口,发现新版本后自动下载并重启升级。
总结
本文完整介绍了如何让 ESP32-S3 通过扣子(Coze)API 与 AI 智能体交互,核心要点如下:
- 扣子平台负责 AI 对话逻辑,通过 Bot ID + Personal Access Token 进行身份认证
- ESP-IDF 项目需要开启 ESP-TLS 的跳过证书验证选项,才能正常访问
api.coze.cn - Coze API v3 采用异步轮询模式:发起对话 → 轮询状态 → 获取回复,三步走
- ESP32-S3 内存有限,对 AI 的长回复需要截断处理,可通过串口分片或 OLED 显示
- 常见问题主要集中在 Wi-Fi 连接、Token 配置 和 Bot 部署状态 三个方面
整个项目麻雀虽小,却涵盖了嵌入式开发、网络通信、AI API 调用和硬件驱动四个技术维度的知识,是一个非常适合练手的综合实践。最后提醒:本文所有代码和配置仅供学习参考,生产环境中请务必妥善保管 API Token,不要硬编码在代码仓库里。
如有问题,欢迎在评论区留言。完整例程代码可在 GitCode 仓库 获取。