python循环只打印一次值

时间:2014-11-08 07:00:28

标签: python loops raspberry-pi gpio

以下是一段简短的蟒蛇代码......它适用于读取光线或黑暗的传感器。当价值降至500以下时,我希望它做什么"轻"当它高于500时打印" Dark"。这几乎是有效的,但每次阅读都会重复文本..虽然我只想在改变时打印出来......任何人都知道如何做到这一点?我做了很多shell编程..不知怎的,这个简单的问题我不能在python中完成它。

#!/usr/bin/python

import RPi.GPIO as GPIO, time

GPIO.setmode(GPIO.BCM)

# Define function to measure charge time
def RCtime (PiPin):
  measurement = 0
  # Discharge capacitor
  GPIO.setup(PiPin, GPIO.OUT)
  GPIO.output(PiPin, GPIO.LOW)
  time.sleep(0.1)

  GPIO.setup(PiPin, GPIO.IN)
  # Count loops until voltage across
  # capacitor reads high on GPIO

  last = 9
  while (GPIO.input(PiPin) == GPIO.LOW):
    measurement += 1

  if measurement < 500:
     print last
     if last == 0:
      print "light"
      last = 1
  if measurement >500:
   print "dark"
   last = 0
   print last
  return measurement

# Main program loop
while True:
  print RCtime(4) # Measure timing using GPIO4

3 个答案:

答案 0 :(得分:0)

我认为你在if测量中的想法是正确的。 500:条件,印刷&#34;光&#34;只有在最后一次不同时。你只需要在&gt;中重复类似的逻辑。 500条件。但真正的问题是,最后这里是一个局部变量,因此每次调用时该值都会重置为9。所以你需要删除last = 9,并定义函数的最后一个,并在函数内声明为全局:

#in main program
last = 9
def RCTime ...:
    global last
    ....

答案 1 :(得分:0)

由于您在每次执行函数时返回值,我认为最好的想法是在while循环中对它进行比较并保留该函数仅用于获取数据。

这些方面的东西:

previous, current = None, None

def RCtime (PiPin):
    [...]

while True:
    measurement = RCtime(4)
    previous, current = current, measurement<500
    if current != previous:
        # value changed...
        # `current` is bool and True if there is light.
        # or you can just deal with the value itself for logic

    print measurement

否则返回last的值然后在下次调用函数时将其传递也是可接受的解决方案。

答案 2 :(得分:0)

我使用名为readings的列表模拟传感器的读数,其余代码可以直接转换为您的用例

readings = [ 600, 600, 550, 501, 450, 400, 400, 460, 520, 600, 600]
dark = None

for i, reading in enumerate(readings):
    dark_now = 'Dark' if reading < 500 else 'Light'
    if dark_now != dark:
        dark = dark_now
        print i, reading, dark

输出

0 600 Light
4 450 Dark
8 520 Light