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



Python是我昨天开始学习的第一次与编程语言交互。我正试图通过复盆子Pi和GPIO引脚从物理瞬时开关控制LED。我已经连接了开关,并有一段代码可以打开或关闭4个LED。我有一个第五个开关,可以根据未连接引脚的状态一次打开或关闭所有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都关闭。使用"全部打开/关闭"按钮可以很好地工作。当我使用单个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:

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

最新更新