python中实现多线程的LED淡入

2024-06-08 07:22:32 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我能够使用pi-blaster在python中构建一个简单的fade程序,这很好地工作,但是不能让我做我想做的事情。在

我的代码是:

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”时,它会通过调用我之前发布的函数来停止正在进行的淡入,并开始一个新的红色淡入。在

我也希望能够改变循环的速度,但这已经在“fade”函数中实现了。在

我真不明白我怎么能做到这一点。我在这里读过一些东西,我想我可能不得不使用线程函数,但我不太明白这些函数如何适用于我的项目。在

提前感谢您的帮助,对不起我的英语不是很好:)

编辑:

我通过循环检查键盘输入来解决这个问题,然后通过多重处理调用fade函数。在

我现在可以使用进程名.终止()


Tags: 函数import程序inputifossteppi
2条回答

为了获得更好的性能(作为对第一个答案的澄清),使用python编写要好得多,但是每次写入之后都必须加上一行“\n”

否则@daveydave400给出的代码是正确的

我在做这样的事情:

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

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

^{pr2}$

如果使用system命令方法执行for循环,您可能会发现python会间歇性地停止监听键盘输入。这对我来说确实发生了。我发现用ctrl-c很难实现键盘中断,必须反复按这些键才能让程序停止。现在我在用python写文章,我不知道这个问题。在

有很多方法可以做到这一点,我将描述一个困难的方法和一个简单的方法来获得你想要的基本功能,希望他们能给你一些想法,你想如何解决这个问题。困难的方法是创建一个类似守护进程的脚本,该脚本位于后台并读取套接字或文件,以确定何时更改其所做的操作。这可能是一个很好的学习经验,所以不要害怕尝试这个。这个方法也类似于我下面描述的简单方法。您将创建一个python脚本来打开UDP或TCP socket,然后它启动一个单独的process,该脚本调用fade函数。主进程监听套接字,当它获得一个新的有效命令(红色、绿色、蓝色、quit等)时,它终止子进程,并用新的颜色启动另一个进程。您可以使用线程,但我敢肯定从父级删除线程并不那么好,所以您必须使用events/锁,也许还需要一些全局变量。有很多不同的方法可以做到这一点,但是一个进程/线程监听一个进程/线程的衰落将是相同的。在

简单/快速的方法是使用bash脚本来包装颜色更改(红色.sh, 绿色.sh, 蓝色.sh). 在这些脚本中,它们会杀死以前运行的任何脚本,然后启动新的fade命令。知道要杀死什么有几种方法,最简单的方法可能是将PID写入一个文件,然后当需要终止时,读入该PID编号并终止它。在

我知道我没有提供任何代码,这是很长的,但有很多方法可以做你想做的。另外,您应该能够直接在python中打开/写入“/dev/pi blaster”(不确定这样打开设备文件是否有效):

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

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

^{pr2}$

相关问题 更多 >

    热门问题