连续输入在Python中选择while循环

时间:2018-03-16 14:19:47

标签: python loops io raspberry-pi distance

我在使用Python的Raspberry Pi上。 我希望从距离传感器接收连续输入并使距离值确定是否发送输出。

我有一个输出函数,gogo和感觉函数sense,它可以更新距离值。

我想在低于20的距离时开始输出,当距离达到阈值20时输出停止,但我能看到的唯一解决方案是另一个循环。

我的代码无效,我认为有一个很好的解决方案,但我并不精通循环。

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

distance = 40.0

TRIG = 4
ECHO = 18

GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)
GPIO.setup(23, GPIO.OUT)
GPIO.setup(24, GPIO.OUT)
GPIO.setup(25, GPIO.OUT)

def gogo(): 
    Motor1A = 23
    Motor1B = 24
    Motor1E = 25

    GPIO.setup(Motor1A,GPIO.OUT)
    GPIO.setup(Motor1B,GPIO.OUT)
    GPIO.setup(Motor1E,GPIO.OUT)

    print "Turning motor on"
    GPIO.output(Motor1A,GPIO.HIGH)
    GPIO.output(Motor1B,GPIO.LOW)
    GPIO.output(Motor1E,GPIO.HIGH)

def sense():
    GPIO.output(TRIG, True)
    time.sleep(0.00001)
    GPIO.output(TRIG, False)

    while GPIO.input(ECHO) == False:
        start = time.time()

    while GPIO.input(ECHO) == True:
        end = time.time()

    sig_time = end-start

#CM:
    distance = sig_time / 0.000058

#inches:
#distance = sig_time / 0.000148

    print('Distance: {} centimeters'.format(distance))

while distance > 20.0:
    print (distance)
    sense()
else:
    print (distance)
    gogo()
    sense()

GPIO.cleanup()

1 个答案:

答案 0 :(得分:2)

问题在于范围; distance始终在您的40个主要代码中。它仅在sense()

中更新

首先,让编辑意义返回距离值

def sense():
    GPIO.output(TRIG, True)
    time.sleep(0.00001)
    GPIO.output(TRIG, False)

    while GPIO.input(ECHO) == False:
        start = time.time()

    while GPIO.input(ECHO) == True:
        end = time.time()

    sig_time = end-start

#CM:
    distance = sig_time / 0.000058

#inches:
#distance = sig_time / 0.000148

    print('Distance: {} centimeters'.format(distance))
    return distance

你也应该创建一个关闭电机的功能

你需要定义距离,让我们做一个永远运行的循环。现在,你的循环只运行到距离< 20

distance = sense()
while True:
    if distance > 20:
        <call motor off function here>
        print (distance)
    else:
        print (distance)
        gogo()
    distance = sense() #now we're checking distance every cycle