У всех дома есть замки́; мы запираем двери, крышки, емкости, и все это для защиты от загребущих рук злодеев. Пришла мне в голову мысль, сделать простой кодовый замок последовательного типа на Дуйке. Таковые были в журналах Радио 80X и собирались на нескольких ТТЛ микросхемах.
Что такое код последовательного типа? — означает, что код вводится не цифрами, а количеством нажатий на ту или иную кнопку. Этот термин я выдумал сам 🙂
Я решил использовать три кнопки (три пароля), а для усиления защиты систему учета последовательности ввода этих трех паролей. То есть, не достаточно ввести правильно все три пароля, необходимо также вводить их в правильной последовательности.
Схема железной части:
Три кнопки для ввода; кнопка сброса, которая подключена напрямую к reset пину контроллера; управляющий пин-6.
Также можно использовать двухцветный светодиод (так наглядней). К механике — означает к механизму, открывающему дверь или что другое, что сами придумаете. Таблица к схеме:
Компонент | Значение | Колличество |
Резистор | 100 кОм | X3 |
Светодиод | 2.5v | X1 |
Кнопка | — | X4 |
Резистор | 150 Ом | X1 |
Ну а теперь перейдем к программному коду:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | /***********************************************/ #define BUTTTON1 2 //Кнопка 1 #define BUTTTON2 3 //Кнопка 2 #define BUTTTON3 4 //Кнопка 3 #define MECHANIC 6 //Механизм открытия чего-либо const char password[3] = {4, 3, 2}; //Тройной пароль const char sequence[3] = {0, 1, 2}; //Последовательность ввода паролей /***********************************************/ #include <Bounce.h> char num[3]; boolean match[3]; char history[4]; byte ptrcount = 0; //Антидребезг Bounce btn1 = Bounce(BUTTTON1,50); Bounce btn2 = Bounce(BUTTTON2,50); Bounce btn3 = Bounce(BUTTTON3,50); boolean result = false; boolean checkall() { for (int i=0; i<3; ++i) { if (!match[i] and password[i]==num[i]) { //Если пароль совпал (+защита от дубликатов в истории паролей) match[i] = true; //Отмечаем, что совпал history[ptrcount] = i; //Записываем в журнал для будущего определения последовательности ввода паролей ptrcount++; } if (password[i]!=num[i]) { //Если неверно введен тот или иной пароль match[i] = false; } } result = true; //Как будто все ок for (int i=0; i<3; ++i) { if (history[i]!=sequence[i] || !match[sequence[i]]) { //Ищем неправильные пароли и неправильную последовательность result = false; } } return result; } void setup() { pinMode(BUTTTON3, INPUT); pinMode(BUTTTON3, INPUT); pinMode(BUTTTON3, INPUT); pinMode(MECHANIC, OUTPUT); memset(num, 0, sizeof(num)); memset(match, 0, sizeof(match)); } void loop() { if (btn1.update()) { if (!btn1.read()) num[0]++; //Прибавляем значения первой кнопки } if (btn2.update()) { if (!btn2.read()) num[1]++; //Прибавляем значения второй кнопки } if (btn3.update()) { if (!btn3.read()) num[2]++; //Прибавляем значения третьей кнопки } digitalWrite(MECHANIC, checkall()); //Проверяем правильность ввода, в связи с этим решаем: окрывать или нет. } |
Я использовал библиотеку «Bounce«, для предотвращения дребезга кнопок. Нажатие кнопки защитывается только при отпускании. Коды хранятся в константе password, а их порядок ввода в sequence.
Подсказка: тыкаем 4 раза на кнопку-1; тыкаем 3 раза на кнопку-2; тыкаем 2 раза на кнопку-3. Светодиод зажжется!