【问题标题】:Python: Run loop every second and trigger function for 5 secondsPython:每秒运行循环并触发函数5秒
【发布时间】:2017-07-18 23:51:04
【问题描述】:

我正在尝试让我的树莓派使用 IR 传感器检测运动,然后打开 LED 5 秒钟,同时仍每 0.5 秒轮询一次 IR 传感器。到目前为止,这是我的代码,但它会等待 LED 关闭,然后再次检查 IR 传感器...

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()

【问题讨论】:

  • 使用多线程

标签: python raspberry-pi


【解决方案1】:

这正是基于您的代码的正确行为。为了不阻塞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()

Threading 允许您在程序中一次运行多个东西。不过,现在这会打开另一个需要线程同步的蠕虫。

我强烈建议在实现上述代码之前进一步阅读使用 python 进行多线程处理,如果处理不当线程是非常危险的。

【讨论】:

  • 看起来不错!我必须在灯光函数中调用 t.stop() 吗?
  • 不,一旦完成,您就完成了。从外部停止线程通常是一个坏主意,您应该让线程运行它并自行处理停止
  • 好的 - 效果很好!如果在灯亮时再次检测到运动,有没有办法重新启动线程(或者我猜是睡眠定时器)?
猜你喜欢
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 2023-03-11
  • 1970-01-01
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多