Как сделать таймер более эффективным - PullRequest
0 голосов
/ 02 июля 2018

Я довольно новичок в кодировании, и мне интересно, как сделать его более эффективным. Я запускаю его на Raspberry Pi, который будет иметь другие задачи, поэтому я хочу, чтобы это было как можно проще запустить. Код будет использовать магнитный датчик для записи проходов, сделанных магнитом, установленным на колесе, и оттуда определять скорость внешнего диаметра колеса. Было бы полезно реализовать что-то, что берет пять последних выводов скорости и дает своего рода среднее значение, но только если это не сильно влияет на сложность кода. Был бы очень признателен за любую помощь!

from gpiozero import Button
import time
global t0
t0 = time.clock()
raduis = 300
button = Button (21)
from signal import pause

def calculate_speed(radius):
    global t0
    t1 = time.clock
    interval = t1 - t0
    speed = radius/interval
    print (speed, 'mm/sek')

y = True
while y == True:
    button.when_pressed = calculate_speed(radius)
    time.sleep(0.2)
    #used to prevent one pass of the magnet from recording many passes

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

В следующем коде используется модульная арифметика для итерации по одному списку, добавления и перезаписи значений и печати усредненной скорости. Отрегулируйте iterations, чтобы контролировать, сколько проходов будет усреднено.

from gpiozero import Button
from signal import pause
import time

radius = 300
button = Button (21)

iterations = 5
speeds = [0] * iterations
speed_idx = 0

def calculate_speed(radius):
    global speeds, speed_idx
    t1 = time.time()
    speeds[speed_idx] = radius / (t1- t0)
    print (sum(speeds) / iterations, 'mm/sek')
    speed_idx += 1
    speed_idx %= iterations

t0 = time.time()
while True:
    button.when_pressed = calculate_speed(radius)
    time.sleep(0.2)
    t0 = time.time()

Обратите внимание, что для «увеличения» в некотором смысле требуется 5 измерений. Если хотите, вы можете добавить оператор if, чтобы не печатать первые 4 записи.

Кроме того, если вы хотите более плавное измерение скоростей, мне пришло в голову, что вы можете использовать одно значение для хранения суммы скоростей за последние N проходов и каждый раз вычитать среднее (принимая N сумм) и добавьте новую скорость. Для стабилизации потребуется несколько дополнительных проходов, но после этого он должен немного сгладить заявленные скорости.

0 голосов
/ 02 июля 2018

Вы должны сохранить пять последних выходов скорости в массиве (списке), а затем вычислить среднюю скорость

speed_records = []
def calculate_speed(radius):
    global t0
    t1 = time.clock
    interval = t1 - t0
    speed = radius/interval
    print (speed, 'mm/sek')
    speed_records.append(speed) # Adds one speed record to the list
    if len(speed_records) >= 5: # checks if there are 5 five records available
        last_five_records = speed_records[-5:] # Seperates five last records
        average = sum(last_five_records) / 5
        print('Average Speed:',average) # Prints out the average
    if len(speed_records) > 10: # Free Up some memory
        speed_records = list(set(speed_records) - set(speed_records[:5])) #removes the first five records 
...