2

スタックオーバーフロー!私は Arduino コーディングにかなり慣れていない 10 代の若者で、問題を調査しています。それが違いを生む場合、私はLinux Ubuntu 10.10を実行しています。Arduino Unoボードを使用して、左、右、上、下にそれぞれ1つずつ、中央に1つのボタン、および日立の2x16文字LCDスクリーンの5つのボタンで構成される自家製のボードを使用してセットアップを行っています..私のプログラムの目的はスプラッシュ スクリーンを再生し、画面上の 3 つからカウントダウンを発行し、役立つメッセージを表示してから、プログラムに移動します。これにより、アイテムのリストが開き、一度に 1 つずつ表示され、次を使用してそれらをスクロールできます。上下のボタンを押し、中央のボタンをクリックしてプログラムを終了します。ここに問題があります。プログラムの残りの部分は問題なく動作しますが、メニューになると、最初の項目が正しく表示されます。しかし、ボタンはその目的を果たしません。シリアルモニターで確認したところ、ボタンを押しても状態が変化しません。しかし、ここにキッカーがあります。電圧計を使用して、ボタンが正しく電力を使用しているかどうかを確認しました。彼らはデジタルで働いているようには見えません。配線を確認しましたが、すべて正しいです。問題はコードにあると思われるので、経験豊富な方にお任せします。

// 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 に設定します。これはおそらくセットアップ セクションに移動する必要があります。そうしないと、ループの反復ごとに 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 に答える