做个“不躺平”的树莓派创意闹钟吧
2021-01-18牟晓东
牟晓东
“定时叫醒”可谓是闹钟的最根本功能,但在平时生活中几乎所有人都因想“再睡一会儿”而中止正在叮铃作响的闹钟,结果一不小心就会睡过头而误事。何不利用树莓派和称重仪(压力传感器)等进行图形化编程,开发制作一个“不躺平”的创意闹钟呢?到了预设的时间,只要人不离开床,音箱就会一直喊“该起床啦!”的语音提醒,同时LED灯还会一直闪烁。
实验器材包括树莓派3B+及古德微扩展板一块,称重仪一个,杜邦线若干,音箱一个,红色LED灯一支,小人偶一个。
首先,将称重仪水平放置于平整桌面,四个引脚(VCC电源正极、SCK时钟接口、DT数据接口和GND接地端)通过杜邦线连接至扩展板的20和21号引脚,分别对应VCC、Trig、Echo和GND端;接着,将红色LED灯插入5号引脚,音箱插入树莓派的音频输出孔;最后,给树莓派通电,启动操作系统(图1)。
在浏览器中进入古德微机器人平台,点击“积木”切换至图形化编程界面,开始进行编程:
先编写一个名为“LED灯闪烁”的函数,通过一个“重复3次执行”的循环结构,控制5号红色LED灯进行“亮0.2秒、灭0.1秒”的3次闪烁提醒功能。然后,在主程序中进行称重仪的两步初始化操作:一是设置数据GPIO为21号、时钟GPIO为20号(滤波处理字节保持默认的128不变);二是进行“称重仪去皮处理”(测量的是“净重”)。
接着,在LOG调试信息区显示输出“夜已深,请在10秒内上床休息!”的提示信息,并且等待10秒钟;再建立一个“重复当‘真’执行”的循环结构,内嵌一个“如果…执行…”的选择分支结构,判断条件为“‘获取当前日期和时间的字符串格式’是否大于等于‘2021-11-25 18:05:00’”,后者即为设置的闹钟“定时”,该模块语句的功能是检测当时的系统时间是否到了或超过了闹钟的预设时刻(大于等于),如果条件成立,则先调用“LED灯闪烁”函数、再输出文字信息“该起床啦!”,音箱则进行“该起床啦!”的语音提醒,然后为变量“称重”进行赋值——“获取称重仪上物体的净重”,作用是检测计算称重仪面板上(相当于“床”)物体的质量,并进行输出显示(单位是“克”);接着,对“称重”进行是否小于30的判断(事先已经测量过小人偶的质量大约是198克),条件成立的话,说明“人”已经离开了“床”——此处的30可调的范围比较大(比如100、50等均可,要根据实际实验时所使用道具的实际质量来设置),于是执行“中断循环”,跳出循环,再通过“称重仪结束退出”模块语句实现重置称重仪GPIO口的功能(图2)。
将程序保存后点击“运行”按钮,进行测试。
LOG调试信息区先是出现“夜已深,请在10秒内上床休息!”的温馨提示,将小人偶轻轻放置于称重仪的面板“躺下”,进入正常的睡眠免打扰模式;当时间到了设置的18:05时——刚开始执行程序时是18:02,红色LED灯开始急促地闪烁,同时有“该起床啦!”的文字信息出现于LOG调试信息区,音箱则不断进行“该起床啦!”的语音播报提醒;如果小人偶一直保持“不离开床”的状态(包括站立姿势),这三种形式的叫醒服务都会一直持续下去,而且在LOG调试信息区也会每隔3秒钟就显示一次实时检测到的称重数据:198、198……当从称重仪面板上移走小人偶后,“不躺平”的闹钟系统就认为“人已经起床了”,则中断程序,结束本次“叫醒”服务(图3)。
如果在树莓派中增加OLED显示屏的话,就可以将“该起床啦!”的文字提醒信息进行显示输出;如果有数码管,则可以实现时间的实时显示,或者用来显示“起床”的拖延时间;也可以在判断“起床”动作发生后,让音箱播放比较轻柔的音乐,或是播放天气预报;还可以增加全向麦克风,实现更加智能的人机交互应答;或是增加灯带的多色彩灯珠点亮装饰功能……