Oksymoron 0 Report post Posted June 24, 2016 (edited) Доброго времени суток! Прошу помощи с доработкой кодового замка, замок работает на ура, но при вводе правильного пароля реле срабатывает и отключается а если нажать еще рас * тогда реле так же сработает. Каким способом можно организовать программный сброс который включиться после нажатия любой кнопки клавиатуры и сбросит arduino по истечению 10 сек. За ранее благодарю. скетч.7z Edited June 24, 2016 by Oksymoron Share this post Link to post Share on other sites
svchekalin 26 Report post Posted June 25, 2016 Нифига не понял... и с телефона заархивленный скетч просмотреть както не получается ,почему не в сообщении в свернутом виде ? Share this post Link to post Share on other sites
Oksymoron 0 Report post Posted June 25, 2016 (edited) Сори вот скетч Скрытый текст //* is to validate password короче чтобы войти //# is to reset password attempt Ну чтоб сделать сброс //внимаение ! если выдает ошибки качаем все библиотеки что указанны ниже ! #include <SPI.h> // скачайте эту библиотеку ! #include <MFRC522.h> // скачайте эту библиотеку ! #include <Password.h> // скачайте эту библиотеку ! #include <Keypad.h> // скачайте эту библиотеку ! #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); // объект MFRC522C / reate MFRC522 instance. unsigned long uidDec, uidDecTemp; int door =8; int key = A5; int green = A1; int red = A2; Password password = Password( "DDCBC97" ); const byte ROWS = 4; // Four rows const byte COLS = 4; // columns // Define the Keymap char keys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte rowPins[ROWS] = { 0,A0,7,6 };// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins. byte colPins[COLS] = { 5,4,3,2, };// Connect keypad COL0, COL1 and COL2 to these Arduino pins. // Create the Keypad Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); void setup() { pinMode (door,OUTPUT); pinMode (key,INPUT); pinMode (green,OUTPUT); pinMode (red,OUTPUT); Serial.begin(9600); SPI.begin(); // инициализация SPI / Init SPI bus. mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card. keypad.addEventListener(keypadEvent); //add an event listener for this keypad Serial.println(""); Serial.println(""); Serial.println(" ======================== "); Serial.println(" Waiting for card... "); } void loop() { { keypad.getKey(); } if (digitalRead(key) == HIGH) { digitalWrite(door,HIGH); Serial.println("Open ==>"); digitalWrite(green, HIGH); delay(100); digitalWrite(red, HIGH); delay(100); digitalWrite(door,LOW); delay(100); digitalWrite(green, LOW); delay(100); digitalWrite(green, HIGH); delay(50); digitalWrite(red, HIGH); delay(50); digitalWrite(door,LOW); delay(50); digitalWrite(green, LOW); digitalWrite(green, HIGH); delay(50); digitalWrite(red, HIGH); delay(50); digitalWrite(door,LOW); delay(50); digitalWrite(green, LOW); delay(50); digitalWrite(green, HIGH); delay(50); digitalWrite(red, HIGH); delay(50); digitalWrite(green, LOW); delay(50); digitalWrite(red,LOW); digitalWrite(door,LOW); } // Поиск новой карточки / Look for new cards. if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Выбор карточки / Select one of the cards. if ( ! mfrc522.PICC_ReadCardSerial()) { return; } uidDec = 0; // Выдача серийного номера карточки "UID". for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec*256+uidDecTemp; } Serial.println("Card UID: "); Serial.println(uidDec); if (uidDec == 384627541) // если "UID" номер совпал. { // включим светодиод. digitalWrite(door,HIGH); // Печатаем в Serial монитор . Serial.println("Open ==>"); } // также и с другими номерами карт. else if (uidDec == 959884118) { Serial.println("Hi Sergey"); } else if (uidDec == 695670870) { Serial.println("Hi Peter"); } else // если "UID" номер карты не совпал. { Serial.println(" unknown card"); delay(10000); } Serial.println("====================================="); delay(3000); // пауза 3 секунды. digitalWrite(door,LOW); // и выключим все светодиоды. } //take care of some special events void keypadEvent(KeypadEvent eKey){ switch (keypad.getState()){ case PRESSED: Serial.print("Pressed: "); Serial.println(eKey); digitalWrite(green,HIGH); digitalWrite(red,HIGH); delay(50); digitalWrite(green,LOW); digitalWrite(red,LOW); switch (eKey){ case '*': checkPassword(); break; case '#': password.reset(); break; default: password.append(eKey); } } } void checkPassword(){ if (password.evaluate()){ Serial.println("Success"); digitalWrite(door,HIGH); // открываем дверь digitalWrite(green, HIGH); //включаем выключаем светодиоды =) моргаем короче delay(200); digitalWrite(green,LOW); delay(200); digitalWrite(green, HIGH); delay(200); digitalWrite(green,LOW); delay(200); digitalWrite(green, HIGH); delay(200); digitalWrite(green,LOW); delay(200); digitalWrite(green, HIGH); delay(200); digitalWrite(green,LOW); delay(200); digitalWrite(green, HIGH); delay(200); digitalWrite(green,LOW); delay(200); digitalWrite(green, HIGH); delay(200); digitalWrite(green,LOW); delay(200); digitalWrite(green, HIGH); delay(200); digitalWrite(green,LOW); delay(200); digitalWrite(green, HIGH); delay(200); digitalWrite(green,LOW); delay(200); digitalWrite(green, HIGH); delay(200); digitalWrite(green,LOW); delay(200); digitalWrite(green, HIGH); delay(200); digitalWrite(green,LOW); delay(200); Serial.println("Open ==>"); digitalWrite(door,LOW); }else{ Serial.println("Wrong"); digitalWrite(red, HIGH); // моргаем красным светодиодом (долго, а потомучто нефиг взламывать мой замок ! это затруднит взлом ) delay(400); digitalWrite(red,LOW); delay(400); digitalWrite(red, HIGH); delay(400); digitalWrite(red,LOW); delay(400); digitalWrite(red, HIGH); delay(400); digitalWrite(red,LOW); delay(400); digitalWrite(red, HIGH); delay(400); digitalWrite(red,LOW); delay(400); digitalWrite(red, HIGH); delay(400); digitalWrite(red,LOW); delay(400); } } Edited June 25, 2016 by Kitsum Не читаемый код Share this post Link to post Share on other sites
Kitsum 239 Report post Posted June 25, 2016 @Oksymoron на сколько я понял, после ввода пароля необходимо нажать "*" для того, чтобы замок проверил его и если пароль верный, то соответственно нас впустят, но если после этого нажать еще раз "*", то замок откроется повторно. От этого надо избавиться, я так понимаю? И что имеется в виду под сбросом ардуино, сбросить буфер с паролем или перегрузить контроллер? Share this post Link to post Share on other sites
Oksymoron 0 Report post Posted June 25, 2016 (edited) @Kitsum все правильно вы меня поняли, я просто не знаю как эту проблему решить. Edited June 25, 2016 by Oksymoron Share this post Link to post Share on other sites
svchekalin 26 Report post Posted June 25, 2016 10 минут назад, Oksymoron сказал: @Kitsum все правильно вы меня поняли, я просто не знаю как эту проблему решить. Какую проблему ? Очистить буфер или ребутнуть контроллер ? 1 Share this post Link to post Share on other sites
Oksymoron 0 Report post Posted June 25, 2016 1 минуту назад, svchekalin сказал: Какую проблему ? Очистить буфер или ребутнуть контроллер ? сначала сбросить буфер а если не поможет тогда сделать рестарт контроллера Share this post Link to post Share on other sites
Kitsum 239 Report post Posted June 25, 2016 @Oksymoron К сожалению нет клавиатуры используемой в этом проекте, но уверен, что решим эту задачу и без физической реализации. Начальный скетч мне сильно не нравится, в силу "копипаста", но будем плясать от него. Логика программы очень проста - при нажатии "*" происходит вызов функции checkPassword() в которой вызывается password.evaluate() для проверки введенного кода с клавиатуры. И тут кроется ошибка, по завершению проверки, автор должен был очистить буфер с паролем, но это не происходит. Соответственно введенный пароль остается в памяти и если он был верен, то злоумышленник может открыть замок просто нажав клавишу "*". За сброс пароля отвечает функция password.reset() реализованная в библиотеки Password.h и нам лишь останется внести изменение в функцию checkPassword(), добавив в её конце очистку буфера. Скрытый текст //* is to validate password короче чтобы войти //# is to reset password attempt Ну чтоб сделать сброс //внимаение ! если выдает ошибки качаем все библиотеки что указанны ниже ! #include <SPI.h> // скачайте эту библиотеку ! #include <MFRC522.h> // скачайте эту библиотеку ! #include <Password.h> // скачайте эту библиотеку ! #include <Keypad.h> // скачайте эту библиотеку ! #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); // объект MFRC522C / reate MFRC522 instance. unsigned long uidDec, uidDecTemp; int door =8; int key = A5; int green = A1; int red = A2; Password password = Password( "DDCBC97" ); const byte ROWS = 4; // Four rows const byte COLS = 4; // columns // Define the Keymap char keys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte rowPins[ROWS] = { 0,A0,7,6 };// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins. byte colPins[COLS] = { 5,4,3,2, };// Connect keypad COL0, COL1 and COL2 to these Arduino pins. // Create the Keypad Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); void setup() { pinMode (door,OUTPUT); pinMode (key,INPUT); pinMode (green,OUTPUT); pinMode (red,OUTPUT); Serial.begin(9600); SPI.begin(); // инициализация SPI / Init SPI bus. mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card. keypad.addEventListener(keypadEvent); //add an event listener for this keypad Serial.println(""); Serial.println(""); Serial.println(" ======================== "); Serial.println(" Waiting for card... "); } void loop() { keypad.getKey(); if (digitalRead(key) == HIGH) { digitalWrite(door,HIGH); Serial.println("Open ==>"); digitalWrite(green, HIGH); delay(100); digitalWrite(red, HIGH); delay(100); digitalWrite(door,LOW); delay(100); digitalWrite(green, LOW); delay(100); digitalWrite(green, HIGH); delay(50); digitalWrite(red, HIGH); delay(50); digitalWrite(door,LOW); delay(50); digitalWrite(green, LOW); digitalWrite(green, HIGH); delay(50); digitalWrite(red, HIGH); delay(50); digitalWrite(door,LOW); delay(50); digitalWrite(green, LOW); delay(50); digitalWrite(green, HIGH); delay(50); digitalWrite(red, HIGH); delay(50); digitalWrite(green, LOW); delay(50); digitalWrite(red,LOW); digitalWrite(door,LOW); } // Поиск новой карточки / Look for new cards. if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Выбор карточки / Select one of the cards. if ( ! mfrc522.PICC_ReadCardSerial()) { return; } uidDec = 0; // Выдача серийного номера карточки "UID". for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec*256+uidDecTemp; } Serial.println("Card UID: "); Serial.println(uidDec); if (uidDec == 384627541) // если "UID" номер совпал. { // включим светодиод. digitalWrite(door,HIGH); // Печатаем в Serial монитор . Serial.println("Open ==>"); } // также и с другими номерами карт. else if (uidDec == 959884118) { Serial.println("Hi Sergey"); } else if (uidDec == 695670870) { Serial.println("Hi Peter"); } else // если "UID" номер карты не совпал. { Serial.println(" unknown card"); delay(10000); } Serial.println("====================================="); delay(3000); // пауза 3 секунды. digitalWrite(door,LOW); // и выключим все светодиоды. } //take care of some special events void keypadEvent(KeypadEvent eKey){ switch (keypad.getState()){ case PRESSED: Serial.print("Pressed: "); Serial.println(eKey); digitalWrite(green,HIGH); digitalWrite(red,HIGH); delay(50); digitalWrite(green,LOW); digitalWrite(red,LOW); switch (eKey){ case '*': checkPassword(); break; case '#': password.reset(); break; default: password.append(eKey); } } } void checkPassword(){ if (password.evaluate()){ Serial.println("Success"); digitalWrite(door,HIGH); // открываем дверь digitalWrite(green, HIGH); //включаем выключаем светодиоды =) моргаем короче delay(200); digitalWrite(green,LOW); delay(200); digitalWrite(green, HIGH); delay(200); digitalWrite(green,LOW); delay(200); digitalWrite(green, HIGH); delay(200); digitalWrite(green,LOW); delay(200); digitalWrite(green, HIGH); delay(200); digitalWrite(green,LOW); delay(200); digitalWrite(green, HIGH); delay(200); digitalWrite(green,LOW); delay(200); digitalWrite(green, HIGH); delay(200); digitalWrite(green,LOW); delay(200); digitalWrite(green, HIGH); delay(200); digitalWrite(green,LOW); delay(200); digitalWrite(green, HIGH); delay(200); digitalWrite(green,LOW); delay(200); digitalWrite(green, HIGH); delay(200); digitalWrite(green,LOW); delay(200); digitalWrite(green, HIGH); delay(200); digitalWrite(green,LOW); delay(200); Serial.println("Open ==>"); digitalWrite(door,LOW); }else{ Serial.println("Wrong"); digitalWrite(red, HIGH); // моргаем красным светодиодом (долго, а потомучто нефиг взламывать мой замок ! это затруднит взлом ) delay(400); digitalWrite(red,LOW); delay(400); digitalWrite(red, HIGH); delay(400); digitalWrite(red,LOW); delay(400); digitalWrite(red, HIGH); delay(400); digitalWrite(red,LOW); delay(400); digitalWrite(red, HIGH); delay(400); digitalWrite(red,LOW); delay(400); digitalWrite(red, HIGH); delay(400); digitalWrite(red,LOW); delay(400); } password.reset(); } Share this post Link to post Share on other sites
Oksymoron 0 Report post Posted June 26, 2016 @Kitsum большое спасибо за помощь! Share this post Link to post Share on other sites