在 raspberry pi 上按下按钮时 LED 持续闪烁?

Continually blink an LED when a button is pressed on a raspberry pi?

我不知道 Python,但我在原型设计中使用它 class。我想要做的是使用 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()函数;下次您到达 while True 的顶部且未设置输入 16 时,不会调用 blink()

(如果您在不同的输入引脚上有第二个停止按钮,您可以添加另一个 GPIO.input() 检查不同的数字以将 blinking 设置为 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() 时,程序的其余部分将被阻塞约 5 秒。不会注意到按下任何按钮。也会有4s的空隙,什么都没发生。

你的选择:

  1. 使用线程。线程可以同时 运行 编码。有关示例,请参阅 How to use threading in Python?

  2. 运行 一个循环,最后有一个短暂的(0.1 秒或更短)休眠。在循环中,每第 n 次迭代检查按钮是否按下并翻转 LED 引脚。添加逻辑以仅在开启状态下闪烁。