Перейти к публикации
iT4iT.CLUB
Oksymoron

[решено] Доработка кодового замка

Рекомендованные сообщения

Доброго времени суток! Прошу помощи с доработкой кодового замка, замок работает на ура, но при вводе правильного пароля реле срабатывает и отключается а если нажать еще рас * тогда реле так же сработает. Каким способом можно организовать программный сброс который включиться после нажатия любой кнопки клавиатуры и сбросит arduino по истечению 10 сек. За ранее благодарю.

DbrlVas01lo.jpg

скетч.7z

Изменено пользователем Oksymoron

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нифига не понял... и с телефона заархивленный скетч просмотреть както не получается ,почему не в сообщении в свернутом виде ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сори вот скетч

Скрытый текст

//* 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);
    }
}

 

 

Изменено пользователем Kitsum
Не читаемый код

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Oksymoron на сколько я понял, после ввода пароля необходимо нажать "*" для того, чтобы замок проверил его и если пароль верный, то соответственно нас впустят, но если после этого нажать еще раз "*", то замок откроется повторно. От этого надо избавиться, я так понимаю? И что имеется в виду под сбросом ардуино, сбросить буфер с паролем или перегрузить контроллер?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 @Kitsum все правильно вы меня поняли, я просто не знаю как эту проблему решить.

Изменено пользователем Oksymoron

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
10 минут назад, Oksymoron сказал:

 @Kitsum все правильно вы меня поняли, я просто не знаю как эту проблему решить.

Какую проблему ? Очистить буфер или ребутнуть контроллер ?

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, svchekalin сказал:

Какую проблему ? Очистить буфер или ребутнуть контроллер ?

сначала сбросить буфер а если не поможет тогда сделать рестарт контроллера 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@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();
}

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пожалуйста, войдите для комментирования

Вы сможете оставить комментарий после входа



Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×
×
  • Создать...