很遗憾,在尝试了各种方法都没有解决这个问题之后,我来到这里。
我的想法是:
我需要一个名为Led的类,该类在构造函数中只需接受GPIO引脚,并提供以下方法:
- Light On(点亮)
- Light Off(熄灭)
- Blinking(闪烁)
我的做法是:
我已经按照以下方式构建了这个类:
import RPi.GPIO as GPIO
import time
import threading
from threading import Thread
class Led(Thread):
def __init__(self, led_pin):
Thread.__init__(self)
self.pin_stop = threading.Event()
self.__led_pin = led_pin
GPIO.setmode(GPIO.BCM)
GPIO.setup(self.__led_pin, GPIO.OUT)
def low(self, pin):
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.LOW)
def blink(self, time_on=0.050, time_off=1):
pin = threading.Thread(name='ledblink',target=self.__blink_pin, args=(time_on, time_off, self.pin_stop))
pin.start()
def __blink_pin(self, time_on, time_off, pin_stop):
while not pin_stop.is_set():
GPIO.output(self.__led_pin, GPIO.HIGH)
time.sleep(time_on)
GPIO.output(self.__led_pin, GPIO.LOW)
time.sleep(time_off)
def __stop(self):
self.pin_stop.set()
def reset(self):
GPIO.cleanup()
def off(self):
self.__stop()
def on(self):
self.__stop()
GPIO.output(self.__led_pin, GPIO.LOW)
GPIO.output(self.__led_pin, GPIO.HIGH)
blink 方法负责无限制地闪烁 LED,直到出现 Off 或 On 方法调用。
运行以下简单代码:
from classes.leds import Led
import time
from random import randint
Led16 = Led(16)
def main():
while True:
if (randint(0, 1) == 1):
Led16.blink()
else:
Led16.off()
time.sleep(2)
if __name__ == "__main__":
main()
发生了什么:
Led对象似乎每次调用方法时都会生成一个新的线程,导致GPIO线路在多个线程之间共享。
我的愿望:
我希望保持LED异步闪烁(显然),并且能够控制Led16()对象的状态,也许不需要每次调用其方法时创建新的线程,但是到达这一点时,我有点困惑。
感谢帮助我理解如何实现这个目标。