2017-03-27 19 views
1

私はArduino Unoの下のスケッチを作成するためにバディーと一緒に作業しましたが、問題が残っています。コードの目的は、Unoのピン1-6である6つのボタンからボタンプッシュを読み取って、格納されたボタンが格納されている配列をプッシュして正しいかどうかを確認することです。Arduinoで配列に値をチェックするときにエラーが発生する

ボタンを押すと、黄色のLEDが点灯します。 5つのボタンを入力すると、アレイと照合し、間違っている場合は赤いLEDを表示します。あなたが正しいなら、それはあなたに緑色のLEDを与え、次にリレーを開くようにトリガーします。

私たちが行っているコードは断続的に動作しますが、毎回機能しません。私はそれが配線問題ではないと信じています。なぜなら、私がボタンを押したときに毎回動作させることができるからです。

エラーの原因を特定できませんでした。私はそれを使用しているときに私はエラーを複製することができませんでしたが、それはエラーを続けます。エラーが発生したら、Arduinoを再起動して再度動作させる必要があります。

私の予想は、ボタンが押されているか、またはループ内でカウンタが開始され、再開されるようなことです。私はユーザを訓練することができないので、ボタンを押さえているか、そうでないとエラーになるかもしれない。

私はそれが簡単な答えであることを期待していますが、私はコーディングに熟練していないので、私はいくつかの助けを望んでいました。

// Button pins 
const int button1 = 1; 
const int button2 = 2; 
const int button3 = 3; 
const int button4 = 4; 
const int button5 = 5; 
const int button6 = 6; 
const int grnLed = 11; 
const int redLed = 9; 
const int yellowLed = 10; 
const int openRelay = 7; 

const int brightness = 300; 

// How long is our code, kind of personal 
const int codelen = 5; 

// Pin code values must match button pin values 
char PIN[codelen] = { 
    '4', '1', '5', '3', '2' 
}; 

// Attempted combination 
char attempt[codelen] = { 
    '0', '0', '0', '0' ,'0' 
}; 

// Attempt count 
int z = 0; 

void setup() { 

    // You've been set up 
    pinMode(button1, INPUT_PULLUP); 
    pinMode(button2, INPUT_PULLUP); 
    pinMode(button3, INPUT_PULLUP); 
    pinMode(button4, INPUT_PULLUP); 
    pinMode(button5, INPUT_PULLUP); 
    pinMode(button6, INPUT_PULLUP); 
    //pinMode(openRelay, OUTPUT); 

    // Set pullup resistor for buttons 
    digitalWrite(button1, HIGH); 
    digitalWrite(button2, HIGH); 
    digitalWrite(button3, HIGH); 
    digitalWrite(button4, HIGH); 
    digitalWrite(button5, HIGH); 
    digitalWrite(button6, HIGH); 
    //digitalWrite(openRelay, LOW); 
} 


void correctPIN() 
{ 
    pulseLED(grnLed, brightness, 3000); 
    pulseLED(openRelay, brightness, 1500); 
    //analogWrite(openRelay, HIGH); 
    //delay(2000); 
    //analogWrite(openRelay, LOW); 
    z = 0; 
} 

void incorrectPIN() 
{ 
    pulseLED(redLed, brightness, 2000); 

    z = 0; 
} 

void checkPIN() 
{ 
    int correct = 0; 
    int i; 
    for (i = 0; i < codelen; i++) 
    { 

    if (attempt[i] == PIN[i]) 
    { 
     correct++; 
    } 
    } 
    if (correct == codelen) 
    { 
    correctPIN(); 
    } 
    else 
    { 
    incorrectPIN(); 
    } 

    for (int zz = 0; zz < codelen; zz++) 
    { 
    attempt[zz] = '0'; 
    } 
} 


void checkButton(int button){ 

    if (digitalRead(button) == LOW) 
    { 
    while (digitalRead(button) == LOW) { } // Do nothing 

    // Convert int to string for tracking/compare 
    char buttStr = button + '0'; 
    attempt[z] = buttStr; 
    z++; 

    //Light up LED so we know botton press worked 
    pulseLED(yellowLed, brightness, 500); 
    } 
} 


void pulseLED(int ledpin, int brightness, int msec) { 
    analogWrite(ledpin, brightness); 
    delay(msec); 
    analogWrite(ledpin, LOW); 
} 


void loop() { 

    // Check buttons 
    checkButton(button1); 
    checkButton(button2); 
    checkButton(button3); 
    checkButton(button4); 
    checkButton(button5); 
    checkButton(button6); 

    // If number of buttons pressed, z, matches code/pin length then check 
    if (z >= codelen) 
    { 
    checkPIN(); 
    } 
} 
+1

は、私はデバウンス処理するために、任意のコードが表示されません。それをハードウェアで処理しましたか? –

答えて

1

あなたは機械的スイッチを押すと、それは回路が急速に連続して数回を開閉させるためのアーク放電や連絡先の実際のバウンスのために可能です。

問題は、ボタンプレスを「デバウンス」していないということです。ボタンを1回クリックすると、実際には複数の連続したプレスとして登録することができます。

ソフトウェアでこれを処理する最も簡単な方法は、ピンがローになったことを検出した後に遅延を追加し、遅延後にピンを再度チェックすることです。だから、代わりに:

if (digitalRead(button) == LOW) 
{ 
    delay(20); 
    if (digitalRead(button) == LOW) { 
     ... 
    } 
} 

より洗練されたアプローチがありますが、私はこれがあなたの当面の問題を解決賭け:

if (digitalRead(button) == LOW) 
{ 
    while (digitalRead(button) == LOW) { } // do nothing 
    ... 
} 

あなたのような何かをしたいです。

+0

ボード上の内部プルアップ抵抗を設定し、ピンをハイに設定すると、デバウンスの問題が解決されるとの印象を受けました。だからあなたの考えは、おそらく私の問題を解決するだろうボタンを再度チェックする前に、単純な20ミリ秒の遅延ですか? – schrades1113

+0

プルアップ抵抗を使用すると、スイッチやボタンをピンに簡単に接続することができます。それはどんなデバウンスもしません。はい、一般的にノイズをフィルタリングするのに十分な時間がかかります。人々は遅延の長さを議論するだろうが、実際の2回目のプレスが間に合わずに済むプッシュボタンでうまくいくには20ミリ秒で十分だと思う。 –

0

あなたは上記提供された情報に基づいて、ここにチェックボタンの機能で私の更新の試みです:

void checkButton(int button){ 

    if (digitalRead(button) == LOW) 
{ 
    delay(20); 
    if(digitalRead(button) == LOW) 
     while (digitalRead(button) == LOW) { } // do nothing 
     //convert int to string for tracking/compare 
     char buttStr = button + '0'; 
     attempt[z] = buttStr; 
     z++; 
     //light up led so we know btn press worked 
     pulseLED(yellowLed, brightness, 500); 
    } 
} 
関連する問題