2012-07-11 59 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