Необычный кодовый замок на arduino

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

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

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

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

Разработка

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

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

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

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

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

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

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

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

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

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

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

Проект 10. Сейф (кодовый замок)

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

Описание работы:

Для начала работы подключите питание к Arduino. Загорится светодиод сигнализирующий об открытии сейфа, сервопривод повернут на 90 градусов. а на экране высветятся цифры от 0 до 99.

Для закрытия сейфа необходимо ввести кодовую последовательность, для этого вращайте потенциометры влево или вправо. Индикатор условно поделен пополам. Левую сторону индикатора регулирует потенциометр во 2 посадочной площадке. Правую сторону индикатора регулирует потенциометр в 6 посадочной площадке. Потенциометры регулируются в диапазоне от 0 до 99. После того, как вы выставили нужную последовательность, запомните ее и нажмите на кнопку. Светодиод погаснет, сервопривод повернется в 0 градусов, а сейф закроется. Установленная кодовая последователь на индикаторе мигнет три раза и высветятся другие числа.

Для того, чтобы открыть сейф необходимо ввести ту же самую последовательность и нажать кнопку. Устройство автоматически будет выключать экран когда вы закрыли сейф и ничего не будете настраивать (не крутите потенциометры и не нажимаете кнопку). Если вы введете неправильную последовательность индикатор мигнет три раза. Как только вы ввели правильную комбинацию, светодиод на кнопке опять загорится, а сервопривод повернется в 0 градусов, указывая но то, что замок открыт.

Закрыть замок -> установить код -> нажать кнопку -> светодиод погаснет.

Открыть замок -> установить код -> нажать кнопку -> светодиод зажжется.

Нам понадобится:

  • Arduino Uno х 1шт.
  • Trema Set Shield х 1шт.
  • Trema-модуль потенциометр х 2шт.
  • Trema-модуль кнопка со светодиодом, синяя х 1шт.
  • Штыревой соединитель х 1шт.
  • Сервопривод х 1шт.

Для реализации проекта нам необходимо установить следующие библиотеки:

  • Библиотека iarduino_4LED для работы с Trema-модуль четырехразрядным LED индикатором.
  • Библиотека Servo для работы с сервоприводами (библиотека входит в стандартный набор Arduino IDE).

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE .

Схема сборки:

  • Устанавливаем Trema Set Shield в Arduino Uno.
  • Устанавливаем Trema-модуль Четырехразрядный LED индикатор в 4 посадочную площадку.

  • Устанавливаем Trema-модуль потенциометр в 6 посадочную площадку.

  • Устанавливаем Trema-модуль потенциометр во 2 посадочную площадку.

  • Устанавливаем Сервопривод в 6 посадочную площадку, воспользуясь Штыревым соединителем.

  • Полученный результат представлен на рисунке ниже.

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

Алгоритм работы:

В начале скетча (до кода setup) выполняются следующие действия:

  • Подключаем библиотеку iarduino_4LED для работы с Trema-модуль Четырехразрядным LED индикатором.
  • Объявляем объект dispLED, с указанием выводов дисплея.
  • Подключаем библиотеку Servo, для работы с Сервоприводом.
  • Объявляем объект servo.
  • Объявляем пины для работы с левым и правым Trema-модуль потенциометром, Сервоприводом, Trema-модуль кнопкой со светодиодом, синяя, а так же пины для работы с самими светодиодами.
  • Объявляем переменные и константы, которые задействованы в программе.
  • Объявляем функции.

В коде setup выполняются следующие действия:

  • Присоединяем сервопривод к выводу pinServo.
  • Переводим вывод pinKeyBlue, pinKeyLedBlue в режим входа.
  • Инициируем LED дисплей.
  • Устанавливаем максимальную яркость свечения LED индикатора.
  • Разрешаем переход к событию 1.
Читайте также  Как рассчитать активную мощность трансформатора?

В коде loop выполняются следующие действия:

  • Событие 1.
  • Считываем значение с потенциометров с помощью функции «ReadingValues()».
  • Выводим значения потенциометров с помощью функции «ShowTime()».
  • Если нажата кнопка, то сохраняем кодовую последовательность, разрешаем переход к событию 2 и изменяем событие вывода значений потенциометра в другом диапазоне на противоположное .
  • Устанавливаем сервопривод на 180 градусов.
  • Включаем светодиод на кнопке.
  • Разрешаем событие нажатия кнопки, если прошла одна секунда с момента начала этого события.
  • Событие 2.
  • Осуществляем мигание с помощью цикла, в котором сначала очищаем дисплей, гасим светодиод и ждем 500 мс, затем выводим на дисплей значения потенциометров, зажигаем светодиод, ждем 500 мс и так три раза.
  • Гасим светодиод, устанавливаем на сервопривод 0 градусов, разрешаем переход к событию 3 и обнуляем переменные значений с левого и правого потенциометра без масштабирования.
  • Событие 3.
  • Считываем значение с потенциометров с помощью функции «ReadingValues()».
  • Выводим значения потенциометров с помощью функции «ShowTime()».
  • Если оба предыдущих значения потенциометра равно новому, то увеличиваем переменную счета. А если не равно, обнуляем переменную счета.
  • Сохраняем новые значения левого и правого потенциометров в предыдущие переменные.
  • Если переменная счета больше 500, то разрешаем переход к событию 4.
  • Если нажата кнопка, то сравниваем кодовую последовательность с новыми установленными значениями потенциометров. Если совпадают, то зажигаем светодиод, устанавливаем сервопривод а 180 градусов., разрешаем переход к событию 1, запрещаем события нажатия кнопки, сохраняем нынешнее значение счетчика. Если не равны, тогда три раза мигаем экраном, в цикле убавляя и прибавляя яркость подсветки, через каждый 500 мс.
  • Событие 4.
  • Очищаем индикатор.
  • Обнуляем переменную счета.
  • Считываем значение с потенциометров с помощью функции «ReadingValues()».
  • Если значения изменились, то разрешаем переход к события 3.
  • Сохраняем новые значения левого и правого потенциометров в предыдущие переменные.
  • Если нажата кнопка, то разрешаем переход в событие 3.
  • функции «ReadingValues()». В ней убираем дребезг потенциометров, а именно значения на потенциометрах не в масштабе должны быть больше или меньше предыдущих значений на 10 единиц. Тогда сохраняем текущие значения потенциометров не в масштабе и сохраняем текущие значения потенциометров масштабе в зависимости от диапазона.
  • Функция «ShowTime() «. В ней преобразуем время целочисленного значения в строковое, добавляя ноль, где это необходимо. А так же выводим раз в пол секунды общее время и мигающую точку по центру, для событий 1 и 7. Для остальных событий выводим время и точку постоянно.

Как сделать электромеханический кодовый замок своими руками: схема на электронных компонентах и Ардуино

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

Шаг 1: Нужные материалы

  • Arduino Mega 2560
  • Набор проводов-перемычек для макетных плат
  • LCD дисплей (16 знаков х 2 строки)
  • Резистор переменного сопротивления
  • Клавиатура
  • Зеленый и красный диоды
  • Кусок ДСП
  • Печатная плата
  • Сервопривод

Шаг 2: Проверяем клавиатуру

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

Шаг 3: Код

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

Прежде чем вы скопируете код, подключите готовую библиотеку, которая находится в папке библиотек. Находится она по следующему пути: Windows C: —> program files (x86) —> Arduino.

Скопируйте код (но лучше загрузить файл):

Шаг 4: Подключаем компоненты и помещаем в корпус

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

Если вы хотите вывести клавиатуру, диоды и дисплей на столешницу или дверцу шкафа, вам останется только поместить контроллер и плату в коробку.

Шаг 5: Устанавливаем на место

  1. Нарисуйте, как примерно вы представляете себе результат
  2. Выберите место на столешнице, где вы будете устанавливать прибор (я советую установить прибор в верхний ящик стола и вывести периферию на поверхность столешницы)
  3. Наметьте на столе линии, по которым будете вырезать
  4. В углах контура просверлите отверстия (края отверстий не должны выходить за пределы контура)
  5. Вставьте полотно электролобзика в одно из отверстий и выпиливайте отверстие по контуру, посверленные отверстия облегчат вам процесс выпиливания углов
  6. Выпилите из листа ДСП (не толще 2,5 мм) кусок такого же размера, как и отверстие в столешнице
  7. На этом куске наметьте отверстия под клавиатуру, диоды и дисплей
  8. Просверлите отверстие для лобзика и выпилите намеченные фигуры
  9. Припаяйте провода-перемычки к контактам дисплея, клавиатуры и диодов
  10. Вставьте дисплей, клавиатуру и диоды в соответствующие отверстия в ДСП
  11. Кусок ДСП поместите в отверстие в столешнице
  12. Закрепить кусок ДСП можно маленькими уголками или клеем, я рекомендую первый вариант

По желанию:
Если закрепили поверхность кодового замка была утоплена в столешницу, можно добавить сверху еще один кусок ДСП, закрывающий электрокомпоненты. Этот кусок должен быть чуть больше, чем вырез в столешнице, и с маленькой петлей.

Шаг 6: Устанавливаем запирающий механизм

Эта часть достаточно сложная, поэтому заранее извиняюсь, если что-то написал непонятно.
Найдите где-нибудь металлическую пластину и согните ее буквой П. «Ноги» буквы сделайте по 3 см, а перекладину — 2 см.

В одной из «ног» просверлите 2 отверстия.
В дверце ящика просверлите 2 отверстия на таком же расстоянии друг от друга, как и отверстия на металлической детали.

Просверлите 2 отверстия по середине дверцы (не так, как это сделал я), если, конечно, вы не используете два сервопривода (что гораздо лучше в том случае, если дверца большая).
Закрепите П-образный крепеж на дверце двумя заклепками.

При установке сервопривода ориентируйтесь на фото. Установите привод в 2 см (или в 1см, это зависит от того, какую перекладину вы сделали П-образному крепежу) от дверцы.
Я приклеил сервопривод на суперклей, но вам я советую так не делать.

Шаг 7: Ставим выключатель на питание

Пару месяцев назад я поменял 12В адаптер от ноутбука на блок питания от старого компьютера.
Я соединил световой выключатель с проводом блока питания и с 12В выходом контроллера. Теперь я выключателем могу включать-выключать питание и кодовый замок. Блок питания подает ток на 2 диодных полосы, диоды замка и сам замок.

Провода блока питания, подключенные к выключателю – зеленый и черный. Если соединить эти два провода, а блок питания в это время будет включен в сеть, он заработает.

Шаг 8: Заключение

Работа над замком доставила мне огромное удовольствие. Я впервые сам писал код для микроконтроллера, и для этого мне пришлось многому научиться.

Читайте также  Рассеиватель света своими руками

Квадрат в столешнице нужно было вырезать аккуратнее.

Я хотел бы внести следующие изменения:

  • заменить Arduino Mega 2560 на Arduino Uno и подключить клавиатуру к аналоговому входу (используя пороговый сигнал)
  • поместить замок в корпус
  • напечатать на 3Д-принтере нормальную панель, которая бы закрыла неаккуратный вырез в столешнице. Я напечатаю панель, как только заработает нормально мой самодельный 3Д-принтер (пока что сопло постоянно забивается, а филамент скручивается)
  • заменить сервопривод на соленоид

Кодовый замок на Arduino за 20 минут

Предыстория

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

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

На двери с внешней стороны двери должна располагаться клавиатура, на которой вводится пароль, с внутренней стороны закреплена остальная конструкция. Для контроля полного закрытия двери используется геркон. Выходя из кабинета человек нажимает на клавиатуре «*» и не дожидаясь пока дверь закроется доводчиком идет по своим делам, когда дверь будет полностью закрыта, геркон замкнется и замок будет закрыт. Открывается дверь с помощью ввода 4х значного пароля и нажатием на «#».

Комплектующие

Arduino UNO = $18
Arduino protoshield + breadboard = $6
L293D = $1
Пучок проводов 30шт для бредборда = $4
2 розетки RJ45 = $4
2 вилки RJ45 = $0.5
актуатор центрального замка = 250 руб.
Геркон = бесплатно оторван от старого окна.
Шпингалет металлический гигантских размеров = бесплатно
Корпус от старого хаба D-LINK из полуторамиллиметрового железа = бесплатно
Блок питания от того же хаба D-LINK на 12 и 5в = тоже бесплатно
Куча винтов и гаечек для крепления всего этого добра к корпусу = 100руб.
Пульт управления от охранной сигнализации = бесплатно.

Итого: $33,5 и 350руб.

Не так уж и мало, скажете вы, и будете, определенно правы, но ведь за удовольствие надо платить! А собрать, что-то своими руками всегда приятно. К тому-же конструкцию можно сильно удешевить, если использовать голый МК без Arduino.

Подготовка к сборке

Хочется несколько слов сказать о покупке ключевого элемента конструкции актуатора. В местном авто-магазине мне предложили актуаторы двух видов: «с двумя проводами и с пятью». Со слов продавщицы они были абсолютно одинаковыми и различие в количестве проводов не значило абсолютно ничего. Однако, как оказалось позже, это не так! Я выбрал девайс с двумя проводами, он питался от 12в. В конструкции с пятью проводами установлены концевые выключатели, что позволяет контролировать движение рычага. Понял, что купил не тот я только когда разобрал его и менять его было поздно. Ход рычага оказался слишком коротким, чтобы нормально задвинуть щеколду, поэтому, необходимо было немного его доработать, а именно удалить две резиновые шайбы укорачивающие ход рычага актуатора. Для этого корпус пришлось распилить вдоль обычной ножовкой, потому, что вторая шайба находилась внутри. Синяя изолента нам, как всегда помогла нам в дальнейшем при сборке его назад.
Для управления мотором актуатора был использован драйвер моторов L293D, который выдерживает пиковую нагрузку до 1200 мА, у нас при остановке двигателя актуатора пиковая нагрузка вырастала всего до 600 мА.
Из пульта управления от охранной сигнализации были выведены контакты с клавиатуры, динамика и двух светодиодов. Пульт и основное устройство предполагалось соединить с помощью витой пары и RJ45 разъемов

Программирование.

Так, как опыта программирования Arduino у меня не было до сих пор. Я воспользовался чужими наработками и статьями с сайта arduino.cc. Кому интересно, может поглядеть этот безобразный код 🙂

Фото и видео


Ардуино и актуатор


Блок питания


Клавиатурка


Шпингалет (соединен с актуатором металлической спицей и на которую надета термоусадка для красоты)

Умный электронный замок на Ардуино, работающий по Bluetooth — входная дверь как у Спайдермена

RFID (англ. Radio Frequency IDentification, радиочастотная идентификация) — способ автоматической идентификации объектов, в котором посредством радиосигналов считываются или записываются данные, хранящиеся в так называемых транспондерах, или RFID-метках. Любая RFID-система состоит из считывающего устройства (считыватель, ридер или интеррогатор) и транспондера (он же RFID-метка, иногда также применяется термин RFID-тег).

В уроке будет использоваться RFID-метка с Arduino. Устройство читает уникальный идентификатор (UID) каждого тега RFID, который мы размещается рядом со считывателем, и отображает его на OLED-дисплее. Если UID тега равен предопределенному значению, которое хранится в памяти Arduino, тогда на дисплее мы увидим сообщение «Unlocked» (англ., разблокировано). Если уникальный идентификатор не равен предопределенному значению, сообщение «Unlocked» не появится — см. фото ниже.

Замок закрыт

Замок открыт

Объяснение работы проекта

Сначала мы должны сохранить образец стука в системе (нашем замке). Для этого мы должны нажать и удерживать кнопку до тех пор пока не постучим 6 раз (можно изменить это количество стуков в программе). После 6 стуков плата Arduino сохраняет этот образец стука в EEPROM (энергонезависимую память). После этого, чтобы открыть замок с помощью стуков, мы должны быстро нажать и отпустить кнопку, после чего постучать 6 раз. Если образец (шаблон) наших 6 стуков совпадет с образцом, хранящимся в EEPROM, то плата Arduino откроет дверь.

Примечание: когда мы нажимаем или нажимаем и держим кнопку плата Arduino запускает 10-секундный таймер чтобы “принять” 6 стуков. То есть все стуки необходимо сделать в течение этого 10-секундного интервала. Для более детальной информации можно открыть монитор последовательного порта и посмотреть в нем лог событий.

arduinoLab

Программируемый электронный замок с iButton (touch memory) ключами на ардуино,

с памятью на 63 ключа и открывание двери сервоприводом.

Код для ключей DALLAS DS1990, на таких, обычно по центру, написано 1-Bus или 1-Ware или совместимые с ними.

#include #include #include const byte saveKey = 2; // вход для кнопки обнуления const byte statusLed = 13; const byte doorPin = 3; OneWire ds(8); Servo servo; byte addr[8]; byte allKey; // всего ключей // функция сверяет два адреса (два массива) boolean addrTest(byte addr1[8], byte addr2[8])< for(int i = 0; i = 63) error(); // если места нет while (!ds.search(addr)) ds.reset_search(); // ждем ключ if ( OneWire::crc8( addr, 7) != addr[7]) error(); if (keyTest()) error(); // если нашли ключ в еепром. for(int i = 0; i

Запись образца стука в Arduino

В нашем проекте мы использовали зуммер или пьезоэлектрический датчик (Peizo Sensor) для обнаружения стука. Кнопка используется для считывания входа датчика и для сохранения образца стука в плату Arduino. Идея проекта похожа на код Морзе, но не в точности соответствует ему.

Читайте также  Регулятор напряжения 12 вольт для светодиодов

Мы использовали картонную коробку для демонстрации работы проекта. Чтобы считать значения с выхода зуммера мы должны стучать в коробку после нажатия кнопки. Анализируется время между стуками, большее или меньше 500 мс – это значение можно поменять в программе. Более подробно смотрите в видео в конце статьи.

Когда мы начинаем стучать плата Arduino начинает анализировать (мониторить) время от первого стука до второго стука и потом записывать это значение времени в массив. В нашем проекте мы использовали 6 стуков (можно поменять в программе), то есть мы будем считывать значения 5 временных промежутков.

Затем мы будем анализировать интервалы времени между всеми 6 стуками. Сначала мы проверим временной интервал между первым и вторым стуками и если он будет меньше 500 мс, то мы запишем в соответствующую переменную 0, а если больше 500 мс – то в эту переменную мы запишем 1. После этого мы будем проверять временной интервал между вторым и третьим стуками и т.д. В результате мы получим 5 цифр в двоичном формате (0 или 1).

Работа схемы

Схема устройства представлена на следующем рисунке.


Как видите, схема нашего “умного детектора стуков” достаточно проста и содержит плату Arduino, управляющую всем процессом, кнопку, зуммер (buzzer) и сервомотор. Плата Arduino принимает пароль (образец стука) от зуммера (или датчика), сравнивает его с заданными шаблонами (образцами), дает команду сервомотору на открытие/закрытие двери и сохраняет образец (шаблон) стука.

Кнопка подключена к контакту D7 платы Arduino, второй контакт кнопки замкнут на землю. Зуммер при помощи параллельно включенного ему резистора на 1 МОм подключен к аналоговому контакту A0 платы Arduino. Сервомотор подключен к цифровому контакту D3 платы Arduino и будет управляться при помощи широтно-импульсной модуляции, доступной на данном контакте.

Необычный кодовый замок на Arduino

Ардуино — идеальная платформа для быстрого прототипирования. Много дурацких, но интересных идей без неё явно не реализовались бы. Вот давно зрела у меня идея какого-нибудь хитрого кодового замка — например, где кодом было бы время удерживания кнопки. Суть в том, что такой замок трудно вскрыть, даже зная в точности пароль — те, кто им успешно пользуются, выдерживаю интервалы, используя мышечную память, которой у злоумышленника явно не будет. Ну это в теории, конечно.

Я уже даже был готов взять генератор прямоугольных импульсов, 3 десятеричных счётчика и ещё ворох какой-то логики, чтобы это всё собрать. Но даже в smd это выглядело бы слишком громоздко и неудобно для практического использования. Но идея вертелась в голове и зрела. Избавиться от неё удалось, только написав прогу под Ардуино, превращающую её в кодовый замок, в котором одом является не номер нажатой кнопки (как в обычных), а сочетание кнопок, нажатых одновременно. Нигде раньше не встречал такого решения, если встретите — сообщите 🙂

Схема проста до безобразия. (код, впрочем, тоже )

Не очень хорошо видно, но кнопки подключаются к: а) земле и D3 (третий цифровой пин), b) D5 и D7 c) D9 и D11.

Кстати, fritzing оказалась удобной программой для создания таких рисунков — очень быстро, просто и наглядно. Не зря все уроки по ардуине с его помощью проиллюстрированы.

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 — это значит что пин подтянут к +5В внутренним резистором (10 кОм, вроде). Это позволяет избежать «плавающего» сигнала на нём и не коротнуть чего лишнего при замыкании кнопкой на землю. blinktwice выделен в отдельную функцию ради удобства — никогда не упускайте возможности попрактиковаться в использовании функций! Далее считываются уровни сигнала на портах (они будут LOW, т.е 0, когда кнопка нажата, и 1, когда не нажата), и сравниваются с записанными в массивах значениями — например нулевые значения 0,1,1 означают, что первая кнопка должна быть нажата, а две других обязательно отжаты. Если условие выполняется, происходит переход к следующим значениям. Когда все 7 последовательных условий выполнились, выполняется условие k==8 и светодиод загорается на 3 секунды, сигнализируя о правильности введённого кода. В этот кусок кода надо вписывать то, что и должно происходить при этом — открытие двери, звуковой сигнал и т.д.

Оставшийся кусок кода сбрасывает счётчик, если с момента первого введения комбинации (при этом гаснет светодиод) прошло больше 10 секунд. Без этого было бы в принципе возможно перебрать все последовательности нажатых кнопок, хотя их число составляет (2^3)^7 = 2^21, что больше двух миллионов. Очень полезно помнить при этом, что в году всего лишь 31 миллион секунд. А время введения правильного кода — 5 секунд после небольшой тренировки, так что можно ещё зажать по времени. Мне пока не на ком тестировать систему, но если кому система понравится настолько, чтобы воплотить её в жизнь — пожалуйста, напишите о результатах!