5.11 接近感知¶
2020年初爆发的“新冠肺炎(COVID-19)”疫情,全球逾600万人感染此病,近40万人因被感染而罹难。从此我们不仅佩戴口罩出行, 遇到任何陌生人时都刻意保持距离,人与人之间近距离接触是此疫情蔓延的主要传播途径。为了防止陌生人考自己太近, 我们需要给自己的衣服上增加一些装置,检测与他人的距离,当我们的距离过近时,此装置能给我们报警提醒大家“请保持距离”。
BlueFi的集成光学传感器能够实现这一功能。
5.11.1 读取接近度¶
这一节的第一个示例仍然是采用Screen类中多行文本显示子类将接近传感器的数值显示在屏幕上, 我们先观察手与传感器之间距离和接近传感器输出的数值之间关系。示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 | import time
from hiibot_bluefi.sensors import Sensors
from hiibot_bluefi.screen import Screen
sensor = Sensors()
screen = Screen()
show_data = screen.simple_text_display(title="BlueFi Light sensor", title_scale=1, text_scale=2)
while True:
pv = sensor.proximity
show_data[3].text = "Proximity: {}".format(pv)
show_data.show()
time.sleep(0.1)
|
用手慢慢靠近B按钮旁边的集成光学传感器,观察接近度的数值变化。
请你把手与传感器之间距离-sensor.proximity(传感器感知到的接近度)之间的关系列表记录下来。从记录数据明显可以看出, sensor.proximity变化和手-传感器之间距离几乎没有线性关系。换句话数,BlueFi的集成光学传感器中的接近度感知并不等同于测距传感器, 譬如飞秒激光测距、超声波测距、红外 测距等传感器都能给出目标物体和传感器之间的准确距离。 请你将自己记录的数据和手-传感器之间的距离关系绘制成一张图,我们就能明显地看出他们不是线性关系。 但是,我们仍能确定一个基本的规律:目标物体与传感器的距离越近,sensor.proximity的值越大,最大值是255。
事实上,接近度传感器的正确用法是,设置一个接近度阈值,当接近传感器输出的数值大于设定的阈值时,代表目标物体与传感器的距离过小, 产生警报或提示信息即可。
5.11.2 请保持距离¶
下面我们使用设置阈值,当接近度大于设定阈值时,屏幕上显示“Keep the distance”信息提示,5颗RGB像素灯珠显示红色, 并用喇叭发出警告提示音。示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import time
from hiibot_bluefi.basedio import NeoPixel
from hiibot_bluefi.soundio import SoundOut
from hiibot_bluefi.sensors import Sensors
from hiibot_bluefi.screen import Screen
sensor = Sensors()
screen = Screen()
spk = SoundOut()
spk.enable = 1
pixels = NeoPixel()
pixels.brightness = 0.1
pixels.clearPixels()
show_data = screen.simple_text_display(title="BlueFi Light sensor", title_scale=1, text_scale=2)
while True:
pv = sensor.proximity
if pv<1:
show_data[3].text = ""
pixels.clearPixels()
else:
show_data[3].text = "Keep the distance!"
show_data[3].color = screen.RED
pixels.fillPixels((255,0,0))
spk.play_midi(60, 16)
show_data.show()
time.sleep(0.1)
|
BlueFi执行示例程序期间,我们用手靠近BlueFi的集成光学传感器,你会听到急促的提示音,5颗全红色的警示灯亮起, LCD屏幕上也有相应的红色文字提示“Keep the distance!”。
实现本示例功能的关键程序语句是“while True:”循环程序块内的条件判断, 如果sensor.proximity接近度值小于1(即等于0)则清除多行文本显示的第3行文本内容,并关闭5颗RGB像素灯珠;否则,说明有物体接近, 则让多行文本的第3行显示“Keep the distance!”且文本颜色为红色,并让5颗RGB像素灯珠显示全红色,同时让喇叭播放第60号midi音调, 并持续1/16拍。
至此,你是否已经能设计一件“独特的衣服”,穿着这件衣服出门,遇到任何与你距离过近的人,都会发出声、光警示,提醒你们保持距离。