誤ったパスワードが入力されたときにリセットするためにキーパッドを取得する

私は私の甥のためのパズルに取り組んでいます。私は現在arduinoメガ、SDカードリーダーとキーパッドを持っています。すべてが正しく配線されており、現在プログラムされていますので、オーディオファイルよりも正しいパスワードを入力すると緑色のLEDが点灯します。私が苦労しているところでは、プログラムする方法がわからないので、間違ったパスコードを入力すると赤いLEDが点滅し、コードは0にリセットされます。私の現在のパスワードは1,2,3パスコードの間に乱数を追加すると、1,5,2,3、または1,3,2,2,3でもオーディオファイルが再生され、緑のLEDが点灯します。助言がありますか?

#include 
#include                            
#include     
#define SD_ChipSelectPin 53                

TMRpcm tmrpcm;                           
char* password = "123";  
int position = 0;
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte rowPins[ROWS] = { 8, 7, 6, 9 };
byte colPins[COLS] = { 5, 4, 3, 2 };
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
int R = 12;
int G = 13;

void setup(){
  pinMode(R, OUTPUT);
  pinMode(G, OUTPUT);

  LockedPosition(true); 
  tmrpcm.speakerPin = 46;                                                                                                  
  if (!SD.begin(SD_ChipSelectPin)) {          
    return;                              
  }  
}

void loop()
{
  char key = keypad.getKey();
  if (key == '*' || key == '#')
  {
    position = 0;
    LockedPosition(true);
  }
  if (key == password[position])
  {
    position ++;
  } 
  if (position == 3)
  {
    LockedPosition(false);
  }
  delay(100);
}

void LockedPosition(int locked)
{
  if (locked)
  {
    digitalWrite(R, HIGH);
    digitalWrite(G, LOW);
    position=0;
  }
  else
  {
    digitalWrite(R, LOW);
    digitalWrite(G, HIGH);
    tmrpcm.setVolume(6);                   
    tmrpcm.play("matt.wav"); ;
    delay(10000);
    digitalWrite(G,LOW);
  }
}
1
ru de

2 答え

キーがパスワード内の位置と等しいかどうかをチェックし、そうであればポジションをインクリメントします。しかし、それが平等でなければ、あなたは何もしません。おそらく、そこにelseを置いてその位置を0にリセットし、間違ったパスワードを入力したことをユーザーに伝える必要があります。

1
追加された
コメントありがとう。この問題を解決するためのサンプルコードを提供することができました。私はいくつかの異なるelse文を試しましたが、何も動作していないようです。例えば、私は試しました:if (key == password [position]){position ++; } if(position == 3){LockedPosition(false);} } else {digitalWrite(R、HIGH);}遅延(250); digitalWrite(R、LOW);遅延(250); digitalWrite(R、HIGH);位置= 0; }遅延(100); }
追加された 著者 Prof. Falken,

2つの文字列を定義する:

String password = "123";
String answer = "";

ループ関数を次のように置き換えます。

void loop()
{
        char key = keypad.getKey();//init. variable key keypad is non blocking
        while(key == NO_KEY)                //we got no key press? -> do again
        {
                key = keypad.getKey();
                delay(100);
        }
        answer.concat(key);         //add key to answer
        if(answer.equals(password)) //password OK
        {
                LockedPosition(false);
                answer="";
        }
        else
        {
                LockedPosition(true);
        }

        if (answer.length() > password.length()) {//answer is different and bigger than password
                                                  //can't become the right answer
                answer = "";
        }


        if (key == '*' || key == '#')
        {
                LockedPosition(true);
                answer="";
        }


}

それは仕事をするはずです。

0
追加された
こんにちは@MattGargiulo私は私の答えを編集しました。私はgetKeyがキー(非ブロック)を待っていないことを忘れていました。今すぐキーを待ってから、それを応答文字列に追加します。それはあなたのために働くことを願っています。以前はキーパッドで作業しましたが、そのコードをテストするためのキーパッドはありません。だから、これを試して、それが動作しない場合はここに報告してください。
追加された 著者 Nghia,
[email protected]にメールを書き、そのことについて話しましょう。
追加された 著者 Nghia,
こんにちは@JoB。残念ながら、上記の投稿に私のvoid loop()を代入すると、キーパッドから何の応答も得られませんでした。これがなぜあるのか?
追加された 著者 Prof. Falken,
あなたは男です! 2つの異なるパスワードでコードを統合できますか?私の究極の目標は、1つのコンボが1つの手がかりを与え、別のコンボが別の手がかりを与える甥のためのパズルを設定することです。
追加された 著者 Prof. Falken,