Кодовый замок
- Войдите на сайт для отправки комментариев
Пнд, 11/01/2016 - 21:17
Помогите найти ошибку, скачал скетч, всё работает, подредактировал немного, в силу своих начинаючих способностей! Собственно вопрос: "Почему, когда замок закрыт, вводишь 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
резануло глаз: "опредИляем"
по сабжу есть 2 ошибки
1. я не увидел устранение дребезга клавиатуры, что чревато закрытием замка кодом который не вводил, например вместо 3450 будет 3345
2. entry++ без проверки на допустимые значение, то есть или до или сразу после нужно проверять и корректировать, а по сколько у тебя он используется потом в качестве индекса у массива символов, то происходит банальная запись памяти за границой этого массива.
тебя массив имеет 6 символов вот и думай какой максимальной может быть entry
то есть ты хакнул собвсвенный скетч переполнением :),
ну и еще вызывают сомнения первые 5 строчек основного цикла, по смыслу вызывает (хотя может я не правильно понял), типа набрал пароль менее 4 символов - и велком вводить новый, по моему это взлом еще проще
1. дребезг абсолютно не мешает нажимаемые символы выводятся на экран без проблем, код запоминает правильно, не знаю только почему, если удерживать кнопу, продолжает вводить тот же символ дальше, что и привело к авторазблокировке. вот если бы после шестого символа, просто писало "try again"...
2 на счёт хакнул... то это пока не про меня, я всего лишь поигрался со словами и добавил светодиодики.. это уже умею))) 11 дней как учусь... понямая, что нужны годы, когда пытался подружить NFC шилд (шилд в коробке, и я снова мигаю диодиками )))
3 "проверять, корректировать, индекс, массив символов, запись памяти за границей массива".
уже про это читал, "перевариварю" почитаю ещё раз, попробую что-то изменить и на начало цикла до победного конца!
Спасибо!
резануло глаз: "опредИляем"
Мне глаза резанула абсолютно вся программа (если её таковой вообще можно назвать), особенно функция keypress. Её (программу) писал совершенно некомпетентный в программировании челоек.
резануло глаз: "опредИляем"
Мне глаза резанула абсолютно вся программа (если её таковой вообще можно назвать), особенно функция keypress. Её (программу) писал совершенно некомпетентный в программировании челоек.
11 дней учусь, сутки потратил на FLprog но там сплошные баги, лучше так: текстом!
спасибо за понимание, и попрошу не тролить, я хоть и чайник, но с автоматом)))
Да я, собственно, и не троллю, говорю как оно и есть. Тем более Вас, автор же программы - не Вы )
А учиться на таких примерах - время зря тратить, ибо выше уровня авторов этих программ не поднимитесь.
Да я, собственно, и не троллю, говорю как оно и есть. Тем более Вас, автор же программы - не Вы )
А учиться на таких примерах - время зря тратить, ибо выше уровня авторов этих программ не поднимитесь.
В любом случае, я буду всё прописывать сам, так скетч на кодовый замок, который мне нужно создать я 1000% не найду!
да и в клавиатуру с LCD я похоже как и к шилду nfc рано потянулся((