问题描述
我是编程的新手,我正在构建一个超声波传感器来计算物体与微比特之间的距离。我已经编写了一些代码来在1秒内测量50次距离,但是由于每次测量都略有不同,因此我想使用以距离为元素的数组查找所有50次测量的平均值。如何将全部50个测量值添加到阵列中?这是我到目前为止编写的代码。
from microbit import *
from machine import time_pulse_us
from utime import sleep_us
trig = pin2
echo = pin1
i = 0
while i <= 50:
trig.write_digital(0)
echo.read_digital()
trig.write_digital(1)
sleep_us(10)
trig.write_digital(0)
time = time_pulse_us(echo,1)
distance = (time/2) / 29.1
print(distance)
sleep(20)
i += 1
解决方法
ukBaz提供了良好而全面的answer。另一种方法是保持所有读数的总计。一旦获得50个读数,就将总数除以50。
只有50个样本,这种方法与ukBaz所展示的方法相比并没有真正的优势,在ukBaz中,样本在求平均值之前存储在列表中。如果您有大量样本,那么保持运行总计而不是使用列表可以节省RAM。 microbit v1没有太多的RAM。
请在下面找到一个代码片段来说明这个想法。
NUM_SAMPLES = 50
...
distance = 0
for i in range (NUM_SAMPLES):
distance += fake_distance()
distance = distance / NUM_SAMPLES
顺便说一句,用于测量的信噪比通过采样数量的平方根得到了改善。因此,进行50次测量可使单次测量的信噪比提高约7倍。
,
这个问题的简短答案是创建一个值列表,然后取这些值的平均值。
下面,我修改了您的示例以执行此操作。我创建了一个名为all_readings
的空列表,然后将每个新的读数附加到该列表中。一旦我们获得了50个读数,就可以对列表中的所有值求平均值。
我对您的代码做了一些其他更改,希望对您有所帮助。
- 将代码从传感器读取值放入函数中,以帮助识别代码的哪些位在做什么
- 由于我的micro:bit上没有连接传感器,因此
read_distance
函数无法正常工作,因此我创建了一个名为fake_distance
的新函数,因此可以测试{{1} }函数 - 创建了一个名为
average_reading
的函数来进行求平均值 - 使用了
average_reading
循环,以便读数将永远持续下去 - 创建了一个for循环,该循环将在对值求平均值之前读取传感器50次
使用传感器在micro:bit上运行它时,您可以删除该行:
while True
然后从该行上方的行中取消注释(删除 all_readings.append(fake_distance())
)
#