Дверной замок на основе пароля
Компоненты и расходные материалы
![]() |
| × | 1 | |||
| × | 1 | ||||
![]() |
| × | 1 | |||
| × | 1 |
Об этом проекте
Есть множество веб-сайтов, которые разместили этот проект, и он присутствует на различных каналах YouTube, и, возможно, даже на этом веб-сайте есть несколько из них. Так что, честно говоря, ничего оригинального. Но я мог бы объяснить и отобразить более простым и информативным образом.
Важнейшая составляющая этого проекта - матричная клавиатура. Я использовал мембранную клавиатуру 4x4, которая выглядит так:

Клавиши на клавиатуре в основном являются кнопками. Эти кнопочные переключатели «закрываются» при нажатии, и как только усилие отпускается, они возвращаются в свое естественное состояние, то есть «разомкнуты».

Таким образом клавиатура подключается внутри в виде строк и столбцов. Когда, предположим, нажимается 1, столбец 1 и строка 1 соединяются вместе. При нажатии 9 кнопки r3 и c3 соединяются вместе.

Сканирование выполняется с 4-мя клавишами, настроенными как выходы, и 4-мя клавишами как входами. Я сделал все столбцы входами, используя входные подтягивающие резисторы, а все строки - выходами. Используя программирование, все строки становятся НИЗКИМИ одна за другой, несколько раз в секунду. Таким образом, при нажатии клавиши соответствующий столбец становится НИЗКИМ. Состояние входных контактов, к которым подключены все столбцы, считывается несколько раз. Всякий раз, когда считывается НИЗКОЕ состояние, это означает, что нажата клавиша в этом столбце. Если в определенной строке низкий уровень и в то же время в определенном столбце низкий уровень, то нажатая клавиша определяется.
Например, если нажать 1, столбец 1 будет низким. И поскольку каждая строка становится НИЗКОЙ так быстро, одна за другой, даже если вы нажимаете клавишу в течение очень короткого промежутка времени, строка 1 когда-нибудь будет обнаружена НИЗКИМ, и будет определено, что нажата 1. Если row1 ==low &&column1 ==low, это означает, что нажата 1.
Это показано в коде 1 . . Я написал этот код сам, потому что хотел загрузить его на плату stm32, а библиотека KEYPAD несовместима. С помощью этого кода вы поймете, что я объяснил выше. Или вы можете просто использовать библиотеку клавиатуры и запустить пример customkeypad. Оба будут служить одной цели. Но этот код не объяснит вам принцип работы.
При использовании монитора последовательного порта каждая нажатая клавиша отображается на экране. Это показано в видео 1 . .
После того, как определение ключа работает нормально, самое время поработать над паролем. Это так просто. Что я сделал, так это сделал строку «1234». Это пароль, который я установил. Теперь я сделал еще один массив. Каким бы ни было значение ключа, оно хранится в этом массиве. Когда число достигает 4, сравниваются обе строки. Если они совпадают - пароль правильный, иначе нет. Это показано в коде 2 . . Я подключил светодиод к выводу 11. Так что при правильном пароле он светится. Это показано на видео 2 . .
Теперь компонент, который будет использоваться в качестве замка:линейный привод на 12 В. Выглядит это так.

Для этого используется ИС L293d, которая также широко известна как ИС «драйвера двигателя». Эта микросхема подключена к источнику питания 12 В. Он принимает входы от Arduino, то есть вход 5 В, и выдает 12 В на свои выходные контакты (к которым подключен исполнительный механизм). Таким образом, если пароль правильный, на контакте 11 устанавливается высокий уровень, а на контакте 12 - низкий. Контакты 11 и 12 подключены к входам l293d. Следовательно, привод втягивается внутрь, и дверь открывается. показано на видео 3 .
Код
- код 1
- код 2
код 1 Arduino
Сканированиеint rows =4; int columns =4; char readkey (void); char nfunc (void); # define c3 9 # define c2 8 # define c1 7 #define c0 6 #define r3 5 # define r2 4 #define r1 3 # define r0 2void setup () {Serial.begin (9600); pinMode (c0, INPUT_PULLUP); pinMode (c1, INPUT_PULLUP); pinMode (c2, INPUT_PULLUP); pinMode (c3, INPUT_PULLUP); pinMode (r0, ВЫХОД); pinMode (r1, ВЫХОД); pinMode (r2, ВЫХОД); pinMode (r3, ВЫХОД); pinMode (11, ВЫХОД); pinMode (12, OUTPUT);} char readkey (void) {digitalWrite (r0, LOW); digitalWrite (r1, HIGH); digitalWrite (r2, HIGH); digitalWrite (r3, HIGH); if (digitalRead (c0) ==LOW) {delay (500); return '1';} else if (digitalRead (c1) ==LOW) {delay (500); return '2';} else if (digitalRead (c2) ==LOW) {delay (500); return '3';} else if (digitalRead (c3) ==LOW) {delay (500); return 'A';} digitalWrite (r0, HIGH); digitalWrite (r1, LOW); digitalWrite (r2 , HIGH); digitalWrite (r3, HIGH); if (digitalRead (c0) ==LOW) {delay (500); return '4';} else if (digitalRead (c1) ==LOW) {delay (500); return '5';} иначе, если (digitalRead (c2) ==LOW) {задержка (500); return '6';} else if (digitalRead (c3) ==LOW) {delay (500); return 'B';} digitalWrite (r0, HIGH); digitalWrite (r1, HIGH); digitalWrite (r2, LOW); digitalWrite (r3, HIGH); if (digitalRead (c0) ==LOW) {delay (500); return '7';} else if (digitalRead (c1) ==LOW) {delay (500); return '8';} else if (digitalRead (c2) ==LOW) {delay (500); return '9';} else if (digitalRead (c3) ==LOW) {delay (500); return 'C';} digitalWrite ( r0, HIGH); digitalWrite (r1, HIGH); digitalWrite (r2, HIGH); digitalWrite (r3, LOW); if (digitalRead (c0) ==LOW) {delay (500); return '*';} else if (digitalRead (c1) ==LOW) {delay (500); return '0';} else if (digitalRead (c2) ==LOW) {delay (500); return '#';} else if (digitalRead (c3 ) ==LOW) {задержка (500); return 'D';} return 'o';} char nfunc (void) {char key ='o'; while (key =='o') key =readkey (); return key;} void loop () {char key1 =nfunc (); if (key1) {Serial.print (key1);}}
код 2 Arduino
парольint rows =4; int columns =4; int count =0; char readkey (void); char nfunc (void); # define c3 9 # define c2 8 # define c1 7 # define c0 6 # define r3 5 # определить r2 4 # определить r1 3 # определить r0 2char password [5] ="1234"; char typed [5]; void setup () {Serial.begin (9600); pinMode (c0, INPUT_PULLUP); pinMode (c1, INPUT_PULLUP); pinMode (c2, INPUT_PULLUP); pinMode (c3, INPUT_PULLUP); pinMode (r0, ВЫХОД); pinMode (r1, ВЫХОД); pinMode (r2, ВЫХОД); pinMode (r3, ВЫХОД); pinMode (11, ВЫХОД); pinMode (12, OUTPUT);} char readkey (void) {digitalWrite (r0, LOW); digitalWrite (r1, HIGH); digitalWrite (r2, HIGH); digitalWrite (r3, HIGH); if (digitalRead (c0) ==LOW) {delay (500); return '1';} else if (digitalRead (c1) ==LOW) {delay (500); return '2';} else if (digitalRead (c2) ==LOW) {delay (500); return '3';} else if (digitalRead (c3) ==LOW) {delay (500); return 'A';} digitalWrite (r0, HIGH); digitalWrite (r1, LOW); digitalWrite (r2 , HIGH); digitalWrite (r3, HIGH); if (digitalRead (c0) ==LOW) {delay (500); return '4';} else if (digitalRead (c1) ==LOW) {delay (500); return '5';} иначе, если (digitalRead (c2) ==LOW) {задержка (500); return '6';} else if (digitalRead (c3) ==LOW) {delay (500); return 'B';} digitalWrite (r0, HIGH); digitalWrite (r1, HIGH); digitalWrite (r2, LOW); digitalWrite (r3, HIGH); if (digitalRead (c0) ==LOW) {delay (500); return '7';} else if (digitalRead (c1) ==LOW) {delay (500); return '8';} else if (digitalRead (c2) ==LOW) {delay (500); return '9';} else if (digitalRead (c3) ==LOW) {delay (500); return 'C';} digitalWrite ( r0, HIGH); digitalWrite (r1, HIGH); digitalWrite (r2, HIGH); digitalWrite (r3, LOW); if (digitalRead (c0) ==LOW) {delay (500); return '*';} else if (digitalRead (c1) ==LOW) {delay (500); return '0';} else if (digitalRead (c2) ==LOW) {delay (500); return '#';} else if (digitalRead (c3 ) ==LOW) {задержка (500); return 'D';} return 'o';} char nfunc (void) {char key ='o'; while (key =='o') key =readkey (); return key;} цикл void () {char key1 =nfunc (); if (key1) {typed [count] =key1; count ++; Serial.print (key1);} if (count ==4) {if (strcmp (введено, пароль) ==0) {Serial.println ("правильно"); digitalWrite (11, ВЫСОКИЙ); digitalWrite (12, LOW); задержка (250); digitalWrite (11, LOW);} else {Serial.println ("нарушитель");} count =0;}}
Схема

Подключите контакт 8 к 12 В

Если пароль правильный, его втягивают внутрь, и дверь открывается VID_20160924_201528.mp4
Производственный процесс
- Банковское хранилище
- Вращающаяся дверь
- Канал и замок
- Заблокировать
- Метеостанция на основе Raspberry Pi
- Создание двери офиса с автоматическим запиранием с помощью датчика приближения смартфона
- Windows IoT:дверь распознавания лиц
- Клеточные автоматы на основе Arduino и OLED
- Умный дверной замок с использованием страницы входа в WiFi от Arduino и ESP8266
- Понимание конфигурации двигателя