2

堆栈溢出!我是一个对 Arduino 编码相当陌生的少年,正在调查一个问题。如果这有所作为,我正在运行 Linux Ubuntu 10.10。我有一个自制的板子,由五个按钮组成,左、右、上、下各一个,一个中心按钮和一个日立 2x16 字符 LCD 屏幕,使用 Arduino Uno 板。我的程序目的是播放我的初始屏幕,从屏幕上的三个开始倒计时,显示一条有用的消息,然后进入程序,它只是打开一个项目列表,一次显示一个,并允许您使用滚动浏览它们向上和向下按钮,然后单击中心按钮退出程序。所以,问题来了:程序的其余部分工作得很好,但是当涉及到菜单时,它正确地显示了第一项,但是这些按钮并没有起到它们的作用。我使用串行监视器进行了检查,按下时按钮的状态没有改变。但这是踢球者。我用电压表检查按钮是否正确使用电源,它们是。他们只是似乎没有以数字方式工作。我检查了我的接线,一切都是正确的。我认为问题可能出在代码中,所以我把它留给你更有经验的人:

// 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(" _@ 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!    ");

}
4

1 回答 1

0

首先,您需要对按钮进行去弹跳。

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

其次,在您的 case 语句之前,您将 itemNum 设置为 0。这可能应该移至 setup 部分,否则它将在循环的每次迭代中重置 itemNum,并且您将始终卡在“END OF LIST”上。

同样与 String item = ""; 您在循环的每次迭代中都将字符串消隐,并且它的运行速度比您按下按钮的速度要快。

此外,我没有看到任何代码将字符串项设置为除“”之外的任何内容。由于您在案例语句中打印项目名称,也许您可​​以删除“字符串项目”和所有引用。

最后,您可以将延迟循环部分缩短为:

int i = 3;
  while (i > 0) {
    lcd.setCursor(0, 1);
    lcd.print("Wait " + i + " second(s)");
    delay(1000);
    i--;
  }
于 2012-07-19T23:10:50.490 回答