蓝桥杯树莓派模拟题解析三:“电子测距仪”
2021-07-27牟晓东
牟晓东
本文以模拟题“电子测距仪”为例,进行题目解析。
第三题“电子测距仪”(难度系数3,25个计分点):
在日常生活中,我们经常会需要测量距离,电子测距仪作为一种测距设备,可以很方便地帮助我们测出距离,现制作一个简易的电子测距仪。
硬件准备:
1个按键模块【接入25#引脚】,1个数码管【接入IIC接口】,1个超声波传感器【接入超声波专用接口】,杜邦线若干。
编程实现:
(1)程序开始时,数码管没有显示;
(2)当按键按下并且按住时,数码管显示当前设备测试的距离值(只显示整数部分),测量显示的距离范围为2-400cm;
(3)当测量到的距离大于400或者小于2cm时,数码管显示4个0;
(4)当按键松开时,数码管不显示;
(5)如此循环。
判断标准:
3分:实现“编程实现”中的(1);
5分:实现“编程实现”中的(2);
7分:实现“编程实现”中的(3);
5分:实现“编程实现”中的(4);
5分:完全符合题意。
1.审题
“电子测距仪”的关键考点是使用分支选择结构的嵌套,将超声波传感器检测到的不同范围距离值在数码管上进行显示;另外,还必须要特别注意数码管的使用前设置(如先关闭再调节亮度等),以及如何单独控制各个数字位的数据显示。
(1)通常使用的HC-SR04超声波传感器的有效测距范围为2-400cm,数码管则最多可显示四位数字;因此,题目中的要求(2)其实也只是使用了右侧的1号、2号和3号低位数码管,最左侧的0号是处于“空闲”状态。
(2)超声波传感器进行测距的返回值为9位小数,必须在输出至数码管显示前进行“取整”操作;还要将这个三位数进行百位、十位和个位的逐一“分解”,分别输出至数码管的1号、2号、3号,这步操作是该题的难点,需要使用数学中的“除法”和“取余数”相结合的操作方法来实现。
(3)按键的编程控制部分需要使用“获取25号按钮检测结果”语句,其返回结果为0和1,分别对应“松开”和“按下”两种状态。
2.实验器材的安装
按照题目要求,将按键模块接入25号的三个引脚;超声波传感器有四个引脚,接入专用接口(扩展板的20和21号);将数码管的四个引脚(VCC、GND、SCL和SDA)接入IIC接口(Up列);最后,给树莓派接通电源,启动操作系统(如图1)。
3.编程实现“电子测距仪”
(1)进入平台编程环境
访问古德微机器人平台(www.gdwrobot.cn)。
(2)数码管的“预处理”
数码管在调用前必须要先进行“关闭”的操作,而且题目(4)也明确有“按键松开时不显示”的要求;由于数码管的关闭需要逐个进行,为减少代码数量,此时应该考虑建立函数“关闭数码管”,顺序关闭0-3号数码管。同时,在程序开始调用该函数后,添加一条“设置0号数码管的亮度为1”语句。
(3)构建“外层”分支选择结构
建立变量“按键”,为其赋值为“获取25号按钮检测结果”;接着建立“如果…执行…否则…”分支选择结构,对变量“按键”的值是否为1进行判断,是的话表示为“按下”状态,准备实现题目中(2)和(3)的要求;否的话(值为0),关闭数码管显示,实现题目中(4)的要求。
(4)构建“内层”分支选择结构
如果判断按键为“按下”的状态,则建立变量“距离”,赋值为“超声波测距”,并且增加“获取整数”处理后进行调试信息的LOG区输出;接着再构建“如果…执行…否则…”分支选择结构,判断超声波测量的距离值是否在2-400cm的正常测量范围内;否的话,使用“设置0/1/2/3号数码管显示0”四个语句,控制显示4个0,实现题目(3)的要求;是的话,建立变量“百位”、“十位”和“个位”:
为变量“百位”赋值为“距离除以100”,取出该三位数的最高位;
为变量“十位”赋值为先“距离除以100”后取余数、再将余数“除以10”;
为变量“个位”赋值为先“距离除以10”、再将商“取余数”。
最后,分别使用三个“设置1/2/3号数码管显示百位/十位/个位”,其中的“并显示点0”的意思是控制不显示数码管中的小数点。
(5)完善细节
将相关语句按照题目要求放置于“重复当真”的循环结构中,在循环体内的两层分支选择结构的最后均添加一条“等待0.1秒”语句,防止循环过快(如图2)。
4.調试程序
在平台编程环境中点击“连接设备”,正常的话再点击“运行”按钮,对照题目中的各种情况进行多次测试,包括程序开始和按键松开时“数码管不显示”、按键按下并且按住时的正常测距范围(2-400cm)显示实际测量值与超范围时显示4个0(如图3),均实现了题目要求。
最后将程序按照要求保存为“03.txt”,下载并上传至考试系统中即可。
5.程序“升级”
程序代码仍然可以进行两处改写“升级”:
一是不建立变量“按键”,直接在外层分支选择结构中将“获取25号按钮检测结果”作为判断条件,因为该返回值只有0和1,与按键的“松开”与“按下”是对应的——数值“1”在很多编程语言中都是表示逻辑真;二是将数码管显示0的四行语句从主程序中去除,将它们增加至新函数“数码管显示0”中,虽然在主程序中只调用一次,但整体的简洁性会更好(如图4)。
再次运行程序,同样也能够实现题目要求。