如何在按住按钮时停止连续状态更改?
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)一起。那是不同的帖子。除非您也可以为该问题找到解决方案。
答案 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));
}