(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) {   ...  
Другие вопросы по тегам