首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:每秒钟运行一次循环并触发函数5秒

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

Stack Overflow用户
提问于 2017-07-18 15:45:44
回答 1查看 2.5K关注 0票数 2

我试图让我的覆盆子皮来检测运动使用红外传感器,然后打开一个LED 5秒,而仍然轮询红外传感器每0.5秒。这是到目前为止我的代码,但它等待LED关闭,然后再检查红外传感器.

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-18 15:51:04

这正是基于代码的正确行为。为了使它不阻塞light() def,您不能使用像time.sleep这样的阻塞语句。

解决这一问题的一种方法是使用线程:

代码语言:javascript
复制
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进一步阅读多线程,如果不正确地执行线程,则非常危险。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45171565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档