有没有一种更简洁的方法,只循环一次 运行 一个动作?

Is there a cleaner way of only running an action once on loop?

我有一个从中获取输入的按钮和一个在我按下按钮时切换的灯。

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

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

这是我当前的代码:

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 似乎在打开和关闭之间闪烁。

有人知道吗?

不确定 analogRead() 的用途,因为你没有解释。

就切换操作而言,可以用一行来完成:

digitalWrite(2, !digitalRead(2));

也许这会有所帮助:

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

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