Помогите с проверкой пароля
- Войдите на сайт для отправки комментариев
Ср, 23/03/2016 - 06:22
Собственно хочу сделать установку и проверку пароля. Установка проходит успешно, но после ввода 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;
}
Строка 36 - Вам про сравнение массивов поискать-почитать нужно.
Например : http://roboforum.ru/forum2/topic5332.html
И ещё зачем с cleardata() голый return?
В 104 строке может быть засада когда где-то data_count уже после проверки станет нулём (на прерывании или в параллельном процессе, например, а то и что-то его затрёт нечаяно) - бывает и так. Он же завернётся в 0xFF и пошурует далеко за пределами массива нули писать. Надо объявлять его знаковым и проверять на больше нуля, ибо есть вероятность проскочить ноль. Индексы и счётчики всегда лучше делать знаковые чтобы отрицательным значением указывать выход за пределы. Для процессора работа со знаковым и беззнаковым числами совершенно одинакова, только инструкции различаюися в названии. :)
Строка 36 - Вам про сравнение массивов поискать-почитать нужно.
Например : http://roboforum.ru/forum2/topic5332.html
Огромное спасибо, программа собиралась на поверхностных знаниях и готовых кусках кода. Ваш совет очень помог.
strcmp помог исправить ситуацию
void loop() { if (strcmp(Master,Pass)==0) { Proverka(); } else { Install(); } }faeton, спасибо учту.