首页 > 解决方案 > 有没有一种更简洁的方法可以只在循环中运行一次动作?

问题描述

我有一个用于输入的按钮和一个在我按下按钮时会切换的灯。

现在我通常在循环功能中切换一次灯,这有点乱。

我不希望它在按住按钮时不断切换。

这是我当前的代码:

bool inboxLightsEnabled = false;

void setup() {

  //Analog pin mode
  pinMode(A0, INPUT);

  //Digital pin mode
  pinMode(2, OUTPUT);
  
}

bool buttonPressRecieved = false;

void loop() {
  
  if(analogRead(A0) >= 1000) {
    if(!buttonPressRecieved) {
      
      //The button has been pressed and not recieved yet so process it
      inboxLightsEnabled = !inboxLightsEnabled;
      
      buttonPressRecieved = true; //We have received the button press so make sure we don't receive it again
      
    }
  } else {
    buttonPressRecieved = false; //The button stopped being pressed so make this false
  }

  digitalWrite(2, inboxLightsEnabled);
  
}

如果无法使这个更清洁,那没关系,但我需要知道是否可以做到。

另外,我使用的是analogRead,因为当我将它用作输入时,digitalRead 似乎在打开和关闭之间闪烁。

有人知道吗?

标签: arduinoarduino-unoarduino-c++

解决方案


马贝这将有助于:

bool buttonState = false, buttonStateBefore = false;
void loop()
{
    buttonSate = digitalRead(ButtonPin);
    if(buttonState > buttonStateBefore) doStuff();
    buttonStateBefore = buttonState;
}

这将触发按钮按下的功能。不知道这是否有帮助,因为你的问题对我来说不是很清楚,但我认为这可能会做到。工作原理:当循环运行并按下按钮时,buttonState 为 true,而 buttonStateBefore 为 false。真>1,假0,真大于假。因此函数 doStuff() 被调用。之后 buttonStateBefore 是 buttonState 所以它也是真的。如果在下一个圆圈中仍然按下按钮,则它们都为真,因此不会调用该函数。


推荐阅读