我在使用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()

最佳答案

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

首先,让我们编辑一下意义以返回distance的值

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


您可能还应该创建一个函数来关闭电动机

您需要定义距离,还需要创建一个永远运行的循环。现在,您的循环只会运行直到距离
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

10-07 19:37
查看更多