文章

ESP32-S3 接入扣子(Coze)API:让你的开发板拥有 AI 大脑

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+ 是必须的。安装方式有三种,按需选择:

  1. 独立安装(推荐):下载 ESP-IDF 安装器,全量安装约 2GB,包含编译器、SDK 和烧录工具。
  2. VS Code 插件:安装 Espressif IDF 插件后,可直接在 VS Code 内管理项目、烧录和串口监视,对新手更友好。
  3. Docker:如果你熟悉容器化,可以用官方镜像 espressif/idf 避免污染本机环境,但烧录串口需要额外映射。

安装完成后,在终端验证:

1
2
idf.py --version
# 期望输出类似:v5.1.4

1.3 前置知识(快速过一遍)

  • ESP-IDF 项目结构:一个项目至少包含 main/CMakeLists.txtmain/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) 获取方式:

  1. 点击右上角头像 → “设置”
  2. 找到 “API Token”“个人访问令牌”
  3. 点击 “创建 Token”,填写名称(如 ESP32-S3-Dev),设置有效期
  4. 复制并保存好这个 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 安装路径不同,下载的例程不能直接编译,需要重新创建项目骨架:

  1. 打开 VS Code(已安装 ESP-IDF 插件),按 Ctrl+Shift+P,输入 ESP-IDF: New Project
  2. 填写项目名称(如 coze_env_monitor)和保存路径,目标芯片选 ESP32-S3,模板选 “Empty”(空白模板)
  3. 点击创建,等待项目初始化完成

然后,将 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_idconversation_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_idconversation_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 测试交互

  1. 按下 GPIO11 上的按键,开发板读取 DHT11 数据并发起 API 请求
  2. 等待几秒(包含 API 响应延迟),串口会打印 AI 回复
1
2
3
[Coze] AI 回复: 当前温度23.5℃,湿度60%,体感舒适。建议适当开窗通风,
          保持室内空气流通。
[Coze] (截断显示) 当前温度23.5℃,湿度60%,体感舒适。建议适当开窗通风...

如果看到 HTTP 401 Unauthorized401 错误,说明 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_idstring智能体 ID,必填
user_idstring用户标识,建议用设备唯一 ID,便于会话管理
streambooleanfalse=等待完整回复,true=流式(SSE),ESP32 建议用 false
additional_messagesarray消息列表,目前只需传用户消息

响应(第一步)

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 = 没有权限访问该 Bot
  • code: 429 = 请求过于频繁,限流,稍后重试
  • code: 500 = 扣子服务端内部错误

七、常见问题排查

7.1 Wi-Fi 连接失败

现象:串口一直打印 Wi-Fi: Connect to AP... 然后超时。

排查顺序

  1. 确认 SSID 和密码完全正确(注意大小写和特殊字符)
  2. 确认路由器开启了 2.4GHz 频段(ESP32-S3 不支持 5GHz)
  3. 确认路由器没有开启 AP 隔离(部分企业路由默认开启)
  4. 检查附近是否有强干扰源(如微波炉、蓝牙设备)
  5. wifi_conn.c 中加入更详细的日志

7.2 API 调用返回 401 Unauthorized

原因:Token 填写错误、Token 过期或 Bot 未部署上线。

排查方法

  1. 在扣子平台确认 Bot 状态是 “已上线”,草稿状态无法通过 API 访问
  2. 重新生成 PAT,并在代码中更新(注意不要有前后空格)
  3. 用 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

排查顺序

  1. 确认接线正确:VCC→3.3V,GND→GND,DATA→GPIO4
  2. 确认 DATA 引脚与代码中 DHT11_DATA_PIN 定义一致
  3. 检查杜邦线接触是否良好,尝试换一根杜邦线
  4. 在 DHT11 的 VCC 和 GND 之间并联一个 100nF 去耦电容,位置越靠近传感器越好

八、进阶方向

8.1 语音对话(WebSocket 流式 API)

当前例程使用的是 轮询模式(非流式),用户按下按键后需要等待数秒才能看到回复。要实现更流畅的交互体验,可以改用 流式 API

  • stream 字段设为 true,改用 SSE(Server-Sent Events) 连接
  • 在数据到达时边接收边播放 TTS 语音,而不是等完整回复
  • ESP32-S3 可以配合 MAX98357 I2S 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 智能体交互,核心要点如下:

  1. 扣子平台负责 AI 对话逻辑,通过 Bot ID + Personal Access Token 进行身份认证
  2. ESP-IDF 项目需要开启 ESP-TLS 的跳过证书验证选项,才能正常访问 api.coze.cn
  3. Coze API v3 采用异步轮询模式:发起对话 → 轮询状态 → 获取回复,三步走
  4. ESP32-S3 内存有限,对 AI 的长回复需要截断处理,可通过串口分片或 OLED 显示
  5. 常见问题主要集中在 Wi-Fi 连接Token 配置Bot 部署状态 三个方面

整个项目麻雀虽小,却涵盖了嵌入式开发、网络通信、AI API 调用和硬件驱动四个技术维度的知识,是一个非常适合练手的综合实践。最后提醒:本文所有代码和配置仅供学习参考,生产环境中请务必妥善保管 API Token,不要硬编码在代码仓库里。


如有问题,欢迎在评论区留言。完整例程代码可在 GitCode 仓库 获取。

本文由作者按照 CC BY 4.0 进行授权