【问题标题】:Continually blink an LED when a button is pressed on a raspberry pi?在树莓派上按下按钮时 LED 持续闪烁?
【发布时间】:2015-09-29 03:34:45
【问题描述】:

我不知道 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()

这似乎只会在按下按钮后立即闪烁,但不会一直闪烁。

我该如何解决这个问题?

【问题讨论】:

    标签: python raspberry-pi raspbian gpio led


    【解决方案1】:

    你想要什么让它停止闪烁吗?如果没有:

    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)
    

    【讨论】:

    • 现在,我不想让它停下来。最终我会添加一个簧片开关,当触发时会使其停止,但现在,我只想在按下按钮后让它闪烁。给我一分钟试试这个....
    【解决方案2】:

    您的问题很容易解释。当程序休眠时,它会休眠。什么都不会发生。当您输入blink() 时,程序的其余部分将被阻止大约 5 秒。不会注意到按钮按下。也会有一个 4s 的间隙,什么都没有发生。

    你的选择:

    1. 使用线程。线程可以同时运行代码。示例见How to use threading in Python?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多