python循环只在上打印值

2024-06-17 10:43:16 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是一小段python代码。。它是用来读取光或暗的传感器。我想它做什么,当值下降到低于500打印“轻”和当它高于500打印“暗”。这很管用,但每次阅读都要重复课文。。而我只想在一个改变的时候打印出来。。有人知道怎么做吗?我做了不少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

Tags: 代码gpioiftimesetup传感器lowmeasurement
3条回答

我使用一个名为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

输出

^{pr2}$

我想你在if-measurement<;500:condition中的想法是正确的,只在最后一次不同的时候才打印“light”。您只需在>;500条件下重复类似的逻辑即可。但真正的问题是最后一个是一个局部变量,所以每次调用时该值都会重置为9。因此,需要删除last=9,并在函数外部定义last,并在函数内部声明为global:

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

由于每个函数的执行都返回值,所以我认为最好的办法是在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的值,然后在下次调用函数时将其传递也是一个可接受的解决方案。在

相关问题 更多 >