Кодовый замок

Alex84
Alex84 аватар
Offline
Зарегистрирован: 02.01.2016
Помогите найти ошибку, скачал скетч, всё работает, подредактировал немного, в силу своих начинаючих способностей!

Собственно вопрос: "Почему, когда замок закрыт, вводишь 21 символ и программа переходит на начало установки пароля - 
код взломан путём удержания любой клавиши"

Заранее спасибо!

//http://www.circuitstoday.com/advanced-digital-code-lock-using-arduino
#include<LiquidCrystal.h>  
LiquidCrystal lcd(13,12,5,4,3,2); 
int row[]={11,10,9,8};// Опредиляем строчный ряд клавиатуры, подключенный к входам Arduino 
int col[]={7,6,1,0};//Опредиляем столбный ряд клавиатуры, подключенный к входам Arduino
int i,j,lcd_count,count=1,key_id=0,flag,entry=0;// Переменные, которые видит вся программа 
int col_scan;// Переменная для идентификации нажатия клавиш
char temp_press; // Variable to hold value of key press (Переменная провести значение нажатием клавиши)
char check[6],pass[6]; // See About the Program Переменные, которые видит вся программа

int RedLed = 15; // Присваиваем красному диоду выход 15
int GreenLed = 16; // Присваиваем зелёному диоду выход 16



void setup()
{
lcd.begin(16,2);
pinMode(RedLed,OUTPUT); // Опредиляем как выход
pinMode(GreenLed,OUTPUT);// Опредиляем как выход
for(i=0;i<=3;i++)
{
pinMode(row[i],OUTPUT);
pinMode(col[i],INPUT);
digitalWrite(col[i],HIGH);
}
lcd.print("SET 5 Digit PASS");
digitalWrite (GreenLed, HIGH);
digitalWrite (RedLed, LOW);
}

/* Начинается Основная программа */

void loop()

{ 
   while(entry<=4)// Начинается цикл установки кароля
{
SetPassword();
// Задание пароля
}
// Цикл установки пароля закончен

key_id=0;
keyscan(); // Сканирование нажатия клавиши

/* Начинается действие при нажатии клавиш */

if(key_id==1) // Состояние для проверки нажатой клавиши
{
 check[count]=temp_press;
count++;

/* Condition to Unlock Begins Состояние разблокировать Начинается*/

if(temp_press=='A')
{
  checkPassword();
if(flag==0)
{
lcd.setCursor(0,0);
lcd.print("UNLOCKED");
digitalWrite(GreenLed, HIGH);
digitalWrite(RedLed, LOW);
delay(500); 
digitalWrite(GreenLed, LOW);
digitalWrite(RedLed, HIGH);
}
else
{ 
lcd.setCursor(0,0);
lcd.print("WRONG PASSWORD");
delay(500);
lcd.clear();
lcd.print("DOOR is LOCKED");
}
count=1; // Resetting the counter variable
}

/* Condition to Unlock Ends*/

/* Condition to Change Password Begins */

else if(temp_press=='C')
{
checkPassword();
if(flag==0)
{
lcd.setCursor(0,0);
lcd.print("ENTER NEW PASS");
key_id=0;
entry=0;
}else{ 
lcd.setCursor(0,0);
lcd.print("WRONG PASSWORD");
delay(200);
lcd.clear();
lcd.print("LOCKED");
}
count=1; // Resetting the counter variable
}

/* Condition to Change Password Ends */

/* Condition to LOCK Begins*/

else if(temp_press=='B')
{
lcd.setCursor(0,0);
lcd.print("LOCKED");
count=1; // Resetting the counter variable
}
/* Condition to LOCK Ends*/
}

/* Actions on Key Press Ends*/
}

/* Main Program Ends */


void SetPassword() // Subroutine to SET User Defined Password
{
keyscan();
if(key_id==1)
{
if(temp_press=='A'||temp_press=='C'||temp_press=='B') // Condition to Check for an Invalid Keypress 
{
lcd.setCursor(0,0);
lcd.print("INVALID KEYS");
entry=0;
}
else
{
  pass[entry]=temp_press;

}
}
key_id=0;
if(entry==5) // количество символов пароля
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("HELLO");
delay(1000);
lcd.setCursor(0,1);
lcd.print("PASSWORD SET");
delay(1000);
lcd.clear();
lcd.print("DOOR is LOCKED");
digitalWrite (GreenLed, LOW);
digitalWrite (RedLed, HIGH);
lcd_count=0;


}} // Subroutine to SET Password ENDS

char keyscan()// Subroutine to Scan Keypad for a Keypress
{
for(i=0; i<=3; i++)
{
digitalWrite(row[0],HIGH);
digitalWrite(row[1],HIGH);
digitalWrite(row[2],HIGH);
digitalWrite(row[3],HIGH);
digitalWrite(row[i],LOW);
for(j=0; j<=3; j++)
{
col_scan=digitalRead(col[j]);
if(col_scan==LOW)
{
  key_id=1;
  entry++;
temp_press=keypress(i,j);
lcd.setCursor(lcd_count++,1); //
lcd.print(temp_press);

if(temp_press=='A'||temp_press=='C'||temp_press=='B')
{
lcd_count=0;
lcd.clear();
}
delay(300);
break;
}}
}}// Subroutine to Scan Keypress Ends

char keypress(int i, int j) // Subroutine to Identify the value of Key pressed
{
if(i==0&&j==0)
{
return('1');
}
if(i==0&&j==1)
{
return('2');
}
if(i==0&&j==2)
{
return('3');
}
if(i==0&&j==3)
{
return('A');
}
if(i==1&&j==0)
{
return('4');
}
if(i==1&&j==1)
{
return('5');
}
if(i==1&&j==2)
{
return('6');
}
if(i==1&&j==3)
{
return('B');
}
if(i==2&&j==0)
{
return('7');
}
if(i==2&&j==1)
{
return('8');
}
if(i==2&&j==2)
{
return('9');
}
if(i==2&&j==3)
{
return('C');
}
if(i==3&&j==0)
{
return('*');
}
if(i==3&&j==1)
{
return('0');
}
if(i==3&&j==2)
{
return('#');
}
if(i==3&&j==3)
{
return('D');
}
} // Subroutine to identify Keypress Ends

void checkPassword() // Subroutine to Check User Input Data with SET Password
{
flag=0;
for(i=1;i<=5&&flag==0;i++)
{
if(check[i]==pass[i])
{
flag=0;
}
else 
{flag=1;
}}} // Subroutine to check password ends

 

vde69
Offline
Зарегистрирован: 10.01.2016

резануло глаз: "опредИляем"

 

по сабжу есть 2 ошибки

1. я не увидел устранение дребезга клавиатуры, что чревато закрытием замка кодом который не вводил, например вместо 3450 будет 3345

2. entry++ без проверки на допустимые значение, то есть или до или сразу после нужно проверять и корректировать, а по сколько у тебя он используется потом в качестве индекса у массива символов, то происходит банальная запись памяти за границой этого массива.

тебя массив имеет 6 символов вот и думай какой максимальной может быть entry

то есть ты хакнул собвсвенный скетч переполнением :),

vde69
Offline
Зарегистрирован: 10.01.2016

ну и еще вызывают сомнения первые 5 строчек основного цикла, по смыслу вызывает (хотя может я не правильно понял), типа набрал пароль менее 4 символов - и велком вводить новый, по моему это взлом еще проще

Alex84
Alex84 аватар
Offline
Зарегистрирован: 02.01.2016

1. дребезг абсолютно не мешает нажимаемые символы выводятся на экран без проблем, код запоминает правильно, не знаю только почему, если удерживать кнопу, продолжает вводить тот же символ дальше, что и привело к авторазблокировке. вот если бы после шестого символа, просто писало "try again"...

2 на счёт хакнул... то это пока не про меня, я всего лишь поигрался со словами и добавил светодиодики.. это уже умею))) 11 дней как учусь... понямая, что нужны годы, когда пытался подружить NFC шилд (шилд в коробке, и я снова мигаю диодиками )))

3 "проверять, корректировать, индекс, массив символов, запись памяти за границей массива".

уже про это читал, "перевариварю" почитаю ещё раз, попробую что-то изменить и на начало цикла до победного конца!

Спасибо!

Alexino
Offline
Зарегистрирован: 29.12.2015

vde69 пишет:

резануло глаз: "опредИляем"

И всё ? ))
Мне глаза резанула абсолютно вся программа (если её таковой вообще можно назвать), особенно функция keypress.  Её (программу) писал совершенно некомпетентный в программировании челоек.

Alex84
Alex84 аватар
Offline
Зарегистрирован: 02.01.2016

Alexino пишет:

vde69 пишет:

резануло глаз: "опредИляем"

И всё ? ))
Мне глаза резанула абсолютно вся программа (если её таковой вообще можно назвать), особенно функция keypress.  Её (программу) писал совершенно некомпетентный в программировании челоек.

Я бы с удовольствием взял другой скетч, для пробного обучения с целью создания многофункционального кодового замка, но в интернете нашлось всего пару примеров, с которыми пытаюсь, разбираюсь, ознакамливаюсь. А  программу своего умного замка я напишу сам! но пока учусь на примерах!

11 дней учусь, сутки потратил на FLprog но там сплошные баги, лучше так: текстом!

спасибо за понимание, и попрошу не тролить, я хоть и чайник, но с автоматом)))

Alexino
Offline
Зарегистрирован: 29.12.2015

Да я, собственно, и не троллю, говорю как оно и есть. Тем более Вас, автор же программы - не Вы )
А учиться на таких примерах - время зря тратить, ибо выше уровня авторов этих программ не поднимитесь.

Alex84
Alex84 аватар
Offline
Зарегистрирован: 02.01.2016

Alexino пишет:

Да я, собственно, и не троллю, говорю как оно и есть. Тем более Вас, автор же программы - не Вы )
А учиться на таких примерах - время зря тратить, ибо выше уровня авторов этих программ не поднимитесь.

Спасибо за понимание! потому и начал заново! подключаю библиотеку LCD.  и вот думаю, лучше как на этом примере подключить кейпад, или на библиотеке, как в этом примере, ... 

 
//#include <Servo.h>
#include <Keypad.h>
 
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,13,A0,A1,A2,A3);
 
//Servo ServoMotor;
char* password = "123A";  // change the password here, just pick any 3 numbers
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] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
 
int RedpinLock = 11;
int GreenpinUnlock = 10;
 
void setup()
{
lcd.begin(16,2);
lcd.clear();
 
  
pinMode(RedpinLock, OUTPUT);
pinMode(GreenpinUnlock, OUTPUT);
LockedPosition(true);
//ServoMotor.attach(11);
}
 
void loop()
{
  
  
char key = keypad.getKey();
 
 
 
if (key == '*' || key == '#')
{
  position = 0;
LockedPosition(true);
}
 
int l;
 
if (key == password[position])
{
position ++;
 
      lcd.setCursor(12,1);
    for(l=1; l<=position; ++l)
     {
      lcd.print("*");
      delay(50);
     }
}
if (position == 4)
{
LockedPosition(false);
}
delay(100);
 
}
void LockedPosition(int locked)
{
if (locked)
  {
digitalWrite(RedpinLock, HIGH);
digitalWrite(GreenpinUnlock, LOW);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Door is CLOSED");  
  lcd.setCursor(0,1);
  lcd.print("Enter Pass:");
//ServoMotor.write(11);
  }
else
  {
digitalWrite(RedpinLock, LOW);
digitalWrite(GreenpinUnlock, HIGH);
//ServoMotor.write(90);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Wellcme to home");  
  lcd.setCursor(0,1);
  lcd.print("The door is OPEN");
 
  delay(3000);
  position = 0;
LockedPosition(true);
  }
}
 
Alex84
Alex84 аватар
Offline
Зарегистрирован: 02.01.2016

В любом случае, я буду всё прописывать сам, так скетч на кодовый замок, который мне нужно создать я 1000% не найду!

да и в клавиатуру с  LCD  я похоже как и к шилду nfc рано потянулся((