你用文字写了这个计划:按下按钮,灯亮

按下按钮,灯熄灭

但你写的代码更像:每秒10倍,

如果按钮打开了,什么也不做

如果按下按钮,则切换灯

完全不同。按住按钮超过1/10秒,它开始变得怪异。我的意思是,你的代码经过循环,每次它试图更新所有的东西;你在跟踪上次通过循环发生的事情,这意味着你不能持有任何超过一个循环持续时间的东西。相反,你需要将循环与状态跟踪分开,这样状态就可以一次又一次地保持不变,并且只在按钮改变时让狗吃饼干。在

它是驱动系统状态的按钮,而不是时间流逝。系统可能处于4种可能的状态,如下所示:

(Button=Up, Light=Off) <
| |
| Button pushed down |
\/ |
(Button=Down, Light=/On/) |
| |
| Button released |
\/ |
(Button=Up, Light=On) |
| |
| Button pushed down |
\/ |
(Button=Down, Light=/Off/) |
| / \
| Button released |
| |
-

如果您显式地对这些状态进行编码并遵循顺序,那么让按钮成为唯一允许您从一个状态转到下一个状态的东西。。。你不可能因为按住按钮太久而有任何奇怪的行为。我希望如此。当前代码从(Button=Down,Light=On)跳到(Button=Down,Light=Off),然后再跳回来。在

我的代码没有经过测试,我不完全确定GPIO.input.输入()在按钮按下和释放时发出。我假设大多数情况下它是0/错误,按下按钮时是1/真。在

^{pr2}$

因此,button和{}跟踪系统的状态。每次循环中,只有if块中的一个匹配,并且在获得使状态更改到下一个的按钮更改之前,它基本上什么也不做。在

第一次通过时,第一个块匹配,它检查是否有按钮按下。它一直这样做。在

你按下按钮,现在第一个方块点亮LED并更新状态。在

现在,每次循环中,(button=='down' and light=='on')匹配。它处于状态2,只要你按下按钮,它就会一直保持这种状态。每次循环过程中,它都会寻找按钮释放,这是唯一可以触发任何状态更改的东西。在

等等