【问题标题】:LED fade in python - implementing multithreadingpython中的LED淡入淡出-实现多线程
【发布时间】:2014-06-03 15:15:23
【问题描述】:

我正在尝试构建一个通过 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() 终止淡入淡出进程

【问题讨论】:

    标签: python multithreading rgb led


    【解决方案1】:

    为了获得更好的性能(并作为对第一个答案的澄清),使用 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)))
    

    如果使用系统命令方法执行 for 循环,您可能会发现 python 会间歇性地停止侦听键盘输入。这肯定发生在我身上。我发现使用 ctrl-c 很难实现键盘中断,必须反复敲击这些键才能让程序停止。现在我正在用 python 写,我没有遇到这个问题。

    【讨论】:

    • 这个答案是金块。我想从 Java 写到 pi-blaster。无法让它为我的生命工作!在末尾添加“\n”解决了这个问题。对于使用 Java 写入 /dev/pi-blaster 时遇到问题的任何人,这就是您所要做的。
    • @YuriBrigance ,这有点离题了。你的java实现如何?有效果吗?我也在尝试同样的方法。但到目前为止,我看到的是我的伺服器只响应 0.1 、 0.25 而不是 120 之类的值。有什么猜测吗?
    • 唐,同样的故事。它工作得非常好,但我必须在 0.1 和 0.25 左右之间进行插值。并且每秒写入 pi-blaster 的速度不超过 30 次
    【解决方案2】:

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

    简单/快速的方法是使用 bash 脚本来包装颜色更改(red.sh、green.sh、blue.sh)。在这些脚本中,它们会杀死任何以前运行的脚本,然后启动新的淡入淡出命令。知道要杀死什么可以通过多种方式完成,最简单的可能是将 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 添加延迟并使用关键字指定持续时间:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      相关资源
      最近更新 更多