安全防盗智能家居
一、 项目背景介绍
在城市化进程加速和双职工家庭普及的背景下,家庭安防与便捷生活需求日益增长。传统家居安防系统存在安装复杂、响应滞后、交互不便等问题,而市面上的智能家居产品往往功能单一、系统封闭。针对这一痛点,因此我开发了“安全防盗智能家居”——一套集成语音控制、智能识别与实时安防的开放式智能家居系统。
本系统特别关注以下核心场景:
1. 双手提物时无需钥匙开门
2. 日常生活语音控制照明、控温系统
3. 独居老人/儿童的家庭安全监护
4. 陌生人靠近时的主动预警
二、系统设计与工作原理
2.1 整体架构
· 前端感知:二哈摄像头模块、K10行空板语音接收
· 主控处理:K10行空板,DFROBOT掌控板
· 软件:Mind+ 3.0
2.2 核心功能模块
2.2.1 语音控制模块
· 支持离线/在线双模式语音识别
· 自定义唤醒词:“你好,小行”
· 本地语音库包含照明、控温控制指令
· 采用噪声抑制,识别准确率达95%
2.2.2 智能人脸识别门禁
· 多角度人脸采集
· 家庭成员人脸存储管理无钥匙开门
· 陌生人识别与停留时间记录
2.2.3 智能感应与报警系统
陌生人门前滞留检测算法(停留超时触发预警)
2.3 工作流程
(1)人脸识别系统
摄像头检测到人员靠近
↓
摄像头进行人脸捕捉
↓
与预先存储人脸信息提取与比对
↓
匹配成功 → 开门+欢迎语音
↓
匹配失败 → 标记为“陌生人”
↓
停留时间>5秒 → 触发报警流程
↓
用户可通过语音随时干预
(2)语音智能控制系统
唤醒词:“你好,小行”
↓
检测到语音“开风扇”
↓
控制电机打开风扇,并语音提示“已经帮你打开风扇啦”
↓
检测到语音“关风扇”
↓
控制电机关闭风扇,并语音提示“已经帮你关闭风扇啦”
↓
检测到语音“开灯”
↓
控制输出高电平,并语音提示“已经帮你打开灯光啦”
↓
检测到语音“关灯”
↓
控制输出低电平,并语音提示“已经帮你关闭灯光啦”
2.4器材清单
二哈视图摄像头 (Gravity:二哈识图2 AI视觉传感器 - 6TOPS算力,预置20+AI模型,内置MCP服务 - DFRobot创客商城)
K10行空板 (行空板K10 - 集成ESP32-S3,摄像头,2.8寸彩色LCD的AI物联网编程教学开发板 - DFRobot创客商城)
DfROBOT掌控板(micro:bit掌控I/O扩展板-掌控板-DFRobot创客商城)
DfRobot Gravity模块套装(Gravity:数字绿色LED发光模块(Arduino兼容)-LED模块-DFRobot创客商城)
乐高EV3基础零件若干(【淘宝】大促价保 https://e.tb.cn/h.73VMjJiEBGtAb0A?tk=uL5WfECtmr9 HU287 「ev3编程机器人高级核心套装件搭建兼容乐高45544教育版45560教具」点击链接直接打开 或者 淘宝搜索直接打开)
三、实现步骤与原码





四、成品展示





五、迭代过程与“踩坑”记录
5.1 第一版:理想化的开端
问题:试图一次性实现所有功能,导致开发周期过长,基础功能不稳定。
教训:采用“单一功能调试”思路,先聚焦核心功能(语音控制灯光+基础人脸识别)。
5.2
踩坑记录:语言识别
· 问题:系统对普通话指令识别良好,但对不标准的普通话识别率低
5.3 第三版:人脸识别的精度
踩坑记录:监测人脸识别率低
问题:监测识别不到人脸
解决方案:降低阈值
5.4 第四版:系统稳定性
踩坑记录:多设备通信延迟
· 问题:说出“开灯”到执行有延时,用户体验差
· 解决方案:优化程序结构
六、创新点总结
1. 人脸学习:系统能够记录存储每位家庭成员的人脸信息,实现无钥匙开门
2. 陌生人滞留预警:陌生人在门前滞留超过5秒系统会启动预警
3. 智能语音识别:智能物联网家居系统,语音控制点灯和风扇
七、未来展望
我计划在下一代产品中:
1. 增加跌倒检测等健康监护功能
2. 集成能源管理,实现用电优化
3. 开发社区安防网络,实现邻里联防
4. 探索与应急部门的数据安全对接
附件
/*!
* MindPlus
* DFRobot, 行空板 K10
*/
#include "asr.h"
#include "unihiker_k10.h"
#include <DFRobot_Servo.h>
#include "DFRobot_HuskylensV2.h"
// 动态变量
volatile float mind_n_time;
// 创建对象
HuskylensV2 huskylens;
UNIHIKER_K10 k10;
ASR asr;
Servo servo_P1;
uint8_t screen_dir=2;
// 主程序开始
void setup() {
k10.begin();
pinMode(P0, OUTPUT);
Wire.begin();
while (!huskylens.begin(Wire)) {
delay(100);
}
asr.asrInit(CONTINUOUS, CN_MODE, 12000);
while(asr._asrState == 0){delay(100);}
asr.setAsrSpeed(2);
servo_P1.attach(P1);
k10.initScreen(screen_dir);
k10.creatCanvas();
huskylens.switchAlgorithm(ALGORITHM_FACE_RECOGNITION);
asr.addASRCommand(0+1, "kai deng");
asr.addASRCommand(1+1, "guan deng");
asr.addASRCommand(2+1, "kai feng shan");
asr.addASRCommand(3+1, "guan feng shan");
servo_P1.angle(abs(0));
}
void loop() {
huskylens.getResult(ALGORITHM_FACE_RECOGNITION);
if (asr.isWakeUp()) {
k10.canvas->canvasText("识别中,请说命令词:", 5, 5, 0xFF0000, k10.canvas->eCNAndENFont24, 20, true);
k10.canvas->updateCanvas();
}
else {
k10.canvas->canvasText("休眠中...", 5, 5, 0xFF0000, k10.canvas->eCNAndENFont24, 20, true);
k10.canvas->canvasText("请说\"你好,小行\"", 5, 40, 0x000000, k10.canvas->eCNAndENFont24, 20, true);
k10.canvas->canvasText((String(mind_n_time) + String("秒")), 5, 100, 0x000000, k10.canvas->eCNAndENFont24, 20, true);
k10.canvas->updateCanvas();
}
if (asr.isDetectCmdID(0+1)) {
asr.speak("已经帮你打开灯光啦");
digitalWrite(P0, HIGH);
digital_write(eP12, HIGH);
digital_write(eP14, HIGH);
k10.canvas->updateCanvas();
}
if (asr.isDetectCmdID(1+1)) {
asr.speak("已经帮你关闭灯光啦");
digitalWrite(P0, LOW);
digital_write(eP12, LOW);
digital_write(eP14, LOW);
k10.canvas->updateCanvas();
}
if (asr.isDetectCmdID(2+1)) {
asr.speak("已经帮你打开风扇啦");
digital_write(eP8, HIGH);
k10.canvas->updateCanvas();
}
if (asr.isDetectCmdID(3+1)) {
asr.speak("已经帮你关闭风扇啦");
digital_write(eP8, LOW);
k10.canvas->updateCanvas();
}
if (huskylens.available(ALGORITHM_FACE_RECOGNITION)) {
if ((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), Result, ID)==1)) {
asr.speak((String("你好") + String(RET_ITEM_STR(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), Result, name))));
servo_P1.angle(abs(90));
delay(3000);
servo_P1.angle(abs(0));
}
if ((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), Result, ID)==2)) {
asr.speak((String("你好") + String(RET_ITEM_STR(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), Result, name))));
servo_P1.angle(abs(90));
delay(3000);
servo_P1.angle(abs(0));
}
if (((!(RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), Result, ID)==2)) && (!(RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), Result, ID)==1)))) {
mind_n_time = 0;
while (!((!huskylens.available(ALGORITHM_FACE_RECOGNITION)) || ((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), Result, ID)==2) || (RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), Result, ID)==1)))) {
delay(1000);
mind_n_time += 1;
k10.canvas->canvasText((String(mind_n_time) + String("秒")), 5, 100, 0x000000, k10.canvas->eCNAndENFont24, 20, true);
if ((mind_n_time>5)) {
asr.speak("陌生人");
k10.canvas->updateCanvas();
}
huskylens.getResult(ALGORITHM_FACE_RECOGNITION);
}
mind_n_time = 0;
}
}
}

返回首页
回到顶部

评论