本文将详细介绍智能镜的设计过程,包括软件的编写、硬件的购买和设计。
镜面显示部分
镜面材料及显示效果
欲完成即能照镜又能显示图片文字的效果,需要用到的材料有:LCD屏幕、原子镜、数据线、充电头、HDMI线。本设计中用到的是7寸的LCD屏幕和10寸的原子镜、13cm18cm的原子镜。根据最后的呈现效果,选用了10寸的原子镜。LCD屏幕使用HDMI线与树莓派连接,同时需要数据线和充电头进行供电。必须直接接电源,而不是用电脑等其他设备供电,否则有可能会导致供电不足,LCD不能正常显示。
所用的材料如下图所示:
13cm18cm原子镜+7寸LCD屏幕显示效果如下图:
10寸原子镜+7寸LCD屏幕显示效果如下图:
显然,10+7的呈现效果更佳,人像照得更为清晰。由于LCD屏幕的亮度较低,且原子镜的折射率也不是非常好,导致在白天很难看清屏幕上的字和图片;本设计在夜晚使用效果较好。
网页部分
页面样式
镜面上呈现的文字、图片信息是使用了网页技术。网页的样式如下图所示:
基本都是常规的CSS设置。在CSS的设计中,为了实现自适应屏幕的尺寸,对元素块的设置均使用了百分比的形式。
内容填充
页面呈现的内容包括:天气预报、新闻热搜、每日一句、日期、时间、城市。其中,日期和时间使用jquery自带的函数即可获取当前时刻的信息,这部分的内容封装在main.js的gettoday()和gettime()函数中。而其余的信息需要通过接口获取。本设计选用的接口是https://www.tianapi.com/中的https://www.tianapi.com/apiview/72、https://www.tianapi.com/apiview/100、https://www.tianapi.com/apiview/129、https://www.tianapi.com/apiview/43。
这些接口的调用本设计是使用jquery的get方法,获取接口信息,进而进行内容的填充。
注意:使用本设计的代码时,需要将项目中的magicmirror2/js/main.js中天行数据的密钥改成自己的密钥。
语音识别及硬件控制
这部分实现用户语音输入指令控制室内设备的状态。包括录制音频、上传音频、语音识别、调用子函数。由于树莓派没有音频输入只有音频输出,因此需要外接声卡和麦克风。在淘宝上买一个USB接口的声卡和麦克风即可。
音频录入
在主程序中使用while循环,实时检测环境的音量大小。其原理是不断地录制一小段音频判断该音频的音量大小,当超过阈值时,则认为有用户进行语音输入。for循环的次数(与用于检测的音频大小有关)以及阈值(此处为5000)的大小影响程序判断的正确度。如果录制的音频太小,则由于噪声的存在,系统会频繁的进行语音识别操作。如果阈值过大,则用户距离较远时,无法成功进行音频的录入。
语音识别接口
本设计使用的是https://cloud.baidu.com/product/speech。该接口只提供了API的形式,并提供了示例代码,只需要将代码中的API_KEY和SECRET_KEY改成自己的密钥即可。
事实上前期在选接口的时候,我分别测试了百度、腾讯以及阿里的语音识别接口,其中识别准确度最高的是腾讯的,准确度最低的是阿里的。一开始我尝试使用腾讯的接口,但是腾讯的接口文档实在是写得……github上的示例代码也不能用,会报错。花了两三个星期对这个报错进行解决无果之后,我尝试使用百度的接口。不得不说百度的接口文档写得实在是详细,甚至提供了符合格式的录音文件!
由于进行音频检测时,我截取了一小段音频,会造成音频信息的缺失,因此设定的控制指令为“小镜xx”,而实际判断用户是否有进行音频录入时,则只对后面的有效指令进行判断。例如,用户输入“小镜开门”,只搜索文字中是否含有“开门”这个关键词。
硬件控制部分
使用两个LED灯模拟照明设备和住宅大门,烟雾传感器模块和蜂鸣器模块模拟警报系统。购买清单如下图所示:
硬件接线图如下图所示
实物接线图
对LED灯的控制程序在led.py文件中。对蜂鸣器的控制程序是bee.py文件。
封装
购买雪糕棒、酒精胶等手工制作一个镜框。购买清单如下:
如果任何问题欢迎交流!
QQ:497014168