Кодовый замо́к

У всех дома есть замки́; мы запираем двери, крышки, емкости, и все это для защиты от загребущих рук злодеев. Пришла мне в голову мысль, сделать простой кодовый замок последовательного типа на Дуйке. Таковые были в журналах Радио 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. Светодиод зажжется! :mrgreen:

Файлы проекта

0
0

About Кирилл Васин

Прохожий из шапки сайта

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *