如何部分停止循环?

时间:2016-02-01 16:11:36

标签: python python-2.7 raspberry-pi

因此,我正在编写一个基本程序,使用电位计打开LED,这是我的代码:

def pot():
    import RPi.GPIO as GPIO
    import time
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(4, GPIO.OUT)
    GPIO.setup(22, GPIO.IN)
    GPIO.output(4, GPIO.LOW)
    try:
        while True:
            if (GPIO.input(22) == GPIO.HIGH):
                print("switch activated")
                GPIO.output(4, GPIO.HIGH)
                if (GPIO.input(22) == GPIO.LOW):
                   GPIO.output(4, GPIO.LOW) 
            else:
                GPIO.output(4, GPIO.LOW)
    except KeyboardInterrupt:
        GPIO.cleanup()
pot()

当我激活电位器时,我只想要"开关激活"打印一次,但我希望LED继续运行,直到我关闭电位器。由于代码是"开关激活"当锅被激活时,显然会不断打印。我尝试使用休息和其他类似的东西,但他们都结束了程序或关闭了LED。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:1)

由于您希望LED继续发光,它就像添加另一个循环一样简单。这是您的代码的(稍微)修改版本应该有效:

def pot():
    import RPi.GPIO as GPIO
    import time
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(4, GPIO.OUT)
    GPIO.setup(22, GPIO.IN)
    GPIO.output(4, GPIO.LOW)
    try:
        while True:
            if (GPIO.input(22) == GPIO.HIGH):
                print("switch activated")
                # modified part
                while (GPIO.input(22) ==  GPIO.HIGH):
                    GPIO.output(4, GPIO.HIGH)
                # end modification
            else:
                GPIO.output(4, GPIO.LOW)
    except KeyboardInterrupt:
        GPIO.cleanup()

pot()

另一种方法是打开LED并等待引脚22的输入转为LOW。只需更改修改后的部分如下。

# modified part
GPIO.output(4, GPIO.HIGH)
while (GPIO.input(22) ==  GPIO.HIGH):
    pass
# end modification

答案 1 :(得分:0)

显然你想让LED对信号做出持续反应,但只在信号发生变化时打印信息。

执行此操作的方法是使用变量跟踪状态。

注意:我对循环中嵌套的GPIO.input调用感到困惑。看起来这些都是多余的,因为如果GPIO.input的返回值发生了变化,它将在下一次迭代中处理......

try:
    state = None

    while True:
        signal = GPIO.input(22)
        GPIO.output(4, signal)

        if signal != state:
            if signal == GPIO.HIGH:
                print("switch activated")
            else:
                print("switch deactivated")
            state = signal

except KeyboardInterrupt:
    GPIO.cleanup()

答案 2 :(得分:0)

输出也可以作为输入进行检查。因此,您可以将逻辑更改为仅在当前较低时将输出设置为高。

def pot():
    import RPi.GPIO as GPIO
    import time
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(4, GPIO.OUT)
    GPIO.setup(22, GPIO.IN)
    GPIO.output(4, GPIO.LOW)
    # Initialize state
    state = GPIO.LOW
    try:
        while True:
            # Set the output high only if the input is high and the output is low
            if (GPIO.input(22) == GPIO.HIGH) and (GPIO.input(4) == GPIO.LOW):
                print("switch activated")
                GPIO.output(4, GPIO.HIGH)
            # If you want, you could do the same here and add a check on the output to 
            # only turn it low if it is currently high
            elif (GPIO.input(22) == GPIO.LOW):
                GPIO.output(4, GPIO.LOW)
    except KeyboardInterrupt:
        GPIO.cleanup()
pot()

答案 3 :(得分:-1)

如果您只希望执行一次,则需要将string(FIND "${OpenCV_SOURCE_DIR}" "${__abs_dir}" strPosSrc) string(FIND "${OpenCV_SOURCE_DIR}" "${__abs_dir}" strPosBin) if (strPosSrc EQUALS 0 OR strPosBin EQUALS 0) 移出循环。