Python脚本 - 在if一段时间内嵌入if / else True:on - Raspberry Pi

时间:2015-02-06 05:08:53

标签: python raspberry-pi gpio led

Python是我与编程语言的第一次互动,我昨天开始学习。 我试图通过Raspberry Pi及其GPIO引脚从物理瞬时开关控制LED。 我已经连接了开关,并有一段代码可以打开或关闭4个LED。 我有一个第5个开关可以同时打开或关闭所有4个LED,具体取决于无线引脚的状态。

每个LED的代码如下所示:

import RPi.GPIO as GPIO
import time

GPIO.setwarnings(False)

GPIO.setmode(GPIO.BCM)

GPIO.setup(10, GPIO.IN, pull_up_down=GPIO.PUD_UP)

GPIO.setup(4,GPIO.OUT)
GPIO.output(4,0)

GPIO.setup(18,GPIO.OUT)

GPIO.output(18,0)

while True:
    input_state = GPIO.input(10)
    if input_state == False:
         GPIO.output(4, not GPIO.input(4))
         time.sleep(0.1)
         GPIO.output(18, GPIO.input(4))
         time.sleep(0.4)

如果引脚10是连接到我的开关的输入,则4是打开并为LED供电的引脚,引脚18是用于与另一个开关同时打开/关闭所有LED的引脚。我有4个版本的这个脚本,每个LED只有1个,只是更改了使用的引脚。

同时打开/关闭所有引脚的代码如下所示:

import RPi.GPIO as GPIO
import time

GPIO.setwarnings(False)

GPIO.setmode(GPIO.BCM)

GPIO.setup(26, GPIO.IN, pull_up_down=GPIO.PUD_UP)

chan_list = (4,17,22,27)

GPIO.setup(chan_list,GPIO.OUT)

GPIO.output(chan_list,0)

GPIO.setup(18,GPIO.OUT)

GPIO.output(18,0)

while True:
    input_state = GPIO.input(26)
    if input_state == False:
         chan_list = (4,17,22,27)
         GPIO.output(18, not GPIO.input(18))
         time.sleep(0.1)
         GPIO.output(chan_list, GPIO.input(18))
         time.sleep(0.4)

这些代码非常有效。我将它们全部设置为在启动时作为后台进程启动。

我想使用引脚18打开一个指示灯LED,如果四个LED中的任何一个打开,它会打开,如果任何LED关闭,它会一直亮着,除非所有4个LED都关闭。使用全开/关按钮可以正常工作。当我使用单独的LED按钮关闭单个LED时,问题出现了。在当前设置中,一旦我关闭任何单个LED引脚18就会关闭。

我试图找到解决此问题的代码解决方案,以便当4个LED中的任何一个亮起时引脚18(指示灯LED)亮起,并且仅当所有4个LED均熄灭时才关闭。< / p>

我在想一些if / else:条件的嵌套系列,但我的知识有限,阻碍了我的成功。

我尝试过的一段代码是:

import RPi.GPIO as GPIO
import time

GPIO.setwarnings(False)

GPIO.setmode(GPIO.BCM)

GPIO.setup(10, GPIO.IN, pull_up_down=GPIO.PUD_UP)

GPIO.setup(4,GPIO.OUT)
GPIO.output(4,0)

GPIO.setup(18,GPIO.OUT)
GPIO.output(18,0)


while True:
    input_state = GPIO.input(10)
    if input_state == False:
             if GPIO.output(17) == True:
                  GPIO.output(4, not GPIO.input(4))
             else:
                  if GPIO.output(22) == True:
                      GPIO.output(4, not GPIO.input(4))
                  else:
                       if GPIO.output(27) == True:
                           GPIO.output(4, not GPIO.input(4))
                       else:
                           GPIO.output(4, not GPIO.input(4))
                           time.sleep(0.1)
                           GPIO.output(18, GPIO.input(4))
                           time.sleep(0.4)

这会出错:

Traceback (most recent call last):
  File "pin10test.py", line 20, in <module>
    if GPIO.output(17) == True:
TypeError: function takes exactly 2 arguments (1 given)

我的意图是,当按下按钮时,它将会显示:

If pin 17 is on, toggle pin 4. If not go to next check.
If pin 22 is on, toggle pin 4. If not go to next check.
If pin 27 is on, toggle pin 4. If not go to final else:
toggle pin 4, sleep 0.1, set pin 18 to whatever pin 4 was just set to, sleep 0.4.

然后我将这段脚本调整为每个按钮的脚本。

这样,如果所有引脚都关闭,引脚18只会将状态更改为关闭状态。

感谢您提供此脚本的任何帮助。 任何有关如何改进这一点的想法或提示也值得赞赏。

1 个答案:

答案 0 :(得分:0)

input_state = GPIO.input(10)

    if input_state == False:

应该处于相同的缩进级别,这正是错误消息所说的。没有理由缩进第二行(因为前一个没有打开一个新块,所以缩进它是一个错误)。