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! ");
}
嘗試一個簡單的草圖這不只是一遍又一遍打印的數字輸入的狀態到串行輸出。此外,使用電壓表檢查按鈕對應的atmega引腳電平是否發生變化。 – 2012-07-18 18:28:51
@Chris,以前我已經嘗試過這兩件事,儘管我感謝你的建議。對不起,我沒有說清楚。 [編輯]:我忘了說這兩個測試都給出了完美的結果。 – user1316644 2012-07-18 19:12:00
如果這樣做,那麼複製一份當前的項目並開始評論複雜性,直到剩下足夠的時間才能工作爲止;然後開始重新激活它,直到它再次中斷。 – 2012-07-18 19:25:37