<p>如果只在输入状态发生变化时才打印呢?类似这样的(未经测试):</p>
<pre><code># Your code to initialise everything:
import RPi.GPIO as GPIO
import time
import os
os.system('clear')
GPIO.setmode(GPIO.BOARD)
GPIO.setup(29, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(32, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(37, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# New loop keeping track of the previous ("old") input states:
old_input_states = [None] * 3
while True:
input_states = [GPIO.input(n) for n in (37, 32, 29)]
if input_states != old_input_states:
for n, name in enumerate(['One', 'Two', 'Three']):
if input_states[n] == False:
print name
old_input_states = input_states
</code></pre>
<p>为了解释这个新循环代码的作用:</p>
<ul>
<li>首先,创建一个包含三个<code>None</code>条目的列表<code>old_input_states</code>。这将用于记住三个gpio的最后一个状态。你知道吗</li>
<li>然后在循环的开始,调用<code>GPIO.input(n)</code>函数,因为三个gpio的<code>n</code>分别是37、32和29。结果列表<code>input_states</code>现在包含三个GPIO状态。你知道吗</li>
<li>然后将此列表与<code>old_input_states</code>列表进行比较,如果它们不同,它将执行以下操作:
<ul>
<li>对于<code>'One'</code>、<code>'Two'</code>和<code>'Three'</code>中的每个<code>name</code>(由<code>n</code>枚举,即<code>'One'</code>为0,<code>'Two'</code>为1,<code>'Three'</code>为2),它检查该<code>input_states[n]</code>的值是否为<code>False</code>,如果是,则打印应与相应GPIO匹配的<code>name</code>。你知道吗</li>
<li>然后它更新<code>old_input_states</code>以匹配<code>input_states</code>,因此在下一个循环中,它只会在<code>input_states</code>更改时再次检查(并可能打印)。你知道吗</li>
</ul></li>
</ul>
<p><strong>编辑</p>
<p>注意,代码将输出当前在检测到更改的点<code>False</code>的所有</strong>gpio。要只打印从<code>True</code>到<code>False</code>的部分,您应该能够使用以下代码作为以<code># New loop</code>注释开头的部分:</p>
<pre><code># New loop keeping track of the previous ("old") input states:
old_input_states = [None] * 3
while True:
input_states = [GPIO.input(n) for n in (37, 32, 29)]
for n, name in enumerate(['One', 'Two', 'Three']):
if input_states[n] != old_input_states[n] and input_states[n] == False:
print name
old_input_states = input_states
</code></pre>
<p><strong>编辑2</strong></p>
<p>正如OP所指出的,首选输出仍然是列表形式的。此外,在gpio的开关输入上似乎出现了一些反弹,这可以通过使用<code>time.sleep</code>调用来改进。此外,输出应该反转。<code>while</code>循环的最后一个代码如下所示:</p>
<pre><code>old_input_states = [None] * 3
while True:
input_states = [GPIO.input(n) for n in (37, 32, 29)]
if input_states != old_input_states:
inverted_input_states = [1 - i for i in input_states]
print inverted_input_states
time.sleep(0.2)
old_input_states = input_states
</code></pre>
<p>免责声明:为了提高交换机的去抖动可靠性,我会使用不同的代码,但这超出了这个问题的范围</em></p>