以下是一段简短的蟒蛇代码......它适用于读取光线或黑暗的传感器。当价值降至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
答案 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