2012-07-18 58 views
1

StackOverflow!我是一个相当新的Arduino编码的青少年,并且正在调查一个问题。如果这有所帮助,我正在运行Linux Ubuntu 10.10。我有一个自制的棋盘,包括五个按钮,每个左,右,上,下,一个中心按钮,以及一个日立2x16字符液晶屏,使用Arduino Uno板。我的程序目的是发挥我的启动画面,从三个屏幕上发出倒计时,显示一条有用的信息,然后进入程序,它只是打开一个项目列表,一次显示一个项目,并允许您使用向上和向下按钮,并通过单击中心按钮退出程序。所以,问题在于:程序的其余部分工作得很好,但是当涉及到菜单时,它正确显示了第一项,但这些按钮没有达到其目的。我使用串口监视器进行了检查,按下按钮的状态不会改变。但这是踢球。我用伏特计检查按钮是否正确使用电源,而且它们是。他们似乎没有数字化工作。我检查了我的接线,这是完全正确的。我认为,问题可能出在代码,所以我把它留给你的经验更丰富的手:按钮故障(Arduino)

// include the library code: 
#include <LiquidCrystal.h> 

int itemNum = 0; 

// Declare variables for on and off states, for efficiency! 
int on = LOW; 
int off = HIGH; 

// Declare the buttons' digital pins and states respectively 
const int upbtnpin = 8; 
const int dwnbtnpin = 9; 
const int cntrbtnpin = 10; 

int upbtnstate = off; 
int dwnbtnstate = off; 
int cntrbtnstate = off; 

// initialize the library with the numbers of the interface pins 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 

void setup() { 

    // Activate Serial Monitor 
    Serial.begin(9600); 

    // Declare buttons to be INPUT 
    pinMode(upbtnpin, INPUT); 
    pinMode(dwnbtnpin, INPUT); 
    pinMode(cntrbtnpin, INPUT); 

    // Activate Pullups 
    digitalWrite(upbtnpin, HIGH); 
    digitalWrite(dwnbtnpin, HIGH); 
    digitalWrite(cntrbtnpin, HIGH); 

    // Begin LCD 
    lcd.begin(16, 2); 


    // Splash Screen 
    lcd.setCursor(0, 0); 
    lcd.print(" [email protected] Paradigm @_"); 
    lcd.setCursor(0,1); 
    lcd.print("<-> Robotics <->"); 
    delay(3000); 
    lcd.clear(); 

    // Display Message and countdown 
    cntrbtnstate = digitalRead(cntrbtnpin); 
    lcd.setCursor(0, 0); 
    lcd.print("Menu Program 1.0"); 
    lcd.setCursor(0, 1); 

    int i = 3; 
    while (i > 0) { 

    if (i == 3) { 
    lcd.setCursor(0, 1); 
    lcd.print("Wait 3 second(s)"); 
    delay(1000); 
    i--; 
    } 

    else if (i == 2) { 
    lcd.setCursor(0, 1); 
    lcd.print("Wait 2 second(s)"); 
    delay(1000); 
    i--; 
    } 

    else if (i == 1) { 
    lcd.setCursor(0, 1); 
    lcd.print("Wait 1 second(s)"); 
    delay(1000); 
    i--; 
    } 

} 
    lcd.clear(); 
    delay(500); 
    lcd.setCursor(0, 0); 
    lcd.print("Press enter any"); 
    lcd.setCursor(0, 1); 
    lcd.print(" time to exit. "); 
    delay(1200); 
    lcd.clear(); 


} 



// ...And finally, to the actual program! 

void loop() { 
    upbtnstate = digitalRead(upbtnpin); 
    dwnbtnstate = digitalRead(dwnbtnpin); 
    cntrbtnstate = digitalRead(cntrbtnpin); 

    while (cntrbtnstate != on) { 

    if (upbtnstate == on) { 
     delay(250); 
     itemNum++; 
    } 

    else if (dwnbtnstate == on) { 
     delay(250); 
     itemNum--; 
    } 

    // OPTIONAL for debugging 
    delay(150); 
    Serial.print(" ! "); 
    delay(150); 
    Serial.print(int(upbtnstate)); 
    Serial.print(" "); 
    delay(150); 
    Serial.print(int(dwnbtnstate)); 
    Serial.print(" "); 
    delay(150); 
    Serial.print(int(cntrbtnstate)); 

    String item = ""; 
    int itemNum = 0; 

    switch(itemNum) { 

     case 0: 
     lcd.setCursor(0, 1); 
     lcd.print("END OF LIST"); 
     break; 
     case 1: 
     lcd.setCursor(0, 1); 
     lcd.print("Water Bottle"); 
     break; 
     case 2: 
     lcd.setCursor(0, 1); 
     lcd.print("Biker Jacket"); 
     break; 
     case 3: 
     lcd.setCursor(0, 1); 
     lcd.print(".44 Magnum"); 
     break; 
     case 4: 
     lcd.setCursor(0, 1); 
     lcd.print(".44 Rounds (x14)"); 
     break; 
     case 5: 
     lcd.setCursor(0, 1); 
     lcd.print("Machete"); 
     break; 
     case 6: 
     lcd.setCursor(0, 1); 
     lcd.print("END OF LIST"); 
     break; 
     default: 
     lcd.setCursor(0, 0); 
     lcd.print(" An error has "); 
     lcd.setCursor(0, 1); 
     lcd.print(" occoured "); 
    } 

    if (itemNum > 6) { 
     itemNum == 6; 
    } 

    else if (itemNum < 0) { 
     itemNum == 0; 
    } 

    lcd.setCursor(0, 1); 
    lcd.print(item); 
    } 
    lcd.clear(); 
    lcd.setCursor(0, 1); 
    lcd.print(" Goodbye! "); 

} 
+2

尝试一个简单的草图这不只是一遍又一遍打印的数字输入的状态到串行输出。此外,使用电压表检查按钮对应的atmega引脚电平是否发生变化。 – 2012-07-18 18:28:51

+0

@Chris,以前我已经尝试过这两件事,尽管我感谢你的建议。对不起,我没有说清楚。 [编辑]:我忘了说这两个测试都给出了完美的结果。 – user1316644 2012-07-18 19:12:00

+0

如果这样做,那么复制一份当前的项目并开始评论复杂性,直到剩下足够的时间才能工作为止;然后开始重新激活它,直到它再次中断。 – 2012-07-18 19:25:37

回答

0

首先,你需要去抖的按钮。

http://arduino.cc/it/Tutorial/Debounce

其次,马上你的case语句之前,你itemNum设置为0。这或许应该被移动到设置部分,否则会在每次循环迭代复位itemNum,和你永远被卡在“结束名单”。

同样用String item =“”;循环的每次迭代都会消隐字符串,并且运行速度比按下按钮的速度快。

此外,我没有看到任何代码,将字符串项目设置为除“”之外的任何内容。由于您在case语句中打印了项目名称,因此您可以删除“String item”和所有参考。

最后,可以缩短延迟环路部分:

int i = 3; 
    while (i > 0) { 
    lcd.setCursor(0, 1); 
    lcd.print("Wait " + i + " second(s)"); 
    delay(1000); 
    i--; 
    } 
+0

我会尝试去除。就其他事情而言,最近我在阅读这篇文章之前就讽刺地解决了这些问题。对于缩短的延迟循环,当我创建程序的第一个版本时,我已经设置了它,但它给出了,并且仍然给出了(我刚刚检查过)错误'类型的无效操作数'const char *'和'const char [11]'to binary'operator +''谢谢其他建议,尽管:) – user1316644 2012-07-24 01:53:20

+0

尝试'lcd.print(sprintf(“Wait%d second(s)”,i));'' – DeanG 2012-07-27 18:39:37