我想在执行之前计算按钮(开关)的按下次数

I want to count the number of presses of the button(switch) before it executes

我的代码只执行案例1。如果我按3次我需要。它将执行我的案例 3。非常感谢

int pushButton = 13;

void setup() {
  Serial.begin(9600);
  pinMode(pushButton, INPUT);
for(int pin=10;pin<=12;pin++){
  pinMode(pin,OUTPUT);
}
}

void loop() {
  int ctr=0;
  int buttonState = digitalRead(pushButton);


 if(buttonState ==1)
  {
    ctr+=1;   
    Serial.println(ctr);


  }
  switch (ctr) {
  case 1:
  Serial.println("00000000000000000000");
     blinking();
    break;
  case 2:
  Serial.println("AAAAAAAAAAAAAAAA");
    running();

    break;
  case 3:
    incremental();
  default: 
    Serial.println("push the button");
}



}



void blinking(){

    for(int z=0;z<=3;z++){
    for(int i=10;i<=12;i++){
      digitalWrite(i,HIGH);
    }delay(500);
    for(int i=10;i<=12;i++){
      digitalWrite(i,LOW);
    }delay(500);
    }

}

void running(){
 for(int z=0;z<=2;z++){ 
   for(int i=10;i<=12;i++){
     digitalWrite(i,HIGH);
     delay(500);
     digitalWrite(i,LOW);
  }   
 } 

}


void incremental(){
 for(int z=0;z<=2;z++){
    int d=1500;
   for(int i=10;i<=12;i++){
    digitalWrite(i,HIGH);
    delay(d); d-=500;
   }
   for(int i=10;i<=12;i++){
    digitalWrite(i,LOW);
   }delay(500);  
  } 


}

我的代码只执行案例1。如果我按3次我需要。它将执行我的案例 3。非常感谢

int ctr=0更改为static int ctr=0

这与在全局范围内声明 ctr 是一样的。

不会在每次调用loop函数时重置为0

应检查按钮去抖。

除了每 loop() 运行 秒将 ctr 分配为零之外,您还有一个问题,即如果按住按钮, ctr 会不断增加,这可能不是你想要的。当默认情况下 运行 无限期时,它还会递增 ctr 三倍。不清楚您是否打算将案例 3 设为 fall-through 默认案例;它通常被认为是不好的做法或错误,因此如果是故意的,则值得发表评论。

以下代码使 ctr 静态,因此它并不总是被赋值为零,并且仅在按下按钮时递增 ctr,如果只是 [=24] 则不会递增=] 或卡住。它也 returns ctr 在默认情况下为零,因此您可以循环状态(这可能不是您的意图)。为了清楚起见,我删除了调试输出。

void loop() 
{
  static int ctr = 0 ;
  static bool button_down = false ;
  int button_state = digitalRead(pushButton) == 1 ;

  if( !button_down && button_state = 1 )
  {
    ctr++ ;
    button_down = true ;
  }
  else if( button_state = 0 )
  {
     button_down = false ;
  }

  switch( ctr ) 
  {
    case 1:
      blinking();
    break;

    case 2:
      running();
    break;

    case 3:
      incremental();
    break ;

    default: 
        ctr = 0 ;
    break ;
  }
}