我试图让我的覆盆子皮来检测运动使用红外传感器,然后打开一个LED 5秒,而仍然轮询红外传感器每0.5秒。这是到目前为止我的代码,但它等待LED关闭,然后再检查红外传感器.
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
PIR_PIN = 18
GPIO.setup(PIR_PIN, GPIO.IN)
LED_PIN = 17
GPIO.setup(LED_PIN, GPIO.OUT)
def light():
GPIO.output(LED_PIN, GPIO.input(PIR_PIN))
time.sleep(5)
GPIO.output(LED_PIN, False)
try:
while True:
if GPIO.input(PIR_PIN):
print("Motion Detected!")
light()
time.sleep(0.5)
except KeyboardInterrupt:
GPIO.cleanup()发布于 2017-07-18 15:51:04
这正是基于代码的正确行为。为了使它不阻塞light() def,您不能使用像time.sleep这样的阻塞语句。
解决这一问题的一种方法是使用线程:
from threading import Thread
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
PIR_PIN = 18
GPIO.setup(PIR_PIN, GPIO.IN)
LED_PIN = 17
GPIO.setup(LED_PIN, GPIO.OUT)
def light():
GPIO.output(LED_PIN, GPIO.input(PIR_PIN))
time.sleep(5)
GPIO.output(LED_PIN, False)
try:
while True:
if GPIO.input(PIR_PIN):
print("Motion Detected!")
t = Thread(target=light) # Create thread
t.start() # Start thread
time.sleep(0.5)
except KeyboardInterrupt:
GPIO.cleanup()穿线允许您在程序中一次运行多个东西。虽然,这现在打开了另一罐蠕虫,您需要线程同步。
我强烈建议在实现上述代码之前,使用python进一步阅读多线程,如果不正确地执行线程,则非常危险。
https://stackoverflow.com/questions/45171565
复制相似问题