0

我是编程新手,我正在构建一个超声波传感器来计算物体与 microbit 的距离。我已经编写了一些代码来在 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
4

2 回答 2

3

ukBaz 给出了一个很好而彻底的答案。另一种方法是保持所有读数的总和。一旦你有 50 个读数,将这个总数除以 50。

这种方法只有 50 个样本,与 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 倍。

于 2020-10-23T22:53:58.327 回答
2

对您的问题的简短回答是您创建一个值列表,然后对这些值进行平均。下面我修改了你的例子来做到这一点。我创建一个名为的空列表all_readings,然后将每个新读数附加到它。一旦我们有 50 个读数,然后我平均列表中的所有值。

我对您的代码进行了其他一些更改,希望对您有所帮助。

  1. 将用于从传感器读取值的代码放入函数中,以帮助识别代码的哪些位在做什么
  2. 由于我没有将传感器连接到我的 micro:bit,因此该read_distance功能无法正常工作,因此我创建了一个名为的新功能,fake_distance以便我可以测试我的average_reading功能
  3. 创建了一个调用average_reading来进行平均的函数
  4. 使用了一个while True循环,这样读数将永远持续下去
  5. 创建了一个 for 循环,该循环将在平均值之前读取传感器 50 次

当您使用传感器在 micro:bit 上运行它时,您可以删除该行:

all_readings.append(fake_distance())

#并从该行上方的行中取消注释(删除)

from microbit import *
from machine import time_pulse_us
from utime import sleep_us
from random import randint

display.show(Image.HAPPY)

trig = pin2
echo = pin1

def fake_distance():
    return randint(0, 9)
    
def read_distance():
    trig.write_digital(0)
    echo.read_digital()
    trig.write_digital(1)
    sleep_us(10)
    trig.write_digital(0)
    time = time_pulse_us(echo, 1)
    return (time/2) / 29.1

def average_reading(readings):
    return sum(readings) / len(readings)
    
while True:
    all_readings = []
    for i in range(50):
        # all_readings.append(read_distance())
        all_readings.append(fake_distance())
    avg = average_reading(all_readings)
    display.show(avg)
    print(avg)
    sleep(20)

于 2020-10-23T07:15:18.440 回答