【引言】
在我们的日常生活中,声音无处不在:婴儿的哭声、水龙头的流水声、敲门声……这些声音传递着重要的信息。但对于聋哑人或听力障碍人士来说,他们可能无法及时感知这些声音,从而错过一些重要事件,甚至产生安全隐患。
为此,我利用Mind+ 平台和乐动掌控(掌控板) 制作了一款手腕佩戴式提醒器。通过语音分类模型实时识别环境中的关键声音,并将识别结果通过物联网发送到手环,以震动、屏幕显示和LED灯光的方式提醒佩戴者。项目旨在帮助听障人士“听见”生活中的重要声音,让他们更安心地生活。
【系统整体架构】
整个系统分为两个部分:
语音识别端:在电脑上运行 Mind+ 2.0 的语音分类训练工具,训练一个能识别婴儿哭声、水龙头流水声、敲门声的模型,并通过本地 SIoT 平台实时发送识别结果。
手腕提醒器:使用乐动掌控作为主控,通过 I2C 接口连接线性电机驱动模块,订阅 SIoT 的 MQTT 主题,接收到不同声音后触发不同的震动模式、屏幕显示和 LED 灯光。
系统工作流程如下:
电脑麦克风采集环境声音,语音分类模型实时判断声音类别。
识别结果(如“哭声”“水龙头”“敲门声”或“背景噪声”)通过 MQTT 协议发送到本地 SIoT 服务器。
乐动掌控通过 WiFi 连接到 SIoT 服务器,订阅指定主题,收到消息后解析并执行对应的提醒动作。
【硬件准备】
乐动掌控(掌控板):主控,自带电池、屏幕、RGB LED、I2C 接口等。
Gravity: 线性电机驱动模块(DFRobot DRI0056):通过 I2C 通信,内置 44 种振动模式,用于产生不同触感。
连接线:4Pin I2C 连接线(乐动掌控的 I2C 接口为 4Pin 防反接接口,可直接连接模块)。
硬件连接:
将线性电机驱动模块通过 I2C 线连接到乐动掌控的 I2C 端口(默认是 P19/P20)。模块上的 I2C 地址默认为 0x30,无需额外配置。


【软件准备】
Mind+ 2.0:用于训练语音分类模型,并实时识别声音。
Mind+ 1.8:用于编写乐动掌控的提醒程序。
SIoT(本地 MQTT 服务器):负责在语音识别端和手环之间传递消息。
步骤1 训练语音分类模型
1.安装并启动 SIoT
在电脑上下载 SIoT(DFRobot 提供),解压后运行 siot.exe。默认网页管理地址为 http://127.0.0.1:8080,用户名 siot,密码 dfrobot。保持 SIoT 后台运行。
2.打开 Mind+ 2.0 的语音分类工具
在 Mind+ 2.0 中找到“语音分类训练”工具。
(1)采集声音样本
婴儿哭声:从网络素材中下载合适的音频文件,通过“上传音频”功能导入,确保内容清晰。
水龙头流水声:实际用手机或电脑麦克风录制水龙头流水的声音。
敲门声:实际录制敲门的声音。
背景噪声:录制一段日常环境噪声,作为“无事件”的参照。
每种声音建议采集 20~30 条样本,每条时长 1~3 秒,以保证模型泛化能力。

(2)训练模型
在工具中依次添加四种声音类别(哭声、水龙头、敲门声、背景噪声),点击“开始训练”。训练完成后可进行实时测试,对着麦克风说话或播放声音,查看识别结果。

(3)配置 SIoT 发送
在语音分类工具的“识别结果发送”设置中,开启 SIoT 发送功能,填写:
服务器地址:127.0.0.1(本机)或电脑的局域网 IP
端口:8080
用户名:siot
密码:dfrobot
发布主题:siot/ai
这样,每当模型识别出一个声音,就会通过 MQTT 向主题 siot/ai 发布对应的字符串(例如“哭声”“水龙头”“敲门声”“背景噪声”)。

步骤2 编写手腕提醒器程序
1.环境配置
打开 Mind+ 1.8,选择主控为“掌控板”。
在“扩展”中添加:
主控:掌控板
通信:MQTT(用于连接 SIoT)
传感器:线性电机驱动(DFRobot TM6605 库),用户库:https://gitee.com/yeezb/ext-haptic-motor-driver

2.程序代码解析

/*!
* MindPlus
* mpython
*
*/
#include <MPython.h>
#include <DFRobot_Iot.h>
#include "DFRobot_TM6605.h"
// 动态变量
volatile float mind_n_ZhuangTai, mind_n_BiaoShi;
// 函数声明
void obloqMqttEventTsiot47ai(String& message);
// 静态常量
const String topics[5] = {"","","","",""};
// 创建对象
DFRobot_TM6605 TM6605;
DFRobot_Iot myIot;
void setup() {
mPython.begin();
// 初始化线性电机驱动模块
while(TM6605.begin() != 0) { delay(1000); }
// 设置 MQTT 回调函数
myIot.setCustomMqttCallback(obloqMqttEventTsiot47ai, "siot/ai");
// 初始化 RGB LED(全红,表示连接WiFi中)
rgb.write(-1, 0xFF0000);
// 连接 WiFi
myIot.wifiConnect("***", "*********"); // 请替换为自己的 WiFi 名称和密码
while (!myIot.wifiStatus()) { yield(); }
// WiFi 连接成功,LED 变蓝
rgb.write(-1, 0x0000FF);
// 初始化 MQTT 连接
myIot.init("192.168.31.11","siot","06728058033124973","dfrobot", topics, 1883);
myIot.connect();
while (!myIot.connected()) { yield(); }
// 订阅主题
myIot.subscribeTopic("siot/ai");
// MQTT 连接成功,LED 变绿
rgb.write(-1, 0x00FF00);
delay(1000);
rgb.write(-1, 0x000000); // 关闭 LED
mind_n_ZhuangTai = 0;
mind_n_BiaoShi = 0;
// 屏幕显示启动信息
display.setCursor(42, 22);
display.print("AI助听器");
}
void loop() {
// 根据状态执行对应的震动模式
if (mind_n_ZhuangTai == 1) {
TM6605.selectEffect(DFRobot_TM6605::eSharpClick); // 尖锐点击模式
TM6605.play();
delay(2000);
}
else if (mind_n_ZhuangTai == 2) {
TM6605.selectEffect(DFRobot_TM6605::eDoubleClick); // 双击模式
TM6605.play();
delay(2000);
}
else if (mind_n_ZhuangTai == 3) {
TM6605.selectEffect(DFRobot_TM6605::eStrongAlert); // 强提醒模式
TM6605.play();
delay(2000);
}
}
// MQTT 消息回调函数
void obloqMqttEventTsiot47ai(String& message) {
// 哭声
if (message == "哭声") {
if (mind_n_BiaoShi == 0) {
mind_n_BiaoShi = 1;
mind_n_ZhuangTai = 1;
rgb.write(-1, 0xFFFF00); // 黄色
display.fillScreen(0);
display.setCursor(42, 22);
display.print("房间有哭声");
}
}
// 水龙头
else if (message == "水龙头") {
if (mind_n_BiaoShi == 0) {
mind_n_BiaoShi = 1;
mind_n_ZhuangTai = 2;
rgb.write(-1, 0x00FFFF); // 青色
display.fillScreen(0);
display.setCursor(42, 22);
display.print("水龙头已打开");
}
}
// 敲门声
else if (message == "敲门声") {
if (mind_n_BiaoShi == 0) {
mind_n_BiaoShi = 1;
mind_n_ZhuangTai = 3;
rgb.write(-1, 0xFFFFFF); // 白色
display.fillScreen(0);
display.setCursor(42, 22);
display.print("有敲门声");
}
}
// 背景噪声(恢复状态)
else if (message == "背景噪声") {
mind_n_BiaoShi = 0;
mind_n_ZhuangTai = 0;
display.fillScreen(0);
rgb.write(-1, 0x000000); // 关闭 LED
TM6605.stop(); // 停止震动
}
}3.程序关键点说明
WiFi 与 MQTT 连接:使用 myIot 对象连接指定的 WiFi 和 SIoT 服务器(IP 地址、端口、用户名、密码根据实际修改)。
消息回调:obloqMqttEventTsiot47ai 函数会在收到主题 siot/ai 的消息时自动执行。根据消息内容更新状态变量。
状态机:mind_n_BiaoShi 用于防止连续触发,当收到“背景噪声”时重置状态,允许下一次提醒。
震动模式:TM6605.selectEffect() 选择不同的震动模式,通过 play() 启动,stop() 停止。
视觉反馈:屏幕显示中文文字,RGB LED 显示不同颜色(黄、青、白),便于佩戴者快速获取信息。
步骤3 组装与测试
将线性电机驱动模块通过 I2C 线连接到乐动掌控,模块自带振动电机,装入切割好的亚克力盒子中,振动电机固定在贴近手腕处。
将程序上传到乐动掌控,确保它能成功连接 WiFi 和 SIoT。
在电脑上运行 Mind+ 2.0 的语音分类工具,打开实时识别功能,并确保 SIoT 发布功能已开启。
对着电脑麦克风播放或发出三种声音,观察手环的震动、屏幕和 LED 变化:
听到哭声 → 手环以“尖锐点击”震动,屏幕显示“房间有哭声”,LED 亮黄灯。
听到水龙头流水声 → 手环以“双击”震动,屏幕显示“水龙头已打开”,LED 亮青光。
听到敲门声 → 手环以“强提醒”震动,屏幕显示“有敲门声”,LED 亮白光。
当声音消失或识别为背景噪声时,手环停止震动,屏幕清空,LED 熄灭。




【效果展示与使用场景】
婴儿看护:家长在做家务时,将电脑放在婴儿房附近,若婴儿哭闹,手环立即震动并显示“房间有哭声”,家长可及时查看。
厨房用水:若水龙头未关紧,流水声被识别后手环提醒,避免水资源浪费。
门铃替代:将电脑放在门口附近,当有人敲门时,手环震动提示,听障人士可轻松知晓来访者。
【总结与展望】
本项目不仅是一个为听障人士设计的辅助工具,更是一个完整的创客教学案例。它贯穿了人工智能项目开发的完整流程,非常适合在课堂或社团活动中引导学生从零开始完成一个兼具技术深度与社会价值的作品。
在教学实践中,学生可以通过本项目掌握以下核心能力:
数据采集与模型训练:了解如何采集有效的声音样本、标注数据类别,并使用 Mind+ 2.0 的语音分类工具训练出可用的 AI 模型。这一过程让学生直观感受“人工智能是如何学会识别声音的”。
物联网通信:通过 SIoT 平台搭建本地 MQTT 服务,理解设备间如何通过“发布/订阅”模式进行通信,实现 AI 识别端与硬件执行端的解耦。
硬件编程与传感器应用:使用乐动掌控的屏幕、RGB LED 和线性电机驱动模块,学习如何根据不同的识别结果设计多模态反馈(视觉+触觉),提升用户体验。
系统整合思维:将软件(AI 模型、物联网)与硬件(手环设备)有机结合,体验一个完整智能硬件产品的设计与实现过程。
更重要的是,通过本项目,学生能够在动手实践中思考人工智能的社会价值。项目聚焦于聋哑人、听力障碍人士的真实需求,引导学生关注弱势群体,思考如何利用所学技术去解决现实生活中的问题。这种“技术向善”的理念,有助于培养学生的同理心与社会责任感,让他们在创客制作中不仅收获技能,更懂得用科技温暖他人。

返回首页
回到顶部
smile942026.03.29
推送失败,检查MQTT服务器是怎么回事呢
云天2026.03.30
siot,要用2.0
云天2026.03.25
【创意智造组】Mind+ V2 图像分类模型训练 项目名称,就不改了,每次改完,首行的空格都会消失(请技术解决)。