我不懂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秒的空白,什么也没发生。
你选择:
-
使用线程。线程可以同时运行代码。参见如何在Python中使用线程?例如
-
运行一个短(0.1s或更短)睡眠结束的循环。在循环检查按钮按下和翻转LED引脚每n次迭代。