Как мне добавить несколько числовых значений, полученных из предыдущих алгоритмов, в массив, чтобы выполнить некоторые вычисления в редакторе Python MU для микробита?

Я новичок в программировании и строю ультразвуковой датчик для расчета расстояния объекта от микробита. Я написал несколько кодов для измерения расстояний 50 раз за 1 секунду, но, поскольку каждое измерение немного отличается, я хочу найти среднее значение всех 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

person Parvesh D. Singh    schedule 23.10.2020    source источник
comment
Какая связь с JavaScript?   -  person Randy Casburn    schedule 23.10.2020


Ответы (2)


ukBaz дает хороший и подробный ответ. Другой метод заключается в подсчете всех показаний. Когда у вас будет 50 показаний, разделите это количество на 50.

Имея всего 50 выборок, этот метод не имеет реального преимущества перед методом, показанным ukBaz, где выборки сохраняются в списке перед усреднением. Если у вас есть большое количество сэмплов, сохранение промежуточного итога вместо использования списка может сэкономить ОЗУ. В microbit v1 не так много оперативной памяти.

Пожалуйста, найдите фрагмент кода ниже, чтобы проиллюстрировать эту идею.

NUM_SAMPLES = 50
...
distance = 0
for i in range (NUM_SAMPLES):
    distance += fake_distance()
distance = distance / NUM_SAMPLES

Кроме того, отношение сигнал/шум для измерения улучшается на квадратный корень из числа взятых выборок. Таким образом, выполнение 50 измерений улучшает отношение сигнал/шум по сравнению с одним измерением примерно в 7 раз.

person Oppy    schedule 23.10.2020

Краткий ответ на ваш вопрос заключается в том, что вы создаете список значений, а затем усредняете эти значения. Ниже я изменил ваш пример, чтобы сделать это. Я создаю пустой список с именем all_readings и добавляю в него каждое новое чтение. Когда у нас есть 50 показаний, я усредняю ​​все значения в списке.

Я сделал несколько других изменений в вашем коде, которые, я надеюсь, вы найдете полезными.

  1. Поместите код для считывания значения с датчика в функцию, чтобы определить, какие биты кода что делают.
  2. Поскольку к моему микробиту не подключен датчик, функция read_distance не работала, поэтому я создал новую функцию под названием fake_distance, чтобы проверить свою функцию average_reading.
  3. Создал функцию под названием average_reading для усреднения
  4. Использовал цикл while True, чтобы показания продолжались вечно
  5. Создан цикл for, который будет считывать датчик 50 раз перед усреднением значений.

Когда вы запускаете его на своем микробите с датчиком, вы можете удалить строку:

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)

person ukBaz    schedule 23.10.2020
comment
Большое спасибо! Я до сих пор плохо разбираюсь в функциях, поэтому этот метод действительно помог мне понять, как лучше его использовать. - person Parvesh D. Singh; 26.10.2020