0

ESP32轻松接入豆包大模型实现智能语音控制

2026.05.17 | youres | 16次围观

为什么要把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 IDEPlatformIO(推荐后者,库管理更方便)
  • 豆包大模型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": "把客厅的灯打开"}
  ]
}

重点提醒:

  1. 登录火山引擎控制台,进入"火山方舟" → "模型推理"
  2. 创建接入点,选择"豆包"系列模型(推荐doubao-pro-32k,性价比高)
  3. 记录下接入点ID(格式像ep-202502-xxxxx)和API Key
  4. 新用户有免费试用额度,足够测试用了

第二步: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打印外壳设计文件都开源了:

总结:这套方案的核心优势

做完这个项目后,我总结了为什么ESP32+豆包大模型是个好组合:

对比维度 ESP32+豆包 树莓派+本地模型 成品智能音箱
成本 ¥50以内 ¥500+ ¥200-500
灵活性 完全自定义 完全自定义 受厂商限制
AI能力 豆包大模型(很强) 本地小模型(较弱) 厂商自带(一般)
开发难度 中等(Arduino/C++) 较高(Linux+Python) 低(开箱即用)

如果你也在做物联网+AI相关的项目,欢迎评论区交流。我建了个QQ群(123456789),里面有一帮和我一样喜欢折腾的小伙伴,有问必答。


相关阅读:
OpenClaw教程:零代码实现AI自动化工作流
豆包大模型API实战:从注册到多语言调用
n8n中文教程:AI工作流自动化终极指南

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论