Хитрый кодовый замок своими руками

Arduino является идеальной платформой для создания прототипов. Без нее множество замечательных идей никогда не были бы реализованы. Такие идеи, как создание необычного кодового замка, в котором кодом является время удержания кнопки. Такой замочек теоретически невозможно вскрыть, даже если в точности известен пароль. Люди, которые пользуются таким замком, открывают его с помощью мышечной памяти. Злоумышленники никогда не смогут это повторить.

Если делать кодовый замок в SMD-исполнении с использованием различных компонентов, то получится чересчур громоздкая конструкция. Ее было бы неудобно использовать на практике. Для реализации такого замка необходимо использовать платформу Arduino. Для действительной надежности замка, нужно написать программу для контроллера так, чтобы паролем являлся не номер нажатой кнопки, а сочетание нескольких клавиш, нажимаемых одновременно.

Так выглядит схема кодового замка:

Хитрый кодовый замок своими руками

Хитрый кодовый замок своими руками

Подключение кнопок следующее:

  1. К земле и D3 (3-й цифровой PIN);
  2. К D5 и D7;
  3. К D9 и D

Все уроки, связанные с Arduino, иллюстрированы с помощью замечательной программы Fritzing. Простая  в работе программа для рисования наглядных электрических схем, заточенная под Arduino-проекты.

Код будет таким:

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
69
70
71
72
const int ina = 3;
const int inb = 5;
const int inc = 9;
const int ledPin = 13;
int i = 1000;
byte a = 0;
byte b = 0;
byte c = 0;
byte d = 0;
unsigned long time = 0; //не забывайте всё, что принимает значение millis()
unsigned long temp = 0; //хранить в unsigned long
byte keya[] = { 0, 0, 0, 0, 0, 0, 0, 0}; //коды собственно
byte keyb[] = { 1, 1, 1, 1, 0, 1, 0, 0};
byte keyc[] = { 1, 0, 1, 0, 1, 1, 1, 0};
byte k = 0;
void setup() {
pinMode(ina, INPUT_PULLUP); //3 входа, подключаемые к кнопкам
pinMode(inb, INPUT_PULLUP);
pinMode(inc, INPUT_PULLUP);
pinMode(ledPin, OUTPUT); //встроенный светодиод на 13-ом пине
pinMode(7, OUTPUT);
pinMode(11, OUTPUT);
digitalWrite(7, LOW); //заменяют землю
digitalWrite(11, LOW);
time = millis(); //нужно для отсчёта времени
}
void blinktwice() { //двойное мигание светодиодом
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(100);
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(200);
}
void loop() {
if(k==0) {
blinktwice(); //приглашение ввести код
}
if (k == 8) {
digitalWrite(ledPin, HIGH);
delay(3000);
k = 0;
}
a = digitalRead(ina); //считываются уровни сигналов с кнопок - нажата/не нажата
b = digitalRead(inb);
c = digitalRead(inc);
delay(100); //следующий if - защита против ложных срабатываний, можно не использовать
if((digitalRead(ina) == a)&&(digitalRead(inb) ==b)&&(digitalRead(inc)==c)) {
if (a == keya[k]) {
if (b == keyb[k]) {
if (c == keyc[k]) {
k++;
}
}
}
}
if (k==1) {
if (d ==0) {
time = millis ();
d++;
}
}
temp = millis();
temp = temp - time;
if (temp > 10000) {
k= 0;
d=0;
time = millis ();
}
}


Пояснения к коду программы:

В функции setup назначаются порты, и устанавливается низкий уровень на тех, которые назначены заменять землю.

Параметр INPUT_PULLUP означает, что PIN подтянут к +5В при помощи внутреннего резистора на 10 кОм. Так можно избавиться от «плавающего» сигнала на пине. Также будет невозможно закоротить чего-нибудь лишнего, когда кнопка замыкается на землю.

Функция blinktwice выделена отдельно исключительно ради удобства. Не следует упускать возможностей практиковаться в использовании различных функций.

Дальше происходит считывание сигналов на портах. Когда клавиша нажата, значение равно 0, а если отжата– это 1. Сигналы сопоставляются со значениями, которые записаны в массивах. К примеру, сигнал 0,1,1 говорит о том, что клавиша 1 зажата, а две оставшиеся непременно отжаты. При выполнении этого условия произойдет переход к последующим значениям для сравнения. Если все 7 условий, следующие друг за другом, были реализованы, то выполнится k==8 и светодиод загорится на 3 секунды. Это значит, что пароль был введен верно. В эту часть кода необходимо вписать, действие, которое должно произойти после корректного ввода кода (открывание дверей, звуковой сигнал и т. п.).

Оставшаяся часть кода производит обнуление счетчика при условии, что с момента введения пароля прошло более 10 секунд. При этом светодиод должен погаснуть.

Без сбрасывания счетчика теоретически было бы возможно подобрать комбинацию путем перебора, несмотря на то, что их число составит (2^3)^7=2^21. Это немного больше 2000000 комбинаций.

Время ввода правильного пароля около 5 секунд после непродолжительных тренировок. Можно даже поставить зажатие кнопок по времени.

Прикрепленные файлы. Код программы 

Автор: Аркадий.


 

Загрузка...

Похожее ...

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

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

3 × 4 =