2012-07-11 79 views
1

我使用下面的代碼determin在拇指搖桿定位:拇指手柄位置只有一次

const int Left = 1; 
const int Right = 2; 
const int Up = 3; 
const int Down = 4; 
const int Center = 0; 
int lastButton = -1; 

int xpin = 4; 
int ypin = 5; 

int xAxis; 
int yAxis; 
char* myStrings[]={"Left","Right","Up","Down"}; 
int button; 

void setup() { 
    Serial.begin(9600); 
} 

void loop() { 
    xAxis=map(analogRead(xpin), 0, 1023, 0, 10); 
    yAxis=map(analogRead(ypin), 0, 1023, 0, 10); 

    if (button == lastButton) { 
     //Serial.println(0); 
     //button = 0; 
     delay(50); 
    } else { 
     if (xAxis < 4) { 
      button = Left; 
     } 
     else if (xAxis > 6) { 
      button = Right; 
     } 

     if (yAxis < 4) { 
      button = Down; 
     } 
     else if (yAxis > 6) { 
      button = Up; 
     } 

     Serial.println(myStrings[button-1]); 
     button = 0; 
     delay(50); 
    } 

    lastButton = button; 
} 

上面的代碼工作在我的Arduino得很好,但我期待只得到了現在的位置ONCE而不是每一秒,而它在那裏舉行。

如何將代碼更改爲只有一個值,直到它再次居中(0)

例子:

如果我操縱桿向左移動讀取:

Left 
Left 
Left 
Left 
etc etc until i release it. 

什麼,我希望做的是這樣的:

Left 
then it stops until i release it. 

任何幫助將是巨大的!

更新

if (xAxis ==5) { 
    button = Center; 
} 

if (yAxis ==5) { 
    button = Center; 
} 

似乎與向上和向下,但沒有真正的左,右很好地工作。有時它起作用,但更多時候不起作用。

+1

有布爾變量,如'isLeft'你它向左移動或釋放時設置。我不完全確定它對於遊戲杆的效果如何,但對於普通按鍵來說它確實很不錯。 – chris 2012-07-11 21:20:31

+0

'lastButton'初始化在哪裏? – 2012-07-11 21:51:54

+0

** int lastButton = -1; ** – StealthRT 2012-07-11 21:53:33

回答

1

記住,你在最後一次迭代哪裏,並比較是看它是否已經改變:

int lastButton = 0; 
... 
void loop() { 
    button = ...// Read button state 
    ... 
    if (button != lastButton) { 
     ... // New keypress 
     lastButton = button; 
    } 
} 

完全清理代碼:

enum ButtonState { Neutral=0, Left=1, Right=2, Up=3, Down=4 }; 

ButtonState lastButton = Neutral; 

const int XPin = 4; 
const int YPin = 5; 

char* myStrings[]={"Neutral", "Left","Right","Up","Down"}; 

void setup() { 
    Serial.begin(9600); 
} 

ButtonState readButtonState() { 
    int xAxis=map(analogRead(XPin), 0, 1023, 0, 10); 
    int yAxis=map(analogRead(YPin), 0, 1023, 0, 10); 
    if (xAxis < 4) return Left; 
    if (xAxis > 6) return Right; 
    if (yAxis < 4) return Down; 
    if (yAxis > 6) return Up; 
    return Neutral; 
} 

void loop() { 
    ButtonState button = readButtonState(); 
    if (button != lastButton) { 
     Serial.println(myStrings[button]); 
     lastButton = button; 
    } 
    delay(50); 
} 
+0

不應該'lastButton = button;'進入條件代碼? – 2012-07-11 21:26:29

+0

它並不是必須的,但當它沒有必要的時候,將它移到裏面當然會跳過這個任務。 – Kleist 2012-07-11 21:38:08

+0

聽起來對我來說是一個很好的理由。 – 2012-07-11 21:41:39

0

應該更多這樣的:

const int Left = 1; 
const int Right = 2; 
const int Up = 3; 
const int Down = 4; 

int xpin = 4; 
int ypin = 5; 

int xAxis; 
int yAxis; 
char* myStrings[]={"Left","Right","Up","Down"}; 
int button; 


void setup() { 
    Serial.begin(9600); 
} 
int lastButton = -1; // init lastButton to a never occurring value 

void loop() { 

    xAxis=map(analogRead(xpin), 0, 1023, 0, 10); 
    yAxis=map(analogRead(ypin), 0, 1023, 0, 10); 

    if (xAxis < 4) { 
    button = Left; 
    } 
    else if (xAxis > 6) { 
    button = Right; 
    } 

    if (yAxis < 4) { 
    button = Down; 
    } 
    else if (yAxis > 6) { 
    button = Up; 
    } 

    if (button == lastButton){ 
     //Serial.println(0); 
     //button = 0; 
     delay(50); // wait more 
    }else{ 
     lastButton = button; 
     Serial.println(myStrings[button-1]); 
     button = 0; 
     delay(50); 
    } 
} 
+0

感謝您的代碼。它的工作,但如果我想做**左**然後**中**然後**左**再次它不註冊,直到我去其他位置,然後回到**左**? – StealthRT 2012-07-11 22:32:37

+0

@StealthRT然後,您應該將一個值與新的中心常數關聯起來('0'將作爲'-1'關聯於「尚未檢測到位置」),適當地檢測操縱桿的居中位置並將相關值分配給'if(button == lastButton)'條件發生前''button'。 – 2012-07-11 22:39:04

+0

查看我的OP更新代碼 – StealthRT 2012-07-11 23:15:34

0

看看這個google code項目,作者真的在這裏做了一些很棒的工作。我在我的一個項目中使用它,它需要很少的定製(如果有的話)。

這是一個遊戲杆小部件,它已經非常穩固,可以輕鬆定製。我總是不願意使用其他人的代碼,但是這會讓我花費相當長的時間來做出像這樣令人敬畏的事情。

演示http://code.google.com/p/mobile-anarchy-widgets/wiki/JoystickView

來源http://code.google.com/p/mobile-anarchy-widgets/source/browse/trunk/Widgets/src/com/MobileAnarchy/Android/Widgets/Joystick/JoystickView.java