2012-07-18 62 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