为什么要把ESP32和豆包大模型连接起来?
我第一次尝试把ESP32开发板和豆包大模型连起来时,其实心里没底。毕竟网上讲ESP32接入AI的资料少得可怜,大部分都是讲怎么接小爱、接天猫精灵的。但真正动手做完一个语音控制智能插座的项目后,我发现这个组合简直是物联网开发的"性价比之王"。
ESP32价格便宜(15块钱就能买到一块开发板),豆包大模型API调用成本极低(甚至有免费额度),两者结合可以实现:
- 自然语言控制家电("帮我把卧室的灯调暗一点")
- 智能对话交互(不只是执行命令,还能聊天)
- 本地+云端混合处理(响应快,成本低)
- 完全私有化部署(数据不经过第三方)
准备工作:这些东西你得先备齐
别急着写代码,先把硬件和账号准备好。我第一次做的时候就是漏了这一步,结果写到一半发现API Key没申请,白白浪费时间。
硬件清单
| 物品 | 数量 | 参考价格 | 备注 |
|---|---|---|---|
| ESP32开发板 | 1块 | ¥15-25 | 推荐ESP32-S3,内存更大 |
| 麦克风模块 | 1个 | ¥10-20 | INMP441 I2S数字麦克风 |
| 扬声器 | 1个 | ¥15-30 | 3W 4Ω小喇叭即可 |
| 继电器模块 | 1-2路 | ¥8-15 | 控制220V家电用 |
软件和环境
- Arduino IDE 或 PlatformIO(推荐后者,库管理更方便)
- 豆包大模型API Key(从火山引擎控制台获取,新用户有免费额度)
- Wi-Fi网络(ESP32需要联网调用API)
第一步:获取豆包大模型API访问权限
这一步很多人会卡住,其实没那么复杂。我第一次申请的时候也是一头雾水,后来发现官方文档写得挺清楚的。
// 豆包大模型API调用示例(后面会用到)
POST https://ark.cn-beijing.volces.com/api/v3/chat/completions
Headers:
Content-Type: application/json
Authorization: Bearer YOUR_API_KEY
Body:
{
"model": "ep-202502-2fedg", // 你的接入点ID
"messages": [
{"role": "user", "content": "把客厅的灯打开"}
]
}
重点提醒:
- 登录火山引擎控制台,进入"火山方舟" → "模型推理"
- 创建接入点,选择"豆包"系列模型(推荐doubao-pro-32k,性价比高)
- 记录下接入点ID(格式像ep-202502-xxxxx)和API Key
- 新用户有免费试用额度,足够测试用了
第二步:ESP32环境搭建和库安装
如果你用的是PlatformIO(强烈推荐),直接在platformio.ini里加这几行:
; platformio.ini
[env:esp32-s3-devkitc-1]
platform = espressif32
board = esp32-s3-devkitc-1
framework = arduino
lib_deps =
bblanchon/ArduinoJson@^7.0.0
esphome/AsyncTCP-esphome@^2.0.0
me-no-dev/ESPAsyncWebServer@^1.2.3
WiFiManager
如果用Arduino IDE,需要手动安装这些库:
- ArduinoJson(处理JSON数据)
- ESPAsyncWebServer(HTTP服务器)
- WiFiManager(配网工具,不用硬编码Wi-Fi密码)
第三步:核心代码实现(直接能用的版本)
我把代码拆成了几个关键部分,你可以按需取用。完整的代码我已经放在GitHub上了(文末有链接)。
3.1 连接Wi-Fi(智能配网)
#include <WiFiManager.h>
void connectWiFi() {
WiFiManager wm;
// 如果之前保存过Wi-Fi信息,会自动连接
// 否则会创建名为"ESP32-Setup"的AP,手机连上后进入192.168.4.1配网
if (!wm.autoConnect("ESP32-Setup")) {
Serial.println("配网失败,重启中...");
delay(3000);
ESP.restart();
}
Serial.print("已连接Wi-Fi: ");
Serial.println(WiFi.SSID());
Serial.print("IP地址: ");
Serial.println(WiFi.localIP());
}
3.2 调用豆包大模型API
#include <ArduinoJson.h>
#include <HTTPClient.h>
String callDoubaoAPI(String userMessage) {
HTTPClient http;
String apiUrl = "https://ark.cn-beijing.volces.com/api/v3/chat/completions";
http.begin(apiUrl);
http.addHeader("Content-Type", "application/json");
http.addHeader("Authorization", "Bearer " + String(API_KEY));
// 构造请求体
DynamicJsonDocument doc(1024);
doc["model"] = "ep-202502-2fedg"; // 替换成你的接入点ID
JsonArray messages = doc.createNestedArray("messages");
JsonObject message = messages.createNestedObject();
message["role"] = "user";
message["content"] = userMessage;
String requestBody;
serializeJson(doc, requestBody);
int httpCode = http.POST(requestBody);
if (httpCode == HTTP_CODE_OK) {
String response = http.getString();
DynamicJsonDocument respDoc(2048);
deserializeJson(respDoc, response);
String aiReply = respDoc["choices"][0]["message"]["content"];
return aiReply;
} else {
Serial.print("API调用失败,错误码: ");
Serial.println(httpCode);
return "ERROR";
}
}
3.3 语音识别(可选,进阶功能)
如果你想做语音控制,需要加个麦克风模块。我用的是INMP441(I2S接口),音质比模拟麦克风好太多。
// 使用百度语音识别API(免费额度足够个人使用)
#include <WiFiClientSecure.h>
String speechToText(uint8_t* audioData, size_t audioLen) {
// 1. 把音频数据base64编码
// 2. 调用百度ASR API
// 3. 返回识别出的文字
// 详细代码太长,完整版见GitHub仓库
}
第四步:实际应用案例(我做的智能插座)
光说不练假把式,我用一个实际项目演示整个流程。目标是做一个能用自然语言控制的智能插座:
- 用户说:"把卧室的灯打开" → ESP32调用豆包API解析意图 → 控制继电器通电
- 用户说:"现在几点了" → 豆包API回答 → ESP32通过扬声器播放
- 用户说:"明天早上7点提醒我开会" → 设置定时任务(用ESP32的RTC或NTP对时)
硬件连接图
| ESP32引脚 | 连接设备 | 功能说明 |
|---|---|---|
| GPIO 16 | 继电器IN端 | 控制电器开关 |
| GPIO 25 | 扬声器+ | 音频输出(需要加音频放大器) |
| GPIO 32/33 | INMP441 SDA/SCL | I2S麦克风数据 |
踩过的坑和优化建议
做这个项目的时候我踩了不少坑,这里分享出来帮你少走弯路:
坑1:API调用延迟高
问题:从说话到设备响应,要等3-5秒,体验很差。
解决方案:
- 用Wokwi在线模拟器测试代码,减少实物调试时间
- 把常用指令缓存到ESP32本地(比如"开灯""关灯"),只有复杂查询才调API
- 选择离你物理位置近的API节点(北京/上海/广州)
坑2:豆包API返回的格式不稳定
问题:有时候返回的是JSON,有时候是纯文本,解析容易出错。
解决方案:在Prompt里明确要求返回JSON格式,并用ArduinoJson的deserializeJson做异常处理。
// 构造更严格的Prompt
String prompt = R"(
用户说: " + userMessage + R"(
请分析用户意图,返回JSON格式:
{
"action": "turn_on" | "turn_off" | "query" | "remind",
"device": "light" | "socket" | "all",
"room": "bedroom" | "living_room" | "kitchen",
"extra": "附加信息"
}
只返回JSON,不要有其他文字。
)";
坑3:Wi-Fi经常掉线
解决方案:加个看门狗定时器,掉线自动重连:
void keepWiFiAlive() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Wi-Fi断开,尝试重连...");
WiFi.reconnect();
}
}
// 在loop()里定期调用
void loop() {
keepWiFiAlive();
// ... 其他逻辑
}
扩展玩法:还能做什么?
接入豆包大模型后,ESP32的能力会被放大很多倍。这里列几个我想到的(有些我已经实现了,有些还在折腾):
- 智能农业监控:土壤湿度低了 → 自动浇水 + 推送通知到微信
- 老人陪护机器人:语音聊天 + 吃药提醒 + 异常声音检测(跌倒报警)
- 智能门禁:人脸识别 + 访客登记 + 语音对讲
- 能耗管理系统:统计每个电器的用电量,用豆包分析节能建议
完整代码和资料下载
我把这个项目的完整代码、电路图、3D打印外壳设计文件都开源了:
- GitHub仓库:esp32-doubao-ai(Star一下呗)
- 豆包大模型官方文档
- ESP32开发手册:Espressif官方文档
- WebSocket实时通信方案(进阶):适合需要流式输出的场景
总结:这套方案的核心优势
做完这个项目后,我总结了为什么ESP32+豆包大模型是个好组合:
| 对比维度 | ESP32+豆包 | 树莓派+本地模型 | 成品智能音箱 |
|---|---|---|---|
| 成本 | ¥50以内 | ¥500+ | ¥200-500 |
| 灵活性 | 完全自定义 | 完全自定义 | 受厂商限制 |
| AI能力 | 豆包大模型(很强) | 本地小模型(较弱) | 厂商自带(一般) |
| 开发难度 | 中等(Arduino/C++) | 较高(Linux+Python) | 低(开箱即用) |
如果你也在做物联网+AI相关的项目,欢迎评论区交流。我建了个QQ群(123456789),里面有一帮和我一样喜欢折腾的小伙伴,有问必答。
相关阅读:
OpenClaw教程:零代码实现AI自动化工作流
豆包大模型API实战:从注册到多语言调用
n8n中文教程:AI工作流自动化终极指南
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论