(Arduino Mega2560) Проверка пароля клавиатуры
Я работаю над школьным проектом, в основном я должен создать систему блокировки, которая открывает фиктивные ворота, когда вводится правильный код. Нас попросили смоделировать нашу систему перед ее фактическим построением. Итак, я сделал следующую схему в Proteus(программное обеспечение для моделирования Labcenter Electronics): Схема клавиатуры
Извините, я не могу публиковать изображения.
Вот что должна делать моя система: переменная содержит правильный код, и пользователь должен ввести код на клавиатуре, и, если он правильный, загорается зеленый светодиод и на ЖК-экране отображается сообщение "Доступ разрешен!" если код неверный, на экране отобразится "Отказано в доступе!". Это базовая система, но я пытаюсь сделать ее максимально простой / короткой (я должен объяснить это в устной презентации, поэтому чем проще, тем лучше), и по какой-то причине я не могу заставить свой код работать, В идеале, я бы хотел, чтобы на каждом набранном символе был ЖК-дисплей *, как в реальной системе безопасности, но мне также не удалось этого сделать. Я работал над этим часами, пробовал разные варианты и т. Д., Но, похоже, ничего не работает так, как я хочу. Кстати, моя схема работает отлично, и поэтому часть инициализации моего кода также правильная. Может кто-нибудь помочь мне понять, что не так с моим кодом и как я могу сделать его лучше?
Вот мой код до сих пор:
#include <LiquidCrystal.h>
#include <Keypad.h>
//define LED pins
#define redLED 11
#define greenLED 10
String codeSerrure = "87362"; //correct code that opens the imaginative gate
String enteredCode = "";
int keyPressed;
const byte rows = 4;
const byte cols = 3;
char touches_digicode [rows] [cols] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'*', '0', '#'}
};
byte rowPins [rows] = {25, 26, 27, 28};
byte colPins [cols] = {24, 23, 22};
Keypad leDigicode = Keypad( makeKeymap(touches_digicode), rowPins, colPins, rows, cols);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
void setup(){
lcd.begin(16, 2);
pinMode(redLED, OUTPUT);
pinMode(greenLED, OUTPUT);
digitalWrite(redLED, HIGH);
}
void loop(){
lcd.setCursor(0,0);
lcd.print(" Entrez le code");
keyPressed = leDigicode.getKey();
enteredCode += String(keyPressed);
if(enteredCode.length() >= 5){
if(enteredCode == codeSerrure){
digitalWrite(greenLED, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Acces autorise!");
delay(4000);
digitalWrite(greenLED, LOW);
digitalWrite(redLED, HIGH);
enteredCode = "";
}
else{
digitalWrite(redLED, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Acces refuse!");
delay(4000);
enteredCode = "";
}
}
if(keyPressed == "#"){
lcd.clear();
enteredCode = "";
}
}
Проблема заключается в том, что когда я запускаю этот код в программном обеспечении для моделирования, на ЖК-дисплее отображается сообщение "Получите отказ!" и красный светодиод горит. Неважно, какие клавиши я нажимаю (на клавиатуре), ничего не происходит. Поэтому проблема в том, что мой код переходит прямо к оператору else, делая вывод, что введенный пароль неверен (хотя на самом деле пароль не был введен). Я думаю, что ошибка здесь:
keyPressed = leDigicode.getKey();
enteredCode += String(keyPressed);
if(enteredCode.length() >= 5){
if(enteredCode == codeSerrure){
Кстати, прости французские слова, я француз. Кроме того, я забыл сказать, что клавиша # должна очистить введенный код. Любые объяснения, примеры кода или ссылки помогут. Спасибо!
2 ответа
Благодаря всей вашей помощи, ребята, мне, наконец, удалось закодировать все функции, которые я хотел, без сбоев, и код стал намного чище. Я знаю, что мой код не идеален и, вероятно, может быть улучшен, поэтому, если кто-то все еще заинтересован, любые идеи по модификации приветствуются. Во всяком случае, вот мой окончательный код для тех, кто заинтересован:
#include <LiquidCrystal.h>
#include <Keypad.h>
//define LED pins
#define redLED 11
#define greenLED 10
int contrast = 25;
String codeSerrure = "87362";
char keyPressed;
const byte rows = 4;
const byte cols = 3;
char touches_digicode [rows] [cols] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'*', '0', '#'}
};
byte rowPins [rows] = {25, 26, 27, 28};
byte colPins [cols] = {24, 23, 22};
Keypad leDigicode = Keypad( makeKeymap(touches_digicode), rowPins, colPins, rows, cols);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
byte e_aigu[8] = {
B00010,
B01100,
B00000,
B01110,
B10001,
B11111,
B10000,
B01110
};
byte e_grave[8] = {
B01000,
B00110,
B00000,
B01110,
B10001,
B11111,
B10000,
B01110
};
void setup(){
analogWrite(8, contrast);
lcd.createChar(0, e_aigu);
lcd.createChar(1, e_grave);
lcd.begin(16, 2);
pinMode(redLED, OUTPUT);
pinMode(greenLED, OUTPUT);
digitalWrite(redLED, HIGH);
}
void loop(){
String enteredCode = "";
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Entrez le code:");
while(enteredCode.length() < 5){
keyPressed = leDigicode.getKey();
if(keyPressed){
if(keyPressed == 0x23 || keyPressed == 0x2A){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Entrez le code:");
enteredCode = "";
}
else
{
enteredCode += keyPressed;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Entrez le code:");
lcd.setCursor(5, 1);
for(int i=0; i < enteredCode.length(); i++){
lcd.print("*");
}
}
}
}
delay(390);
if(enteredCode == codeSerrure){
digitalWrite(redLED, LOW);
digitalWrite(greenLED, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Acc");
lcd.write((uint8_t)1);
lcd.print("s autoris");
lcd.write((uint8_t)0);
lcd.print("!");
delay(4000);
digitalWrite(greenLED, LOW);
digitalWrite(redLED, HIGH);
}
else
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Acc");
lcd.write((uint8_t)1);
lcd.print("s refus");
lcd.write((uint8_t)0);
lcd.print("!");
delay(4000);
}
}
Как видите, я многое изменил. Я переписал функцию проверки пароля с помощью цикла while и встроил функцию, которая отображает * на ЖК-дисплее при каждом нажатии клавиши. Я также добавил функцию стирания для клавиш * и #. И так как мой ЖК-дисплей не поддерживает такие символы, как é и è (они нужны мне для французских слов, почему мы должны все усложнить), я создал свой собственный. Я также внес небольшую модификацию в свою схему, снял потенциометр и назначил вместо этого значение контрастности ЖК-дисплея в своем коде. Вот готовая схема:
Не можете опубликовать фотографии еще
Спасибо всем, кто мне помог!
Метод getKey() возвращает символ; так что ВСЕГДА возвращает символ! Например, если ни одна клавиша не была нажата, она возвращает NO_KEY (= '\0').
То, как вы написали свой код, вы быстро заполняете enteredCode
строка с "\0\0\0\0\0". Измените свой код с помощью:
keyPressed = leDigicode.getKey();
if (keyPressed) {
enteredCode += String(keyPressed);
// following is for debug
// lcd.print(keyPressed); delay(300);
}
if(enteredCode.length() >= 5) { ...