Python 当按下树莓皮上的按钮时,LED会持续闪烁吗?

Python 当按下树莓皮上的按钮时,LED会持续闪烁吗?,python,raspberry-pi,raspbian,gpio,led,Python,Raspberry Pi,Raspbian,Gpio,Led,我不懂Python,但我正在原型类中使用它。我想做的是使用RPi上的GPIO引脚点亮LED。我得到的那部分,没问题。但是现在我想添加一个按钮,当按下按钮时它会闪烁,然后在松开按钮后继续闪烁。这样地: LED灯亮起,按下按钮,LED灯熄灭,LED灯亮起,LED灯熄灭,LED灯亮起,LED灯熄灭,LED灯亮起,LED灯熄灭,LED灯亮起,一直亮起,一直亮起,直到永远。这就是我所拥有的: import RPi.GPIO as GPIO import time def blink(pin):

我不懂Python,但我正在原型类中使用它。我想做的是使用RPi上的GPIO引脚点亮LED。我得到的那部分,没问题。但是现在我想添加一个按钮,当按下按钮时它会闪烁,然后在松开按钮后继续闪烁。这样地: LED灯亮起,按下按钮,LED灯熄灭,LED灯亮起,LED灯熄灭,LED灯亮起,LED灯熄灭,LED灯亮起,LED灯熄灭,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()
函数一次;下次到达
的顶部时,如果未设置输入16,则不会调用
blink()

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

请注意,您正在将输出管脚编号11传递给闪烁功能,但未使用传递的值;要使该功能更通用,您可以将其更改为:

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()
时,程序的其余部分将被阻止约5s。不会注意到按钮按下。此外,还将有一个4s的差距,什么也没有发生

您可以选择:

  • 使用线程。线程可以同时运行代码。有关示例,请参见

  • 在结束时以短时间(0.1s或更少)睡眠运行循环。在循环中检查按钮,每第n次重复按下并翻转LED引脚。将逻辑添加为仅在接通状态下闪烁


  • 现在,我不想让它停止。最后,我会添加一个簧片开关,当它跳闸时会使它停止,但现在,我只希望它在我按下按钮后闪烁。给我一分钟试试这个。。。。