使用瞬时按钮的双稳态单按切换,保持时不连续切换

时间:2018-12-30 19:42:06

标签: arduino toggle gpio

如何在按住按钮时停止连续状态更改?

    const int btn = 5;
    const int ledPin = 3;
    int ledValue = LOW;

    void setup(){
        Serial.begin(9600);
        pinMode(btn, INPUT_PULLUP);
        pinMode(ledPin, OUTPUT);
    }

    void loop ()
    {
        if (digitalRead(btn) == LOW)
        delay(100);
    {
        ledValue = !ledValue;
        delay(100);
        digitalWrite(ledPin, ledValue);
        delay(100);    
        Serial.println(digitalRead(ledPin));  
      }
     }

当我按住按钮时,我会收到连续的状态更改。我想按下按钮并接收单个状态更改,而在保留-或意外保留-我不想更改状态。

更多地通过触发器的结果来寻找边缘检测的效果。

此代码上还有更多开发要做,但这是第一步。 最终,我将FOR语句集成到循环中,也许将SWITCH(case)语句集成到循环中。

基本上,我需要一次按一下就可以切换输出引脚,在将来,我还希望能够通过使用FOR来根据特定的输入条件在可能的输出状态之间循环。和SWITCH(case)一起。那是不同的帖子。除非您也可以为该问题找到解决方案。

1 个答案:

答案 0 :(得分:0)

最简单的方法是添加一个保存按钮状态的变量。

当您按下按钮时,该变量将设置为true,并且您要运行的代码。当该变量为true时,您编写的代码将不会再次执行。释放按钮时,变量将设置为false,因此,下次按下按钮将再次执行您的代码。

代码:

bool isPressed = false; // the button is currently not pressed

void loop ()
{
    if (digitalRead(btn) == LOW) //button is pressed
    {
       if (!isPressed) //the button was not pressed on the previous loop (!isPressed means isPressed == FALSE)
       {
         isPressed = true; //set to true, so this code will not run while button remains pressed
         ledValue = !ledValue;
         digitalWrite(ledPin, ledValue); 
         Serial.println(digitalRead(ledPin));  
       }
    }
    else
    {
       isPressed = false; 
       // the button is not pressed right now, 
       // so set isPressed to false, so next button press will be handled correctly
    }
 } 

编辑:添加了第二个示例

const int btn = 5;
const int ledPin = 3;
int ledValue = LOW;
boolean isPressed = false; 

void setup(){
    Serial.begin(9600);
    pinMode(btn, INPUT_PULLUP);
    pinMode(ledPin, OUTPUT);
}

void loop ()
{
  if (digitalRead(btn) == LOW && isPressed == false ) //button is pressed AND this is the first digitalRead() that the button is pressed
  {
    isPressed = true;  //set to true, so this code will not run again until button released
    doMyCode(); // a call to a separate function that holds your code
  } else if (digitalRead(btn) == HIGH)
  {
    isPressed = false; //button is released, variable reset
  }
}

void doMyCode() {
  ledValue = !ledValue;
  digitalWrite(ledPin, ledValue); 
  Serial.println(digitalRead(ledPin));
}