创客教育论坛优秀案例展示-scratch创意应用:语音温度计
2015-08-25 11:23:49郑薇
温度是一种最基本的环境参数,因此研究温度的测量方法和装置具有重要的意义。温度计是测温仪器的总称,水银玻璃温度计和酒精温度计就是我们日常生活中最常见的温度计。人们必须通过读取刻度值的多少来测量温度。水银玻璃温度计虽然测量准确,价格低廉,但同时也有不容易读数、易碎等缺点。
这时我们会想到要是有一种能自己测量温度,并将测量的温度用语音播报出来的仪器就好了,这样就可以发挥我们听觉的优势,弥补完全用视觉信号传递信息的不足,解放我们的双眼,快速、直接地获取温度信息。因此,这里我们用labplus乐动魔盒来做一个语音温度计,一起来动起来吧!
所需材料
labplus软件:我们使用的是labplus版的scratch,它是根据盛思乐动魔盒特别改进的一个版本,在官方版的基础上主要添加了识别外部连接的传感器的模块,能够很便捷地获取外界信息。
图1 labplus版scratch软件界面
乐动魔盒:它是用来连接软件和温度传感器的感应装置,将温度的实时变化数据传给电脑,然后再在电脑上用软件对数据进行处理。
图2 乐动魔盒主板
热敏电阻:我们采用的是100kω的热敏电阻,温度感应范围在-40~125℃。
数字化温度传感器:为更加精确和方便地校准热敏电阻,我们采用数字化温度传感器,它能根据需求设计采集频率,并将采集的温度数据通过电脑存储下来,和我们用热敏电阻同步测量的数据进行分析,方便对热敏电阻进行标定。
图3 数字化温度传感器
设计思路
语音温度计最重要的功能是把所测量物体的温度用声音的方式显示出来。第一步,要通过热敏电阻获得真实的温度。找到我们所用的热敏电阻的数值与真实温度的数值一对一的对应关系,将这种对应关系插入在excel表格中,再通过曲线分析功能,找到真实温度与热敏电阻的值的函数表达式。第二步,在得到了准确的温度后,我们要通过编程将温度信息用语音播报出来。在这里有两种思路,一个是直接将所需要的温度的音频全部都准备好(1~99℃,共99段音频),这种方法比较直接,操作简单,但操作量较大,适用范围小,无法拓展。另外一种方法是找到读数的规律,利用所获得的规律及侦测完成语音播报,减少所需音频(只需数字1~10和引导语),但在程序编译过程相对前一种较复杂。这里我们选择了第二种方法,因为这种方法更能体现语音温度计的特点和创造力。
温度测量程序
将热敏电阻接入乐动魔盒的a输入端口(其实4个输入端口都是一样的,这里以a端口为例),打开labplus软件,连接电脑与乐动魔盒,保证通信正常,此时在乐动魔盒中,对应的a端口传感器的值会发生相应的变化,但这个测量只是一个相对量,它的范围是0~100。而我们需要的是真实的温度读数,所以不能直接使用这个相对值。如果找到传感器的相对值与真实的温度的对应关系,这个问题也就解决了。
图4 接入热敏电阻
采集同一时刻、同一物体的实时温度及热敏电阻的值,将所获得的数据插入到excel表中的散点图,通过添加趋势线获得实时温度与热敏电阻的值的函数表达式。这一部分采集的值越多越全面,语音温度计的测量就越准确。
我们用labplus的数字化温度传感器采集实时温度,用乐动魔盒采集热敏电阻的值。
设定好两个传感器的采集频率相同,比如,0.5s采集一次。
准备一个杯子,里面放适量的开水,将温度传感器和热敏电阻同时放入开水中。
图5 同时测量,并采集数据
让开水自由冷却,直至降到室温左右,温度不再变化时,向杯中缓慢注入冰水,直至整个杯子中的水接近冰水的温度时,停止加水,记录好整个过程中温度传感器和热敏电阻测量值的同步变化情况。
将两个测量值导入到excel表中。如图6所示。
图6 数据对照表
插入散点图,添加趋势线,根据曲线规律,用3次多项式拟合,选择显示公式,这样就得到了热敏电阻的值与实时温度的关系,即y=-0.0005x3 0.06912x2-3.58021x 92.77518(y表示真实温度,x表示热敏电阻的值)。
图7 数据拟合曲线图
对应程序编译先添加一个变量“温度”,然后用scratch语言来表达这个公式。如图8所示
图8 数据转换代码
语音播报程序
首先,准备我们需要的音频(数字1~10和引导语)。scratch支持语音录制功能,那我们自己录制就好啦。
录制音频的操作步骤:
1. 单击“声音”,切换到音频的界面;
2. 单击“录入新声音”,准备录入;
3. 单击“开始录入”;
4. 单击“结束音频录入”;
5. 在名称框内为录音命名,如“1”
图9 音频录制
这样就完成了一个录入,点击播放,自己试听,看看效果怎么样。按照这样的方法,一共录入“1~10”的语音,另外还有一段“当前温度”的引导语。注意摆放的顺序,把语音按由小到大的顺序依次排列。这个很重要,会关系到后面的内容。
现在来考虑一下怎么播报语音,先来分析一下语音播报的规律:因为测定温度的对象为室温或热水的温度等,一般都在0~100℃,而这些数据都是两位数。所以我们重点考虑怎么读出一个两位数。根据大家平常遵循的读数习惯,先读十位,再读个位。我们采用的十进制从1到10的10个数。我们把0排除在外,当温度<10℃时,直接读取个位,没有“零十”这个说法。
根据上面总结的规律,对应程序设计步骤:
(1)判断温度值的字符长度,如果温度值有两位数,先读出十位数和“十”,如果温度值只有一位数或数字为0,就不读出,读完之后,等待1s,传递预备读个位的信息。
(2)接受上面步骤的信息,读出个位上的数值。
在上述步骤中有个共同要解决的问题是,我们如何能够判定出温度个位和十位上的数字。先添加两个变量:一个“个位”,一个“十位”,在温度的数值为两位数时,十位上的数字可能的情况是1~9这9种情况,这时我们就要做一个相当于猜数字的游戏,我手中有一个“1~9”的整数,我从1开始猜,猜对了就进入下一步,猜错了,加1再猜,这样猜9次的话就一定能猜对。如果找到了那个对应的数,这个时候就播放对应的语音。
我们把十位数上播报的音频分为3段:“当前温度”加“x”加“十”,如果十位数是2,那么播放的语音就是“当前温度:二十”。关于十位的任务便完成了,同时把判断个位的消息发出去。
图10 温度>10℃时
如果温度<10℃的话,十位上是没有数的,就播放个位上的数。
图11 温度<10℃时
我们在代码的末尾加上“等待1秒”,是为了让语音听起来没有急迫感。“停止当前脚本”是为了防止两段语音同时播放的状况发生。关于播放十位上的语音的完整代码如图12所示。
图12 十位上的语音播报程序代码
播放个位位置的数,设计思路和播放十位位置的数一样。所以我们可以复制关于十位播报的程序。
在被复制的代码上单击右键,选择复制,修改参数即可。
在个位上的情况主要是两种:(1)温度在10℃以上是2个字符;(2)温度小于10℃是1个字符。它们的判断条件不同,大于10℃的条件是变量“个位”和变量“温度”的第二个字符相等,小于10℃的条件是“个位”直接等于变量“温度”。
(全文详见《无线电》杂志2015年第8期)