当树莓派上的按钮被按下时,连续闪烁LED



我不懂Python,但我在原型类中使用它。我想做的是使用我的RPi上的GPIO引脚来点亮LED。那部分我拿到了,没问题。但现在我想添加一个按钮,让它在按下按钮时闪烁,并在按钮释放后继续闪烁。是这样的:领导,按钮按下,领导,领导,领导,领导,继续,继续,领导,领导,领导,领导,继续,继续,直到永远。这是我的文件:

import RPi.GPIO as GPIO
import time
def blink(pin):
    GPIO.output(11, GPIO.LOW)
    time.sleep(.2)
    GPIO.output(11, GPIO.HIGH)
    time.sleep(.2)
    GPIO.output(11, GPIO.LOW)
    time.sleep(.2)
    GPIO.output(11, GPIO.HIGH)
    time.sleep(.2)
    GPIO.output(11, GPIO.LOW)
    time.sleep(.2)
    GPIO.output(11, GPIO.HIGH)
    time.sleep(4)
def main():
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(11, GPIO.OUT)
    GPIO.setup(16, GPIO.IN)
    GPIO.output(11, GPIO.HIGH)
    while True:
        if GPIO.input(16):
            blink(11)
        else:
            pass
        time.sleep(.1)
    GPIO.cleanup()
if __name__ == "__main__":
    main()

这似乎只使它在按下按钮后立即闪烁,而不是持续闪烁。

我怎样才能解决这个问题?

你想让它停止闪烁吗?如果不是:

blinking = False
while True:
    if GPIO.input(16):
        blinking = True
    if blinking:
        blink(11)
    time.sleep(.1)

你原来的东西反复检查输入16(按钮状态),并在按钮按下时调用一次blink()函数;下次你到达while True的顶部,输入16没有设置,blink()不会被调用。

(如果您在不同的输入引脚上有第二个停止按钮,您可以添加另一个GPIO.input()检查,并将blinking设置为false。)

请注意,您正在将输出引脚编号11传递给blink函数,但没有使用传递的值;要使该函数更通用,可以将其更改为:

def blink(pin):
    GPIO.output(pin, GPIO.LOW)
    time.sleep(.2)
    GPIO.output(pin, GPIO.HIGH)
    time.sleep(.2)
    GPIO.output(pin, GPIO.LOW)
    time.sleep(.2)
    GPIO.output(pin, GPIO.HIGH)
    time.sleep(.2)
    GPIO.output(pin, GPIO.LOW)
    time.sleep(.2)
    GPIO.output(pin, GPIO.HIGH)
    time.sleep(4)

你的问题很容易解释。当程序休眠时,它就会休眠。什么也不会发生。当您输入blink()时,程序的其余部分将被阻塞大约5秒。没有按钮按下将被注意到。还有一个45秒的空白,什么也没发生。

你选择:

  1. 使用线程。线程可以同时运行代码。参见如何在Python中使用线程?例如

  2. 运行一个短(0.1s或更短)睡眠结束的循环。在循环检查按钮按下和翻转LED引脚每n次迭代。

最新更新