基础任务三的要求是:设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警。
开始的时候,我看了下视频培训的提示,说是可以用红外传感器的库来实现。可是我看了下ir库,发现功能是编解码。又看到有的网友用红外发射后再读取的方法,试了下效果不太好。于是就改用超声波来做。
超声波模块的用法是读取返回波的用时,然后乘以声速,计算出距离。这种方式也会受空气温度密度的影响,但是比红外准多了。
用的时候只要用VOUT供5V电,再占用2个IO就可以了:
import board,digitalio
import time
from adafruit_circuitplayground import cp
echo_pin = digitalio.DigitalInOut(board.A1)
trigger_pin = digitalio.DigitalInOut(board.A2)
trigger_pin.switch_to_output()
def get_distance():
trigger_pin.value = True
time.sleep(0.00001)
trigger_pin.value = False
while echo_pin.value == False:
pass
start_time = time.monotonic()
while echo_pin.value == True:
pass
end_time = time.monotonic()
elapsed_time = end_time - start_time
distance = elapsed_time * 34300
return distance
while True:
distance_cm = get_distance()
m = distance_cm / 100
inches = distance_cm / 254
print(f"Distance: {m}m | {distance_cm} cm")
cp.pixels.fill( (0,0,0) )
if distance_cm <20:
cp.pixels.fill( (255,0,0) )
cp.play_file('distance.wav')
time.sleep(0.5)
当距离小于20cm时,亮起红灯,并播放“注意保持距离”。
播放用的是标准库的play_file方法。按照官网的介绍 (https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/play-file),声音文件支持PCM 16-bit 单声道 WAV格式,采样率22KHz。于是用goldwave5做了一下转换。顺便说一下,官网介绍的转换工具没goldwave5好用。
最后效果是这样的:
本帖最后由 nemon 于 2024-8-31 19:07 编辑