Интерполировать между элементами в массиве с плавающей запятой

Я получаю список из 5 поплавков, которые я хотел бы использовать в качестве значений для отправки ШИМ на светодиод. Я хочу плавно изменять количество миллисекунд между элементами в массиве.

Итак, если это мой массив...

list = [1.222, 3.111, 0.456, 9.222, 22.333]

Я хочу перейти с 1,222 до 3,111, скажем, за 3000 миллисекунд, затем с 3,111 до 0,456 за то же время, и когда он дойдет до конца списка, я хочу, чтобы 5-й элемент списка увеличивался до 1-го элемента список и продолжать до бесконечности.


person Tommy Martinez    schedule 18.10.2016    source источник
comment
Разделите разницу между двумя числами на количество раз, которое вы собираетесь обновлять светодиод. Затем добавляйте эту разницу в цикле к первому значению при каждой отправке. Это школьная арифметика.   -  person Barmar    schedule 18.10.2016


Ответы (2)


вы думаете о чем-то подобном?

import time
l = [1.222, 3.111, 0.456, 9.222, 22.333]

def play_led(value):
    #here should be the led- code
    print value

def calc_ramp(given_list, interval_count):
    new_list = []
    len_list = len(given_list)
    for i in range(len_list):
        first = given_list[i]
        second = given_list[(i+1) % len_list]
        delta = (second - first) / interval_count
        for j in range(interval_count):
            new_list.append(first + j * delta)
    return new_list

def endless_play_led(ramp_list,count):
    endless = count == 0
    count = abs(count)

    while endless or count!=0:
        for i in range(len(ramp_list)):
            play_led(ramp_list[i])
            #time.sleep(1)
        if not endless:
            count -= 1
        print '##############',count


endless_play_led(calc_ramp(l, 3),2)
endless_play_led(calc_ramp(l, 3),-2)
endless_play_led(calc_ramp(l, 3),0)
person am2    schedule 18.10.2016
comment
Вам нужно сохранить каждое значение, если вы не используете ABS и WISE. Требуется сравнить каждое значение для step_up или step_down. Вы видели какую-нибудь переменную для сохранения текущего значения? - person dsgdfg; 18.10.2016
comment
Необходимо использовать _clk для связи или времени отклика микроконтроллера, _sensitvy установить время для всей обработки без ошибок. - person dsgdfg; 18.10.2016
comment
@dsgdfg: почему (ABS/WISE)? вы разделяете дельту на знак и значение, и единственное место, где вы его используете, — это когда вы добавляете продукт в _from. если бы вы не разделились, было бы то же самое. - person am2; 18.10.2016
comment
@dsgdfg: _clk/_sensitivity: вы хотите убедиться, что существует задержка не менее 40 мс, прежде чем вы скажете MC, чтобы переключить светодиод. Я правильно это понял? - person am2; 18.10.2016
comment
LOL, вы касаетесь важной точки, step это constant output_step_value, но _clk это constant step_timer_value для каждого шага. - person dsgdfg; 18.10.2016
comment
@dsgdfg: Извините, я не понимаю ваш последний комментарий. шаг вычисляется из положительной разницы между _from и _to, почему он не должен быть отрицательным? единственная причина для мудрых состоит в том, чтобы сохранить знак. _clk рассчитывается как временная подвеска к шагу, всегда положительная. В чем причина смеха? - person am2; 18.10.2016
comment
Возможно, все значения _ramplist не положительные! Whats the reason for laughing ? мое воспоминание! - person dsgdfg; 18.10.2016
comment
@dsgdfg: кстати, вы вычисляете свое значение вне цикла ожидания. Если вы пропустите один шаг, как минимум 1 значение не придет вовремя. Может быть, было бы лучше, если бы вы вычисляли внутри оператора цикла if-. так что вы можете даже использовать правильное время для расчета. - person am2; 18.10.2016
comment
@dsgdfg: в моей операции функция не должна гарантировать отсутствие отрицательных входных значений - person am2; 18.10.2016
comment
Ничего не рассчитывайте, потому что i try write a SCL function время важно для связанного вопроса. SCL нужно 3 аргумента start, end, time но где шаг? Шаг time/micro-controller scaning time. - person dsgdfg; 18.10.2016
comment
@dsgdfg: И после множества циклов он будет отложен, потому что вы всегда перезапускаете таймер. Было бы лучше взять таймер вне цикла for и управлять им по модулю. (Конечно, у моего решения та же проблема.) - person am2; 18.10.2016
comment
@dsgdfg: что такое SCL? - person am2; 18.10.2016
comment
SCL Значение функции условного отображения (так SCALA). Вам нужно подумать обо всем состоянии процессора, если вы хотите написать отличный ACCELERATION/DECELERATION. Вам нужно обойти значения каждого шага, если за исключением безусловной ЗАДЕРЖКИ. Делайте больше упражнений о Scala + map, всегда выявляйте больше ошибок/ошибок, если у вас есть больше отзывов (также используйте для обратной связи float clock). Все компьютеры в мире одновременно могут запустить только один процесс. Я имею в виду, что мы не настоящие! Потому что мы не живем в РЕАЛЬНОМ ВРЕМЕНИ! - person dsgdfg; 23.11.2016

другая версия, похожая на версию dsgdfg (на основе его/ее идеи), но без временной задержки:

import time
list_of_ramp = [1.222, 3.111, 0.456, 9.222, 22.333]

def play_LED(value):
    s = ''
    for i in range(int(value*4)):
        s += '*'           
    print s, value

def interpol(first, second, fract):
    return first + (second - first)*fract

def find_borders(list_of_values, total_time, time_per_step):
    len_list = len(list_of_values)
    total_steps = total_time // time_per_step
    fract = (total_time - total_steps * time_per_step) / float(time_per_step)
    index1 = int(total_steps % len_list)
    return [list_of_values[index1], list_of_values[(index1 + 1) % len_list], fract]

def start_program(list_of_values, time_per_step, relax_time):
    total_start = time.time()
    while True:
        last_time = time.time()
        while time.time() - last_time < relax_time:
            pass
        x = find_borders(list_of_values,time.time(),time_per_step)
        play_LED(interpol(x[0],x[1],x[2]))

start_program(list_of_ramp,time_per_step=5,relax_time=0.5)
person am2    schedule 18.10.2016