Как сбросить клавиатуру при вводе неправильного пароля
Я работаю над головоломкой для своего племянника. В настоящее время у меня есть 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);
}
}
@Matt Gargiulo, 👍0
2 ответа
У вас есть часть, проверяющая, соответствует ли ключ позиции в пароле, и если да, то вы увеличиваете позицию. Но если это не равно, тогда вы ничего не делаете. Вероятно, у вас там должен быть еще один, который сбрасывает позицию на 0 и сообщает пользователю, что он ввел неправильный пароль.
Определите две строки:
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
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Arduino Due vs Mega 2560
- Как получить уникальный идентификатор для всех плат Arduino?
- Почему я получаю avrdude: stk500v2_ReceiveMessage(): timeout error when uploading to Arduino Mega?
- Тайм-аут связи Arduino Mega с ошибкой программатора
Спасибо за комментарий. Можно привести пример кода для исправления этой проблемы. Я попробовал несколько разных утверждений 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