问题描述
如何在按住按钮时停止连续状态更改?
How to stop contiguous state change upon button hold?
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));
}
}
当我按住按钮时,我会收到连续的状态变化.我想按下按钮并接收单个状态更改,保持 - 或意外保持 - 我不想更改状态.
When I hold the button I receive contiguous state change. I want to press button and receive single state change, upon hold -- or accidental hold -- I would not like to change state.
通过触发器的结果进一步寻找边缘检测的效果.
More looking for effect of edge detection with the result of flip flop.
此代码还有更多的开发工作要做,但这是第一阶段.最终,我会将 FOR 语句集成到循环中,也许还有 SWITCH(case) 语句.
There is more development to be done on this code but this is the first stage.Eventually I will integrate a FOR statement into the loop and perhaps a SWITCH(case) statement.
基本上我需要能够通过一次瞬时推动来切换输出引脚,我还希望 - 在未来 - 能够通过使用 FOR 的方式根据特定的输入条件在可能的输出状态之间循环和 SWITCH(case) 在一起.那是一个不同的帖子.除非您也能推测出该问题的解决方案.
Basically I need to be able to toggle output pins with a single momentary push, I also would like -- in the FUTURE -- to be able to cycle through possible output states based on specific input conditions, by way of using FOR and SWITCH(case) together. That is a different post. Unless you can surmise a solution for that problem as well.
推荐答案
最简单的方法是添加一个保存按钮状态的变量.
The easiest way is to add a variable that holds the state of the button.
当您按下按钮时,该变量将设置为 true 并且您想要的代码将运行.虽然该变量为真,但您编写的代码不会再次执行.当您松开按钮时,该变量将设置为 false,因此下一次按下按钮将再次执行您的代码.
When you press the button, that variable is set to true and the code you want runs. While that variable is true, the code you wrote will not be executed a second time. When you release the button, the variable gets set to false, so a next button press will have your code executed again.
代码:
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));
}
这篇关于使用瞬时按钮的双稳态单按切换,保持时没有连续切换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!