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

Python Script - Nesting an if / else under an if inside a while True: on - Raspberry Pi

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 是我用来同时打开 on/off 所有 LED 的引脚另一个开关。我有这个脚本的 4 个版本,每个 LED 一个,只是使用的引脚发生了变化。

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

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 都关闭。使用 all on/off 按钮效果很好。当我使用单独的 LED 按钮关闭单独的 LED 时,问题出现了。在当前设置中,只要我关闭任何单个 LED,引脚 18 就会关闭。

我正在尝试找到解决此问题的代码解决方案,以便当 4 个 LED 中的任何一个打开时,引脚 18(指示灯 LED)打开,并且仅当所有 4 个 LED 都关闭时才关闭。

我在考虑某种嵌套系列的 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 才会将状态更改为关闭。

如果您能帮助我们正确编写此脚本,我们将不胜感激。 任何关于如何改进这一点的想法或技巧也将受到赞赏。

input_state = GPIO.input(10)

    if input_state == False:

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