阿杜诺。计算按钮按下的次数然后播放序列

Arduino. count the number of button press then play sequence

帮我编写这个程序

  1. 当我按下按钮一次时,序列 s1() 开始播放。
  2. 当我按下按钮两次时,序列 s2() 开始播放。
  3. 当我按三次按钮时,序列 s3() 开始播放。
  4. 当我按下按钮 4 次时,序列 s4() 开始播放。

//code

const int buttonPin = 10;  
int buttonState = 0;

void setup(){
  Serial.begin(9600);
  //initialize pin 2 - 9 as output
  for(int i=2;i<=9;i++){ 
    pinMode(i,OUTPUT);
  }
  pinMode(buttonPin, INPUT);
}

void loop(){
 buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {      
   s1();
   s2();
   s3();
   s4();       
   }    
}

void s1(){
   int i = 2 ;
   for(int z=0;z<=1;z++){
      for(int x=i;x<=9;x++){   
       digitalWrite(i,HIGH);
       digitalWrite(x-1,LOW);
       delay(500);
       i = i + 1;
      }
      i = 2;
      if(i = 2){
       digitalWrite(9,LOW);
       }
   }
}

void s2(){
  int y = 9;  
  for(int i=0;i<=1;i++){
    for(int x=2;x<=5;x++){
      if(y>=1){
       digitalWrite(x,HIGH);
       digitalWrite(y,HIGH);
       delay(500);
       y = y - 1;
      }
    }
    off();
    y = 9;
    delay(500);
  }  
}

void s3(){
  for(int i=0;i<=2;i++){
      for(int z=2; z<=9;z++){
            if(z % 2 == 0){
               digitalWrite(z,HIGH);
            }
      }
      delay(500);
      for(int z=2; z<=9;z++){
            if(z % 2 == 0){
               digitalWrite(z,LOW);
            }
        }
      delay(500);
      for(int z=2; z<=9;z++){
            if(z % 2 != 0){
               digitalWrite(z,HIGH);
            }
      }
      delay(500);
      for(int z=2; z<=9;z++){
            if(z % 2 != 0){
               digitalWrite(z,LOW);
            }
        }
       delay(500);
  }
}

void s4(){
    for(int i=0;i<=2;i++){
      for(int x=2;x<=9;x++){
         digitalWrite(x,HIGH);
         delay(500);
        }
        off();
        delay(500);
      }
 }

void off(){
  for(int i=2;i<=9;i++){ 
    digitalWrite(i,LOW);
  } 
}

你是说类似的意思吗?我使用内部上拉和按钮作为低电平有效开关,所以我使用了与 LOW 进行比较:

const int    btn = 4;
byte  btn_tim_on = 0;
byte btn_tim_off = 0;
byte     btn_val = 0;

void setup() {
  pinMode(btn, INPUT_PULLUP);
  Serial.begin(57600); // debug purposes
}

void loop() {

  if (digitalRead(btn) == LOW) {
    if (++btn_tim_on == 5) {    // 5 checks before it's considered as key press and every 256*4ms repeat
      ++btn_val;
    }
    btn_tim_off = 80;           // about 0.32 second to confirm
  } else {
    btn_tim_on = 0;             // reset button pressed timer
    if (btn_tim_off > 0) {
      if (--btn_tim_off == 1) { // call action
        Serial.println(btn_val); // print in serial monitor
        switch (btn_val) {
          case 1: s1(); break;
          case 2: s2(); break;
          case 3: s3(); break;
          case 4: s4(); break;
          default: Serial.println(F("no action")); break;
        }
      }
    } else {
      btn_val = 0;              // reset button press counter
    }
  }
  delay(4);
}

// where to place s1, s2, s3 and s4 ...
// playing these actions is blocking, so no keys are detected during "play"