2017-01-22 2 views
1

Я огляделся вокруг, пытаясь найти способ, который будет исчезать между одним цветом в Python. Большинство примеров, которые я нашел, обычно относятся к устройству или другому языку, который не хорошо переводится.Python - RGB LED Color Fading

В настоящее время у меня есть модифицированный фрагмент кода, который использовался для создания эффекта дыхания, который работал довольно хорошо, исчезая от 0 до 255, например. Теперь у меня установлен цвет from, скажем, зеленый; мерцает; затем устанавливает to цвет:

def colorFade(strip, colorFrom, colorTo, wait_ms=20, steps=10): 
    steps = 200 

    step_R = int(colorTo[0])/steps 
    step_G = int(colorTo[1])/steps 
    step_B = int(colorTo[2])/steps 
    r = int(colorFrom[0]) 
    g = int(colorFrom[1]) 
    b = int(colorFrom[2]) 

    for x in range(steps): 
     c = Color(int(r), int(g), int(b)) 
     for i in range(strip.numPixels()): 
      strip.setPixelColor(i, c) 
     strip.show() 
     time.sleep(wait_ms/1000.0) 
     r += step_R 
     g += step_G 
     b += step_B 

Телефонный код:

colorFade(strip, [200, 0, 0], [0, 200, 0]) 
+2

Попробуйте с помощью '' steps = 200.0'' - вы, вероятно, неправильно вычисляете переменную step_R/G/B из-за целочисленного деления. – jasonharper

+0

Трудно работать с вопросом, который меняется. Может быть, потребуется некоторое время и сделать * one * edit? –

+0

Как это написано в настоящее время, вы назначаете «шаги» в первой строке функции, маскирующей args шагов. –

ответ

2

Это звучит, как вы хотите, чтобы начать на colorFrom, и постепенно шаг по прямой линии, пока вы не достигнете colorTo.

Что делает этот код начинается в colorFrom, то приращение текущего цвета, как будто вы наступали из черного к colorTo.

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

step_R = int(colorTo[0])/steps 
step_G = int(colorTo[1])/steps 
step_B = int(colorTo[2])/steps 

с этим:

step_R = (colorTo[0] - colorFrom[0])/steps 
step_G = (colorTo[1] - colorFrom[1])/steps 
step_B = (colorTo[2] - colorFrom[2])/steps 

Edit: И, как jasonharper отметил, вас может выполнять целочисленное деление. Неясно, каковы ваши типы. Если вы используете Python 2, / является целым делением. В Python 3 это плавающая точка.

+0

Ницца спасибо. Я должен был держать шаги как int, потому что библиотека, которую я использую, не поддерживает плавающие числа для цвета. Он работает очень хорошо и плавно. – Timmo

+0

Ну, вы можете сделать их плавающей точкой внутри и просто конвертировать в 'int' при настройке цветов (что похоже на код, который он уже делает). Возможно, это будет немного более гладко. –