Arduino的。计算按钮数量然后播放顺序

时间:2016-09-08 10:02:40

标签: loops button arduino counter

帮我编写这个程序

  1. 当我按下按钮一次时,顺序s1()播放。
  2. 当我按两次按钮时,顺序s2()播放。
  3. 当我按下按钮三次时,顺序s3()播放。
  4. 当我按下按钮4次时,顺序s4()播放。
  5. //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);
      } 
    }
    

1 个答案:

答案 0 :(得分:0)

你的意思是那样的?我使用了内部上拉和按钮作为低电平有效开关,因此我使用了与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"