2016-01-07 19 views
0

我的代码只执行情况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.太感谢你了

+0

你需要去反弹的按钮,即适用于一些简单的数字滤波器来摆脱当您按下任何按钮时出现的机电信号反弹。 – Lundin

回答

0

变化int ctr=0static int ctr=0

这是同样的事情,与全球范围内声明ctr

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

应该检查按钮去抖动。

+0

感谢克利福,我完成了这个,谢谢 –

0

且不说,点击率分配零时间loop()运行,你也有,如果按钮被按下,ctr将不断增加,这可能不是你想要什么的问题。它也会在过去三年增加ctr,届时默认情况下将无限期运行。目前还不清楚你是否打算将案件3归入默认案件;它通常被认为是不好的做法或错误,所以如果是故意的,值得评论。

以下代码使得ctr为静态,因此它也不总是被赋值为零,并且只有在按下按钮时才会增加ctr,并且如果仅仅是按下或卡住,则不会增加它。它也返回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 ; 
    } 
}