LED淡入淡出 - 实现多线程

时间:2014-06-03 15:15:23

标签: python multithreading rgb led

我正在尝试构建一个通过RaspberryPi控制RGB LED的程序。

我能够使用pi-blaster在python中构建一个简单的淡入淡出程序,它运行正常,但不让我做我想做的事。

这是我的代码:

import time
import sys
import os

blue = 21
green = 23
red = 22


def fade(color, direction, step):
    if direction == 'up':
        for i in range(0, 100, step):
            f=(i/float(100))
            os.system('echo "%d=%f" > /dev/pi-blaster' % (color, f))
        return fade(color, 'down', step)
    else:
        step=-step
        for i in range (100, 0, step):
            f=(i/float(100))
            os.system('echo "%d=%f" > /dev/pi-blaster' % (color, f))
        return fade(color, 'up', step)

input = raw_input("Choose a color (r, g, b): ")
if input == 'r':
    fade(red, 'up', 1)
if input == 'g':
    fade(green, 'up', 1)
if input == 'b':
    fade(blue, 'up', 1)

问题在于我希望能够通过外部脚本/程序控制淡入淡出。

我的想法是拥有一个始终监听用户输入的脚本,因此当我输入“red”时,它会通过调用我之前发布的函数来停止正在进行的淡入淡出并启动一个新的红色。

我也希望能够改变循环的速度,但这已经在“淡入淡出”功能中实现。

我真的不明白我该怎么做。我已经在这里阅读了一些内容,我想我可能不得不使用线程函数,但我真的不明白它们如何适用于我的项目。

先谢谢你的帮助,对不起我的英语感到抱歉,这不是很好:)

编辑:

我使用循环连续检查键盘输入来解决它,然后使用多处理调用淡入淡出功能。

我现在可以使用processName.terminate()

来终止淡入淡出过程

2 个答案:

答案 0 :(得分:3)

要获得更好的性能(并且作为对第一个答案的澄清),使用python编写更好 - 但是每次写入后必须使用' \ n'

否则代码@ daveydave400给出的是

我做这样的事情:

f = open('/dev/pi-blaster', 'w')
f.write('0=120\n')
#or
f.write('0=%s\n'%amount)

我的实际代码在函数中 - 如果你想使用它:

def changer(pin, amount):
    f = open('/dev/pi-blaster', 'w')
    f.write('%d=%s\n'%(pin, str(amount)))

如果使用系统命令方法执行循环,您可能会发现python间歇性地停止侦听键盘输入。这肯定发生在我身上。我发现使用ctrl-c很难实现keyboardinterrupt并且不得不重复按下这些键以使程序停止。现在我用python写作我没有得到那个问题。

答案 1 :(得分:1)

有很多方法可以做到这一点,我将描述一种难以获得所需基本功能的方法,并希望它们可以为您提供有关如何解决此问题的一些想法。困难的方法是创建一个类似守护进程的脚本,该脚本位于后台并读取套接字或文件,以便何时更改它正在执行的操作。这可能是一个很好的学习经历,所以不要害怕尝试这个。这种方法也类似于我在下面描述的简单方法。您将创建一个打开UDP或TCP socket的python脚本,然后启动一个单独的process来调用淡入淡出函数。主进程侦听套接字,当它获得一个新的有效命令(红色,绿色,蓝色,退出等)时,它会杀死子进程并使用新颜色启动另一个进程。你可以使用线程,但我非常确定从父线程中杀死线程并不是那么漂亮,所以你必须使用events / locks和一些全局变量。有很多不同的方法可以做到这一点,但是一个进程/线程的一般想法是监听,一个是衰落将是相同的。

简单/快速的方法是使用一个包装颜色变化的bash脚本(red.sh,green.sh,blue.sh)。在这些脚本中,它们会终止任何以前运行的脚本,然后启动新的淡入淡出命令。知道要杀死什么可以通过几种方式完成,最简单的方法是将PID写入文件,然后当需要被杀死时读取该PID数并将其删除。

我知道我没有提供任何代码而且这很长,但是有很多方法可以做你想做的事情。此外,您应该能够打开/写入" / dev / pi-blaster"直接在python中(不确定以这种方式打开设备文件会起作用):

blaster_file = open("/dev/pi-blaster", "a")
for i in range(100, 0, step):
    blaster_file.write(...)
blaster_file.close()

要更改循环的速度,您可以使用sleep添加延迟,并使用关键字指定持续时间:

from time import sleep
def fade(color, direction, step, delay=0):
    ...
    for i in range(100, 0, step):
        ...
        sleep(delay)
    return fade(color, direction, step, delay=delay)