Oksymoron 0 Жалоба Опубликовано: 24 июня 2016 (изменено) Доброго времени суток! Прошу помощи с доработкой кодового замка, замок работает на ура, но при вводе правильного пароля реле срабатывает и отключается а если нажать еще рас * тогда реле так же сработает. Каким способом можно организовать программный сброс который включиться после нажатия любой кнопки клавиатуры и сбросит arduino по истечению 10 сек. За ранее благодарю. скетч.7z Изменено 24 июня 2016 пользователем Oksymoron Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
svchekalin 26 Жалоба Опубликовано: 25 июня 2016 Нифига не понял... и с телефона заархивленный скетч просмотреть както не получается ,почему не в сообщении в свернутом виде ? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Oksymoron 0 Жалоба Опубликовано: 25 июня 2016 (изменено) Сори вот скетч Скрытый текст //* 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); } } Изменено 25 июня 2016 пользователем Kitsum Не читаемый код Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Kitsum 238 Жалоба Опубликовано: 25 июня 2016 @Oksymoron на сколько я понял, после ввода пароля необходимо нажать "*" для того, чтобы замок проверил его и если пароль верный, то соответственно нас впустят, но если после этого нажать еще раз "*", то замок откроется повторно. От этого надо избавиться, я так понимаю? И что имеется в виду под сбросом ардуино, сбросить буфер с паролем или перегрузить контроллер? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Oksymoron 0 Жалоба Опубликовано: 25 июня 2016 (изменено) @Kitsum все правильно вы меня поняли, я просто не знаю как эту проблему решить. Изменено 25 июня 2016 пользователем Oksymoron Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
svchekalin 26 Жалоба Опубликовано: 25 июня 2016 10 минут назад, Oksymoron сказал: @Kitsum все правильно вы меня поняли, я просто не знаю как эту проблему решить. Какую проблему ? Очистить буфер или ребутнуть контроллер ? 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Oksymoron 0 Жалоба Опубликовано: 25 июня 2016 1 минуту назад, svchekalin сказал: Какую проблему ? Очистить буфер или ребутнуть контроллер ? сначала сбросить буфер а если не поможет тогда сделать рестарт контроллера Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Kitsum 238 Жалоба Опубликовано: 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(); } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Oksymoron 0 Жалоба Опубликовано: 26 июня 2016 @Kitsum большое спасибо за помощь! Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах