Кодовый замок на Arduino

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

Техническое задание

Разработать кодовый замок на Arduino, который управляет электромагнитным реле. При правильном вводе 5-значного кода,  срабатывает реле и загорается зеленый светодиод. Через 5 секунд реле приходит в изначальное состояние и зеленый светодиод гаснет. Если код введен неверно, то загорается красный светодиод в течение 5 секунд. Код можно вводить бесконечное количество раз.

Разработка

Давайте для начала смоделируем схему в Proteus

Кодовый замок на Arduino

На схеме мы видим матрицу из кнопок, два светодиода и вместо катушки реле для удобства взят спикер, который при эмуляции начинает трещать. При правильном наборе кода загорается светодиод L_1 и трещит спикер LS1 в течение 5 секунд.

Код программы:

Описание кода

Для того чтобы мы могли обрабатывать, нажатия клавиш на нашей клавиатуре, мы могли бы написать сами с нуля, библиотеку обработки, но это заняло бы много времени, и в данном случае, программируя на Ардуино, на языке высокого уровня, в этом нет необходимости. Достаточно только подключить готовую библиотеку, которая идет в комплекте библиотек с нашей Arduino IDE.

В данном проекте, нам потребуется использовать три значения, которые мы будем использовать при написании нашего кода. Мы могли бы пойти стандартным путем и создать три переменные, присвоить им имена и значения, и затем просто использовать их. Но мы решили пойти немножко дальше, и показать, как можно еще более удобным способом решить данную задачу. Мы создаем 4 директивы, LED 1, LED2 и RELAY, NUM_KEYS и присваиваем им постоянное значение, которое идет после названия директивы. После значения, точку с запятой, как мы привыкли, закрывать нашу строку, ставить не требуется.

Здесь мы знакомимся с новым типом массивов и переменных char, в котором помимо цифровых значений, могут храниться символьные, например буквы, и различные знаки. Итак, мы создаем массив myarraw, который содержит 5 знаков, (не забываем про создание директивы). В данный массив мы записываем 5 значений, которые содержатся в фигурных скобках. Они будут являться кодом, по которому будет открываться наш замок, их вы впоследствии сможете поменять на любые другие. Затем нам нужно создать еще один массив, также 5 знаков, в котором будут храниться значения, наших нажатых кнопок.

Здесь мы объявляем две переменные, к и s, и присваиваем им значение 0. В первой из них у нас будет храниться количество нажатий, а во второй количество совпадений, кода для открытия замка, который мы задали ранее в массиве, с кодом набранным на клавиатуре.

Здесь же, мы задаем 2 константы формата byte, в целях экономии памяти, нашего контроллера мы пользуемся форматом для хранения переменных byte, а не привычный многим формат int. В данном случае он будет избыточен, для наших задач.

Теперь же, нам нужно будет создать, таблицу соответствия, кнопок клавиатуры символам, которыебудут сохраняться в наших массивах. Как мы видим, их расположение, совпадает с нанесенными значками на клавиатуре.

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

Здесь нужно остановиться подробнее: Библиотека Keypad, описывает класс работы с клавиатурой. Т.е. создает тип данных «клавиатура», у этого типа данных свои параметры, которые мы указываем в скобках. Типа то, что клавиатура 4*4, к каким пинам подключены строки, к каким столбцы, и таблицу соответствия кнопок нашим символам. Т.е. Keypad это тип данных, наподобие int или char. Затем мы пишем имя своей переменной (создаваемого объекта) keypad с параметрами этой переменной в скобках. Как будто присваиваем значение этой переменной. И дальше работаем как с переменной, у которой можно менять параметры.

У этого класса есть разные методы — функции, к которым мы можем обращаться, чтобы работать с объектом, а еще есть внутренние, закрытые функции, которые работают сами, и мы не можем к ним обращаться. Т.е. keypad.getKey() — метод к которому мы обращаемся, чтобы получить значение нажатой клавиши, но у конкретной клавиатуры keypad. Классы позволяют создать несколько объектов. Т.е. мы можем подключить к ардуино 100 клавиатур и создать 100 объектов этих клавиатур. И потом работать с каждой по отдельности. Типа keypad1.getKey(), keypad2.getKey()… В рамках данной статьи, подробно разбирать, работу с классами и объектами, я думаю будет излишним, те кто заинтересуется данным вопросом, думаю что сможет теперь самостоятельно, найти информацию поиском.

Ну, здесь все просто, как мы помним в начале программы, мы создавали директивы, которые вызываем здесь, и просто подставляем их значения, в данном случае, это будут номера пинов Ардуино. Тем самым, мы конфигурируем наши три указанные пина на выход, и затем один из них притягиваем по умолчанию к единице.

Если с пинами все понятно, они будут зажигать и гасить наши светодиоды, и управлять реле, то выход 12 пина, мы устанавливаем равным логической единице, из за того, что наше реле, включается, при подаче логического нуля, на пин ардуино. А открытый по умолчанию замок, нам, разумеется не требуется.

Здесь мы опрашиваем нашу клавиатуру, были ли нажаты какие либо кнопки на клавиатуре.

Если была нажата какая либо из кнопок, то выполняем действие, сохраняем кнопку в массиве button_pressed. Затем наш счетчик нажатий, после нажатия первой кнопки, мы увеличиваем на единицу. Если количество нажатий соответствует значению, нашей директиве NUM_KEYS, то есть 5, мы выполняем код, следуем дальше.

Итак, в цикле for, мы присваем переменной uint8_t i, что означает INT 8 бит, значение 0. Затем проводим сравнение, если значение i меньше 5, мы увеличиваем на единицу значение i, и выполняем условие 5 раз. Сравниваем по символьно значения наших массивов, в котором хранятся набранные значения кнопок, и заданные нами в начале, для проверки на совпадение, на открытие замка. Если совпали значения, то счетчик совпадений, увеличиваем на единицу.

Для изменения кода доступа достаточно поменять значения цифр в строке 11 на свои цифры.

Сборка в железе

Для работы в железе нам понадобится собственно сама плата Arduino Uno

Кодовый замок на Arduino

Матричная клавиатура 4х4

Кодовый замок на Arduino

И модуль электромагнитного реле

Кодовый замок на Arduino

На Алике я находил прикольные замочки, которые можно навесить на вашу дверь

Кодовый замок на Arduino

EnglishRussianUkrainian