Помогите с проверкой пароля

TheCemz
Offline
Зарегистрирован: 23.03.2016

Собственно хочу сделать установку и проверку пароля. Установка проходит успешно, но после ввода 6 символа дисплей начинает просто бесконечно менять Setup на Enter. Пожалуйста подскажите куда копать, в ардуино пока новичек. Заранее благодарю за ответы.

#include <Keypad.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

#define Password_Lenght 7

LiquidCrystal_I2C lcd(0x27,16,2);
char Pass[Password_Lenght];
char Data[Password_Lenght]; 
char Master[Password_Lenght] = "123456";
byte data_count = 0, pass_count = 0, master_count = 0;
bool Pass_is_good;
char customKey;

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] = {3, 4, 5, 6};
byte colPins[COLS] = {7, 8, 9, 2};

Keypad customKeypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);

void setup()
{
  lcd.init();
  lcd.backlight();
}

void loop()
{
    if (Master != Pass)
      {
        Install();
        if (pass_count == Password_Lenght-1)
        {
          Proverka();
        }
      }
}

//=======================================================

void Proverka()
{
  lcd.setCursor(0,0);
  lcd.print("Enter Password");

  customKey = customKeypad.getKey();
  if (customKey)
  {
    Data[data_count] = customKey;
    lcd.setCursor(data_count,1);
    lcd.print(Data[data_count]);
    data_count++;
  }

  if(data_count == Password_Lenght-1)
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Password is ");

    if(!strcmp(Data, Master))
      lcd.print("Good");
    else
      lcd.print("Bad");

    delay(1000);
    clearData();
  }
}

//=======================================================

void Install()
{
  lcd.setCursor(0,0);
  lcd.print("Setup Password");
  customKey = customKeypad.getKey(); 
  if (customKey) 
  {
    Pass[pass_count] = customKey;
    lcd.setCursor(pass_count,1);
    lcd.print(Pass[pass_count]);
    pass_count++;
      if (pass_count == Password_Lenght-1)
    {
     strcpy(Master,Pass);
     clearData();
    }
  }
  
}  

//=======================================================

void clearData()
{
  while(data_count !=0)
  {   
    Data[data_count--] = 0;
  }
  return;
}

 

Araris
Offline
Зарегистрирован: 09.11.2012

Строка 36 - Вам про сравнение массивов поискать-почитать нужно.

Например : http://roboforum.ru/forum2/topic5332.html

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

И ещё зачем с cleardata() голый return?

В 104 строке может быть засада когда где-то data_count уже после проверки станет нулём (на прерывании или в параллельном процессе, например, а то и что-то его затрёт нечаяно) - бывает и так. Он же завернётся в 0xFF и пошурует далеко за пределами массива нули писать. Надо объявлять его знаковым и проверять на больше нуля, ибо есть вероятность проскочить ноль. Индексы и счётчики всегда лучше делать знаковые чтобы отрицательным значением указывать выход за пределы. Для процессора работа со знаковым и беззнаковым числами совершенно одинакова, только инструкции различаюися в названии. :)

TheCemz
Offline
Зарегистрирован: 23.03.2016

Araris пишет:

Строка 36 - Вам про сравнение массивов поискать-почитать нужно.

Например : http://roboforum.ru/forum2/topic5332.html

Огромное спасибо, программа собиралась на поверхностных знаниях и готовых кусках кода. Ваш совет очень помог.

strcmp помог исправить ситуацию

void loop()
{
    if (strcmp(Master,Pass)==0)
      {
        Proverka();
      }
    else
        {
        Install();
        }
}

faeton, спасибо учту.