2016-08-04 11 views
-1

単純なArduino加算器を作ろうとしていますが、プログラミングに問題があります。私はどこでミスをしたのか分かりません。どんな助けでも大歓迎です。2つのキーパッド入力を別々の変数に取り込んで保存する方法をArduinoにプログラムする方法はありますか?

ユーザーはキーパッドで2つの数字を入力する必要があり、その合計はLCDに表示されます。ユーザーが入力した2つの数字は、それぞれ変数に格納されます。問題は、最初の数値を入力した後に、2番目の変数に対して、プログラムは自動的に0(その時点でキーが押されていないため)を差し込みます。私はNO_KEYを排除するために 'if'、 'while'および 'do while'ステートメントを試しましたが、これらのどれも動作していないようです。

ユーザーが入力した数値を変数に格納し、その時点でキーが押されていないため、プログラムが変数を0で上書きしないようにする方法があるかどうかです。また、キーが押された後にArduinoにキーパッドからの入力が届かないようにするには...

コードを見て時間を費やしたい場合は、リンクされたhereには、コードとラボセットアップ全体の両方が含まれています。

#include <Keypad.h> 
#include <LiquidCrystal.h> 

LiquidCrystal lcd (7,8,9,10,11,12); 
int backLight(13); 


int Addition(int x, int y){ 
    int z; 
    z = x+y; 
    lcd.setCursor(8,0); 
    lcd.write(z); 
} 

void setup() { 

} 

const byte rows =4; 
const byte cols =3; 

char keys[rows][cols]={ 
    {'1','2','3'}, 
    {'4','5','6'}, 
    {'7','8','9'}, 
    {'*','0','#'} 
}; 

byte rowPins[rows] = {0,1,2,3}; 
byte colPins[cols] = {4,5,6}; 

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols); 


void loop(){ 

    int a; 
    int b; 

    a = keypad.getKey(); 
    if (a != NO_KEY){ 

     do { 
      b = keypad.getKey(); 
     }while (b == NO_KEY); 

     pinMode (backLight, OUTPUT); 
     digitalWrite(backLight, HIGH); 
     lcd.begin(16,2); 
     lcd.clear(); 

     lcd.setCursor(0,0); 
     lcd.write(a); 

     lcd.setCursor(2,0); 
     lcd.write("+"); 

     lcd.setCursor(4,0); 
     lcd.write(b); 

     lcd.setCursor(6,0); 
     lcd.write("="); 

     Addition(a,b); 
     delay(10000); 

    } 

} 
+0

回路はおそらく無関係ですが、コードはありませんので、実際のコードを含めるためにあなたの質問を編集してください。コードへのリンクを持つ質問は、リンクが消えることを誰が知っているので価値がありません。しばらく時間を取って[良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask)、[最小限の、完全で検証可能な例](http: //stackoverflow.com/help/mcve)。 –

答えて

1

あなたはこのようなコードのセクションがあります:あなたの代わりに(b == NO_KEY)との平等をチェックする、(b = NO_KEY)bからNO_KEYを割り当てているようにwhile条件で

do { 
    b = keypad.getKey(); 
} while (b = NO_KEY); 

を、それが見えます。代入はtrueを返します。したがって、ループは終了しません。 それは次のようになります。追加の問題については

do { 
    b = keypad.getKey(); 
} while (b == NO_KEY); 

を、あなたのキーマップではなくint型よりも文字が含まれています。だから、aとbがchar型である必要があり、そしてあなたがint型に変換するatoi()を使用することができます。

int keys[rows][cols]={ 
    {1, 2, 3}, 
    {4, 5, 6}, 
    {7, 8, 9}, 
    {'*',0,'#'} 
}; 

をして印刷するlcd.print(a, DEC)を使用:代わり

char a; 
char b; 

// ...assign values to a and b as you already do... 

Addition(atoi(a), atoi(b)); // use atoi() (ascii to int) to pass integer values to Addition 

、あなたがあるためにあなたのキーマップを変更することができますその価値。その後、あなたはatoi()の必要がなく、私の意見ではもっときれいになります。 追加機能:

Addition(int x, int y) { 
    int z; 
    z = x+y; // z is now the integer sum 
    lcd.setCursor(8,0); 
    lcd.print(z, DEC); // print the decimal value of z (default is ascii) 
} 
+0

ありがとう! –

+0

申し訳ありません。だからあなたのおかげでその中途半端な作業をしています...何らかの理由で数字の代わりに文字を表示します。 –

+0

実際、数値の位置を保持するアルファベットの文字として合計を表示しています。 1 + 1 = b(2番目の文字として2)2 + 2 = dなど... –

関連する問題