Python:每秒运行一次循环并触发函数5秒

Python:每秒运行一次循环并触发函数5秒,python,raspberry-pi,Python,Raspberry Pi,我试图让我的raspberry pi使用红外传感器检测运动,然后打开一个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 lig

我试图让我的raspberry pi使用红外传感器检测运动,然后打开一个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()

这正是基于代码的正确行为。为了使其不阻塞
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多线程技术,如果操作不当,线程技术将非常危险。

使用多线程技术很好!我必须在light函数中调用t.stop()吗?不,一旦完成,就完成了。从外部停止一个线程通常是个坏主意,你应该让一个线程运行它的进程,并处理停止它自己OK-工作得很好!如果在灯亮的情况下再次检测到运动,有没有办法重新启动线程(或者我想应该是睡眠计时器)?