Как сбросить клавиатуру при вводе неправильного пароля

Я работаю над головоломкой для своего племянника. В настоящее время у меня есть arduino mega, устройство чтения SD - карт и клавиатура. Все подключено правильно, и в настоящее время я запрограммировал его так, чтобы при вводе правильного пароля воспроизводился аудиофайл и загорался зеленый светодиод. Где я борюсь, я не знаю, как запрограммировать его так, чтобы при вводе неправильного кода доступа красный светодиод мигал, и код сбрасывался в положение 0. Я также заметил, что мой текущий пароль 1,2,3, и когда я добавляю случайное число между своим кодом доступа, скажем, 1,5,2,3 или даже 1,3,2,2,3, аудиофайл все еще воспроизводится, и зеленый светодиод загорается. Есть какие-нибудь предложения?

#include <Keypad.h>
#include <SD.h>                           
#include <TMRpcm.h>    
#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);
  }
}

, 👍0


2 ответа


0

У вас есть часть, проверяющая, соответствует ли ключ позиции в пароле, и если да, то вы увеличиваете позицию. Но если это не равно, тогда вы ничего не делаете. Вероятно, у вас там должен быть еще один, который сбрасывает позицию на 0 и сообщает пользователю, что он ввел неправильный пароль.

,

Спасибо за комментарий. Можно привести пример кода для исправления этой проблемы. Я попробовал несколько разных утверждений else, но ничего не вышло. Например: я попробовал: if if (key == password[position]) { позиция ++; } if (позиция == 3) { LockedPosition(false); } еще{ digitalWrite(R,HIGH); задержка(250); digitalWrite(R,LOW); задержка(250); digitalWrite(R,HIGH); позиция=0; } задержка(100); }, @Matt Gargiulo


1

Определите две строки:

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="";
        }


}

Это должно сделать свою работу.

,

Привет @JoB. К сожалению, я не получил ответа от клавиатуры, когда заменил свой void loop() на тот, который был опубликован выше. Есть ли причина, по которой это может быть?, @Matt Gargiulo

Привет @MattGargiulo Я отредактировал свой ответ. Я пропустил, что getKey не ждет ключа (не блокирует). Теперь он будет ждать ключа, а затем добавит его в строку ответа. Надеюсь, это сработает для вас. Я уже работал с клавиатурами раньше, но у меня нет клавиатуры, чтобы проверить этот код. Так что попробуйте это и сообщите здесь, если это не сработает., @JoB

ты-тот самый человек! Могу ли я интегрировать ваш код с двумя разными паролями? Моя конечная цель-создать головоломку для моего племянника, где одна комбинация дает 1 подсказку, а другая-другую., @Matt Gargiulo

Просто напишите электронное письмо на [email protected] и давайте поговорим об этом., @JoB