1. 项目概述:打造个性化智能闲聊花
最近入手了任天堂的闲聊花玩具,发现官方版本功能比较单一,语音内容有限。作为一名喜欢折腾的硬件爱好者,我决定自己动手改造一个可定制化的版本。这个项目使用Seeed XIAO ESP32C3开发板作为主控,搭配DFPlayer mini音频模块和3D打印外壳,打造了一个能随机播放自定义语音的智能盆栽。
整个项目从硬件选型到代码编写全部开源,成本控制在百元以内。相比原版产品,这个DIY版本最大的优势在于:
- 完全自定义语音内容(支持中英文)
- 可编程的播放逻辑(随机/定时/触发播放)
- 扩展性强(可接入传感器实现互动)
- 3D打印外壳自由定制外观
2. 硬件准备与电路设计
2.1 核心元件清单
| 部件名称 | 型号规格 | 数量 | 参考价格 | 备注 |
|---|---|---|---|---|
| 主控板 | Seeed XIAO ESP32C3 | 1 | ¥59 | 低功耗WiFi/BLE双模 |
| 音频模块 | DFPlayer mini | 1 | ¥15 | 支持TF卡播放 |
| 扬声器 | 20mm 8Ω 1W | 1 | ¥5 | 直径可根据外壳调整 |
| 锂电池 | 602535 3.7V | 1 | ¥10 | 500mAh容量 |
| 开关 | 微型拨动开关 | 1 | ¥2 | 3脚贴片式 |
| TF卡 | 8GB Class10 | 1 | ¥15 | 建议使用品牌卡 |
2.2 电路连接详解
音频模块的接线需要特别注意引脚对应关系:
DFPlayer mini引脚定义(左侧8个孔从上到下):
- VCC - 接5V电源
- RX - 接主控TX
- TX - 接主控RX
- NC - 空脚
- NC - 空脚
- SPK_1 - 喇叭正极
- GND - 电源地
- SPK_2 - 喇叭负极
XIAO ESP32C3连接方式:
- 5V → DFPlayer VCC
- GND → DFPlayer GND
- D6(TX) → DFPlayer RX
- D7(RX) → DFPlayer TX
注意:务必确认串口引脚对应关系正确,错误的TX/RX交叉连接会导致通信失败。建议先用杜邦线测试再焊接。
3. 软件配置与编程
3.1 MicroPython环境搭建
- 下载Thonny IDE(推荐版本4.1.2+)
- 连接开发板后选择ESP32-C3解释器
- 安装MicroPython固件:
- 波特率:115200
- 擦除Flash:选择"全部擦除"
- 文件系统:选择"创建"
3.2 核心代码解析
python复制import machine
import time
import urandom
uart = machine.UART(1, baudrate=9600, tx=21, rx=20)
def send_command(cmd, param1, param2):
"""DFPlayer控制指令封装"""
checksum = -(0xFF + 0x06 + cmd + 0x00 + param1 + param2)
command = bytearray([
0x7E, 0xFF, 0x06, cmd,
0x00, param1, param2,
(checksum >> 8) & 0xFF, checksum & 0xFF,
0xEF
])
uart.write(command)
# 初始化设置
time.sleep(3) # 模块启动延时
send_command(0x06, 0x00, 30) # 设置音量(0-30)
time.sleep(0.5)
TOTAL_SONGS = 60 # 根据实际文件数修改
while True:
track = urandom.randint(1, TOTAL_SONGS)
send_command(0x12, 0x00, track) # 播放指定曲目
time.sleep(10) # 播放间隔
代码关键点说明:
- UART通信使用9600波特率(DFPlayer标准速率)
- 每条指令需要计算校验和(checksum)
- 0x12指令用于按编号播放MP3文件
- 随机播放通过urandom实现
3.3 音频文件处理技巧
使用Python脚本批量处理音频文件:
python复制from pydub import AudioSegment
import os
def add_silence(input_dir, output_dir, silence_duration=3000):
"""为音频添加前导静音"""
silence = AudioSegment.silent(duration=silence_duration)
for i, filename in enumerate(sorted(os.listdir(input_dir)), 1):
if filename.startswith('.'): continue
audio = AudioSegment.from_file(f"{input_dir}/{filename}")
combined = silence + audio
combined.export(
f"{output_dir}/{i:04d}.mp3",
format="mp3",
bitrate="128k",
tags={"artist": "DIY Flower"}
)
处理建议:
- 原始音频建议使用WAV格式(16bit 44.1kHz)
- 输出MP3使用128kbps CBR编码
- 文件名按0001.mp3格式编号
- 前导静音可避免"吞字"现象
4. 外壳制作与组装
4.1 3D打印方案
提供两种外壳设计方案:
-
简约花盆款:
- 尺寸:Φ100mm × 120mm
- 壁厚:2mm
- 预留扬声器开孔(Φ20mm)
- 底部电池仓设计
-
卡通造型款:
- 可设计为动物/植物造型
- 集成更多互动元素(如触摸区域)
- 使用多色打印或后期上色
打印参数建议:
- 材料:PLA(环保无毒)
- 层高:0.2mm
- 填充率:15%-20%
4.2 电源系统安装
锂电池供电方案:
- 将电池红线剪断串联开关
- 开关焊接采用"中间脚+任一边脚"方式
- 电池黑线直接焊接到BAT-焊盘
- 开关输出线焊接到BAT+焊盘
安全提示:
- 焊接时避免短路
- 电池建议加装保护板
- 充电使用专用4056充电模块
5. 进阶玩法与优化
5.1 内容定制方案
-
语音生成:
- 使用GPT-SoVITS等TTS工具
- 建议生成5-10秒短语音
- 可制作多语言版本
-
情景模式:
- 早安/晚安定时播放
- 节日特别语音包
- 互动应答模式(需加装按钮)
5.2 功能扩展思路
-
环境互动:
- 增加光敏电阻(自动夜间静音)
- 温湿度传感器播报
- 震动传感器触发播放
-
无线控制:
- 通过BLE手机控制
- WiFi远程更新语音库
- MQTT智能家居联动
python复制# BLE控制示例代码
import bluetooth
from ble_simple_peripheral import BLESimplePeripheral
ble = BLESimplePeripheral("SmartFlower")
def on_rx(data):
if data == b"play":
send_command(0x12, 0x00, urandom.randint(1, TOTAL_SONGS))
ble.on_write(on_rx)
6. 常见问题排查
6.1 硬件问题
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 无声音 | 喇叭极性接反 | 交换SPK_1/SPK_2接线 |
| 杂音大 | 电源干扰 | 在VCC-GND间加100μF电容 |
| 无法开机 | 电池接触不良 | 检查开关焊接是否牢固 |
6.2 软件问题
-
文件播放错乱:
- 确认MP3文件名编号连续
- 检查TF卡格式化为FAT32
- 更新DFPlayer固件(如有必要)
-
通信失败:
- 确认TX/RX交叉连接
- 检查波特率设置为9600
- 测量串口电压(应为3.3V)
-
播放卡顿:
- 降低音频码率(建议≤128kbps)
- 缩短音频长度(建议≤30秒)
- 增加前导静音时间
这个项目最让我惊喜的是它的可扩展性。通过更换不同的语音内容和外壳设计,可以创造出完全个性化的智能盆栽。我在实际制作中发现,使用热熔胶固定内部元件比螺丝更方便,特别是在异形外壳中。另外,为音频文件添加ID3标签(如标题、艺术家信息)可以让播放控制更加智能。