2017-07-05 32 views
0

當我嘗試更改按鈕按下後的狀態時,沒有任何工作。我這樣做與線prev = current;當我嘗試更新按鈕的狀態時,爲什麼我的按鈕不能正常工作?

#include <Servo.h>; 

//HIGH not pressed 
//LOW pressed 

int pushD3 = 3; 
int pushD4 = 4; 
int pushD5 = 5; 
int pushD6 = 6; 
int val4 = 0; 
int val5 = 0; 
int ledPin = 13; 
int prev = 0; 
int current = 0; 
Servo ZServo; 

void setup() { 
    ZServo.attach(9); 
    pinMode(pushD3, INPUT_PULLUP); 
    digitalWrite(3, HIGH); 
    pinMode(pushD4, INPUT_PULLUP); 
    digitalWrite(4, HIGH); 
    pinMode(pushD5, INPUT_PULLUP); 
    digitalWrite(5, HIGH); 
    pinMode(pushD6, INPUT_PULLUP); 
    digitalWrite(6, HIGH); 
    pinMode(ledPin, OUTPUT); 
} 

void loop() { 
    if (digitalRead(3) == LOW) { 
    current = 1 - current; 
    } 
    if (current == 1 && prev == 0) { 
    checkButtons_slow(); 
    delay(100); 
    } 
    if (current == 0 && prev == 1) { 
    //ZServo.write(110); 
    delay(500); //half a second 
    } 
    prev = current; 
} 

void checkButtons_slow() { 
    val4 = digitalRead(pushD4); 
    val5 = digitalRead(pushD5); 
    if (val4 == LOW) { 
    ZServo.write(87); 
    } else if (val5 == LOW) { 
    ZServo.write(99); 
    } else { 
    ZServo.write(91); //GUESSED ON 92; SHOULD TECHNICALLY BE 90 
    } 
} 
+0

你沒有配置任何引腳。 checkButtons_slow()是在哪裏定義的?應該發生什麼? – stevieb

+0

@stevieb我這樣做了,但我沒有把它放在代碼中,因爲我很確定它是正確的。編輯顯示全部。 – mkpappu

+0

感謝您的更新。總是最好展示你的整個草圖,或者至少有一個最小的例子,其中包含所有必要的代碼以準確地重現你的問題。參見[SSCCE](http://sscce.org/)。 – stevieb

回答

0

更新,即使你的按鈕沒有被按下的切換狀態。這就是爲什麼邏輯不起作用。您還需要跟蹤按鈕何時釋放切換按鈕邏輯。

您也可能是切換反彈的下一個受害者。典型的開關不會從打開到關閉乾淨,並且在推動(和釋放)時可以產生小的,快速的打開/關閉信號。雖然這不會影響很多簡單的按下/按下按鈕的操作,但它是多狀態開關的殺手。

避免這種情況的簡單方法是限制讀取開關的速率。我發現30ms的速率非常好。

int last_time = 0; 
bool was_pushed = false; 

void loop() { 

    if (millis() - last_time > 30) // filter out signal bounce. 
    { 
    last_time = millis(); 
    if (digitalRead(3) == LOW) 
    { 
     if (!was_pushed)   // prevent toggling until button is released.  
     current = !current; 
     was_pushed = true; 
    } 
    else 
    { 
     was_pushed = false; 
    } 
    if (current != prev) 
    { 
     prev = current;   // keep the previous toggle state only on change. 
     if (current) 
     { 
     checkButtons_slow(); 
     delay(100); 
     } 
     else 
     { 
     //ZServo.write(110); 
     delay(500); //half a second 
     } 
    } 
    } 
} 
+0

如果我用這個替換我的代碼,那麼什麼都不會發生。雖然,如果我用'ZServo.write(80)'替換'checkButtons_slow();',那麼一旦我點擊一個按鈕,伺服就會移動,因爲ZServo.write(80);' – mkpappu

+0

這不是一個完整的草圖。你仍然需要包含你當前的設置()。 –

+0

我知道。我剛剛用它替換了我的循環()。 – mkpappu

0

,我發現你的實現和Michael是一個有點混亂,爲什麼不這樣做的:

bool state = false; 
bool buttonPressed = false; 
void loop(){ 
    if (digitalRead(3) == LOW && !buttonPressed){ 
     state=!state; 
     buttonPressed = true; 
    } 
    if(digitalRead(3) == HIGH){ 
     buttonPressed = false; 
    } 

    // Then your logic 
    if (state) { 
    checkButtons_slow(); 
    delay(100); 
    } else{ 
     //ZServo.write(110); 
     delay(500); //half a second 
    } 
} 
相關問題