Содержание
- Введение
- Для кого эта сверхсекретная миссия?
- Арсенал Агента: Что нам понадобится?
- Шаг 1: Энергетический Блок – Обеспечиваем Автономность
- Шаг 2: Монтаж на Плате – От Хаоса к Порядку
- Шаг 3: Прошивка Мозга – Вдыхаем Жизнь в Железо
- Шаг 4: Монтаж Замка на Шкафчик и Финальное Подключение
- Шаг 5: Боевое Крещение – Тестируем Замок!
- Шаг 6: Что-то Пошло Не Так? Разбор Полетов!
- Вывод: Миссия Выполнена!
Операция "Неприступный Шкаф": Создаем Сверхсекретный Тайник с Электронным Замком для Юного Агента!
Привет, коллеги-шифровальщики и будущие мастера тайных операций! Сегодня мы не просто мастерим – мы воплощаем мечту каждого десятилетнего (и, чего греха таить, взрослого) шпиона: создаем собственный неприступный шкаф! Представьте: ваш ребенок – Агент 007, и его шкаф – это не просто место для носков, а настоящий сейф для самых ценных артефактов. Секретные чертежи, конфискованные у младшего брата конфеты, планы захвата мира (или хотя бы школьного буфета) – все под надежным кодовым замком! И самое крутое – пароль можно менять на лету, прямо с клавиатуры. Никаких скучных ключей, только хардкор, только цифры!
Для этой секретной миссии нам понадобится не просто энтузиазм, а арсенал настоящего гаджетостроителя. Готовы? Тогда заряжайте паяльники, надевайте защитные очки (потому что искры вдохновения могут быть опасны) и погнали!

Интересный факт: Гениальность часто кроется в ресайклинге! Обычная картонная коробка из-под телефона становится идеальным корпусом для блока управления нашим электронным замком. Это доказывает: чтобы создавать крутые гаджеты, не нужна лаборатория МИ-6, достаточно желания, кучи компонентов и верной коробки!
Интересный факт: Первые электронные замки были похожи на чемоданы из фильмов о шпионах 70-х – громоздкие и дорогие. А наш замок будет компактным, стильным и собранным из деталей, доступных даже без бюджета МИ-6! Мы сделаем его за вечер, а уровень крутости будет зашкаливать!
Для кого эта сверхсекретная миссия?
Этот проект – идеальное задание для юного инженера 10+ лет, который мечтает о собственном уголке, куда "вход только по пропускам". Это не просто игрушка, это настоящий учебный полигон! Ваш ребенок (под вашим чутким руководством, конечно) узнает:
- Как работает "мозг" операции – микроконтроллер Arduino Nano.
- Как превратить нажатия кнопок на клавиатуре 4x4 в секретный код.
- Зачем нужен LCD дисплей 1602 (спойлер: чтобы видеть, что происходит, и хвастаться перед друзьями).
- Как заставить электронный замок ZK-ZNS14 слушаться команд.
- Почему MOSFET модуль – это круче маленького транзистора (особенно когда надо "открыть шлюзы" для замка).
- Как организовать автономное питание с помощью аккумулятора 18650, модуля зарядки TP4056 и повышающего преобразователя.
- И главное – как аккуратно все это спаять на макетной плате, чтобы оно не только работало, а и выглядело как настоящий шпионский гаджет!
Это также отличная возможность провести время вместе, передать свои навыки пайки (или научиться вместе!) и создать что-то действительно уникальное.
Предупреждаем: после успешного завершения миссии шансы найти в этом шкафу ваши собственные заначки стремятся к нулю. Уровень секретности: "Бог".
Арсенал Агента: Что нам понадобится?

Сверяем наш чемоданчик юного шпиона-инженера:
- Аккумулятор CX XNY 18650 (2000mAh 3.7V Li-ion) – Сердце нашего устройства, дает ему жизнь.
- Батарейный отсек 18650 – Уютный дом для нашего аккумулятора.
- TP4056 Модуль для зарядки Li-ion Type-C 5V 1A – Чтобы наш агент всегда был в форме (то есть заряжен). Удобно – тот же Type-C!
- CKCS BS01 Mini Повышающий Модуль DC-DC – Маленький волшебник, превращающий 3.7V от аккумулятора в стабильные 5V для Nano и других модулей. Без него никак!
Энергетический Блок – Обеспечиваем Автономность
Прежде чем командовать замком, надо дать нашей системе "поесть". Собираем систему питания – это основа основ!
flowchart LR BATT["Аккумулятор
18650
3.7V"] --> |"B+/B-"| TP4056["TP4056
Модуль зарядки"] USB["USB Type-C
зарядка"] --> |"5V"| TP4056 TP4056 --> |"OUT+/OUT-
3.7V"| BOOST["DC-DC
Повышающий
конвертер"] BOOST --> |"OUT+/OUT-
5.0V"| POWER["Силовое
питание
системы"] subgraph CONSUMERS["Потребители"] direction TB NANO["Arduino
Nano"] LCD["LCD
Дисплей"] MOSFET["MOSFET
модуль"] OTHER["Другие
компоненты"] end POWER --> CONSUMERS MOSFET --> |"OUT +/-"| LOCK["Электромеханический
замок"] classDef battery fill:#f9d71c,stroke:#333,stroke-width:2px classDef module fill:#9cf,stroke:#333,stroke-width:2px classDef consumer fill:#a1de93,stroke:#333,stroke-width:2px classDef out fill:#f98866,stroke:#333,stroke-width:2px class BATT,USB battery class TP4056,BOOST,POWER,MOSFET module class NANO,LCD,OTHER consumer class LOCK out
Зарядка и Аккумулятор
Припаяй провода от батарейного отсека к контактам B+ и B- на модуле зарядки TP4056.
Повышаем Напряжение
Настройка 5V
- Временно подключи модуль TP4056 к USB-зарядке (без аккумулятора).
- На выходе Boost Converter (OUT+ и OUT-) должно появиться напряжение.
- Возьми мультиметр и сними перемычки "А" и "В" на плате Boost Converter. Этот режим отвечает за 5 вольт. Проверь выходное напряжение - должно быть значение близкое к 5V
Готово!
Теперь у нас есть стабильные 5V, которые будут работать, пока аккумулятор не сядет. А когда сядет – просто подключи Type-C кабель к модулю TP4056 для зарядки.
flowchart TB %% Главные блоки системы subgraph POWER["Система питания"] direction TB BATT["Аккумулятор 18650
3.7V Li-ion"] TP4056["Модуль зарядки
TP4056 Type-C"] BOOST["DC-DC Повышающий
Конвертер
3.7V → 5V"] USB["USB Type-C
зарядка"] end subgraph CONTROL["Система управления"] direction TB NANO["Arduino Nano
ATmega328P"] LCD["LCD 1602
I2C Дисплей"] KB["Матричная
клавиатура 4x4"] BUZ["Зуммер
(D13)"] end subgraph LOCK_SYSTEM["Система замка"] direction TB MOSFET["Силовой ключ
MOSFET модуль
AOD4184"] LOCK["Электромеханический
замок ZK-ZNS14"] end %% Подключение питания BATT -- "B+/B-" --> TP4056 USB -- "5V" --> TP4056 TP4056 -- "OUT+/OUT-
3.7V" --> BOOST BOOST -- "5V" --> POWER_BUS[/"Шина питания 5V"/] %% Соединение систем POWER_BUS --> NANO POWER_BUS --> LCD POWER_BUS --> MOSFET %% Подключение компонентов NANO -- "SDA (A4)
SCL (A5)" --> LCD NANO -- "D9,D8,D7,D6 → Ряды
D5,D4,D3,D2 → Столбцы" --> KB NANO -- "D10" --> MOSFET NANO -- "D13" --> BUZ MOSFET -- "OUT+/OUT-" --> LOCK %% Шина GND (выделена отдельно для четкости) GND_BUS[/"Общая шина GND"/] -.- BATT GND_BUS -.- TP4056 GND_BUS -.- BOOST GND_BUS -.- NANO GND_BUS -.- LCD GND_BUS -.- KB GND_BUS -.- BUZ GND_BUS -.- MOSFET GND_BUS -.- LOCK %% Стили для компонентов classDef powerComponents fill:#ffeb9d,stroke:#d49000,stroke-width:2px classDef controlComponents fill:#c6e5ff,stroke:#0073b7,stroke-width:2px classDef lockComponents fill:#ffd2cc,stroke:#cc4125,stroke-width:2px classDef bus fill:#f5f5f5,stroke:#666,stroke-width:1px,stroke-dasharray: 5 5 %% Применение стилей class BATT,TP4056,BOOST,USB powerComponents class NANO,LCD,KB,BUZ controlComponents class MOSFET,LOCK lockComponents class POWER_BUS,GND_BUS bus %% Стили для групп classDef powerGroup fill:#fff9e6,stroke:#ffad33,stroke-width:2px classDef controlGroup fill:#e6f3ff,stroke:#3399ff,stroke-width:2px classDef lockGroup fill:#ffe6e0,stroke:#ff6347,stroke-width:2px %% Применение стилей к группам class POWER powerGroup class CONTROL controlGroup class LOCK_SYSTEM lockGroup %% Пояснение subgraph LEGEND["Условные обозначения"] direction LR L1["Компоненты питания"] --- L1C[" "] L2["Компоненты управления"] --- L2C[" "] L3["Компоненты замка"] --- L3C[" "] L4["Шины данных/питания"] --- L4C[" "] class L1C powerComponents class L2C controlComponents class L3C lockComponents class L4C bus end
Детальная Схема Подключений
A. Цепь Питания (Внутри Блока Управления)
18650
Type-C
Type-C
Converter
Converter
B. Питание Компонентов (Внутри Блока Управления)
C. Сигнальные Подключения (к Arduino Nano)
Компонент | Пин компонента | Подключение | Пин Arduino Nano |
---|---|---|---|
LCD 1602 I2C
|
SDA |
|
A4 (SDA) |
SCL |
|
A5 (SCL) | |
Клавиатура 4x4
|
Ряд 1 |
|
D6 |
Ряд 2 |
|
D7 | |
Ряд 3 |
|
D8 | |
Ряд 4 |
|
D9 | |
Столбец 1 |
|
A0 | |
Столбец 2 |
|
A1 | |
Столбец 3 |
|
A2 | |
Столбец 4 |
|
A3 | |
MOSFET Модуль
|
SIG |
|
D10 |
Зуммер
|
Сигнал |
|
D13 |
Схема пинов Arduino Nano

Цифровые пины
Аналоговые пины
D. Подключение Нагрузки (Внешний Замок)
Замок ZK-ZNS14
Если на выходе не 5V, а что-то странное – не бей модуль молотком. Проверь полярность. Или позови взрослых. Или кота – они разбираются в электронике лучше, чем кажется.
Монтаж на Плате – От Хаоса к Порядку
Теперь самое интересное – превращаем кучку компонентов в единый организм. Макетная плата – наш друг!
flowchart TB NANO["Arduino Nano
ATmega328P"] --- LCD["LCD 1602
I2C"] NANO --- KB["Клавиатура 4x4"] NANO --- MSF["MOSFET
модуль"] subgraph A1["Подключение дисплея I2C"] direction LR LCD_GND["GND"] --> NANO_GND["GND"] LCD_VCC["VCC"] --> PSU_5V["5V питания"] LCD_SDA["SDA"] --> NANO_A4["Пин A4"] LCD_SCL["SCL"] --> NANO_A5["Пин A5"] end subgraph A2["Подключение клавиатуры 4x4"] direction LR KB_ROWS["Rows (4)"] --> |"D9,D8,D7,D6"| NANO_ROW["Цифровые пины
9,8,7,6"] KB_COLS["Columns (4)"] --> |"D5,D4,D3,D2"| NANO_COL["Цифровые пины
5,4,3,2"] end subgraph A3["Подключение MOSFET модуля"] direction LR MSF_SIG["SIG"] --> NANO_D10["Пин D10"] MSF_VIN["VIN+/GND"] --> PSU_5V2["DC-DC выход 5V"] MSF_OUT["OUT+/OUT-"] --> LOCK["К электрозамку"] end LCD --- A1 KB --- A2 MSF --- A3 classDef comp fill:#9cf,stroke:#333,stroke-width:2px classDef connections fill:#f9f,stroke:#333,stroke-width:2px classDef pins fill:#fc9,stroke:#333,stroke-width:1px classDef dest fill:#a1de93,stroke:#333,stroke-width:1px class NANO,LCD,KB,MSF comp class A1,A2,A3 connections class LCD_GND,LCD_VCC,LCD_SDA,LCD_SCL,KB_ROWS,KB_COLS,MSF_VCC,MSF_GND,MSF_SIG,MSF_VIN,MSF_OUT pins class NANO_GND,NANO_A4,NANO_A5,PSU_5V,NANO_ROW,NANO_COL,NANO_5V,NANO_GND2,NANO_D10,PSU_5V2,LOCK dest
Планирование
Разложи компоненты (Nano, MOSFET модуль, разъемы для LCD и клавиатуры) на макетной плате. Подумай, как их разместить компактно, чтобы провода были как можно короче. Помни о местеMight для подвода питания (5V и GND от буст-конвертера) и вывода проводов к замку.
Паяем Мозг (Nano)
Припаяй Arduino Nano к плате. Можно использовать гребенки (pin headers), чтобы плату можно было снять, если что-то пойдет не так.
Паяем Дисплей (I2C LCD)
Дисплей I2C – это просто сказка! Всего 4 провода:
Припаяй 4-пиновый разъем на плату, чтобы дисплей можно было легко подключить/отключить.
Паяем Клавиатуру
Клавиатура 4x4 имеет 8 выводов. Припаяй 8-пиновый разъем.
Паяем Силовой Ключ (MOSFET Module)
Этот модуль будет управлять замком.
Разводка Питания
Аккуратно разведи дорожки 5V и GND от выхода буст-конвертера ко всем компонентам, которым они нужны (Nano, LCD, MOSFET-логика). Используй провода потолще для силовых линий (к MOSFET и замку).
Готовим Корпус (Коробку)


Технический Нюанс: Почему MOSFET модуль? Электромеханический замок при срабатывании потребляет значительный ток (импульсно). Маленький транзистор BC547 мог бы просто "сказать пока" (с дымком). Модуль на MOSFET AOD4184 рассчитан на токи до 15А – это с огромным запасом! Он едва заметит наш замок. Плюс, им легко управлять логическим сигналом 5V от Arduino.
Помни: если во время пайки запахло горелым, это не обязательно кулинарная катастрофа на кухне. Возможно, это просто флюс или компонент намекает, что ему нужна минутка прохлады. Проветри комнату, проверь соединения и дай плате немного отдохнуть!
Говорят, инженер без синей изоленты и термоклея – не настоящий инженер. Судя по фото, здесь работал профессионал!
Прошивка Мозга – Вдыхаем Жизнь в Железо
Время стать немного хакером и научить наш Arduino думать! Код – это душа нашего замка.
Время научить наш Arduino думать и управлять всем этим добром! Вот подробный разбор скетча:
// --- Подключение необходимых библиотек --- #include// Стандартная библиотека Arduino (для millis() и т.д.) #include // Для работы с матричной клавиатурой 4x4 #include // Для сохранения пароля в энергонезависимой памяти Arduino #include // Необходима для коммуникации по шине I2C #include // Специальная библиотека для работы с LCD дисплеями через I2C адаптер // --- Инициализация объекта дисплея --- // Указываем I2C адрес дисплея (0x27 - самый распространенный, но может быть 0x3F - проверяй сканером!) // Также указываем размеры дисплея: 16 символов в ширину, 2 строки в высоту. LiquidCrystal_I2C lcd(0x27, 16, 2); // --- Определение констант (пины и настройки) --- #define lockPin 10 // Цифровой пин D10 будет управлять сигнальным входом MOSFET модуля (открыть/закрыть замок) #define buzzerPin 13 // Цифровой пин D13 (где часто встроен светодиод на Nano) будет подключен к зуммеру #define EEPROM_ADDRESS 0 // Адрес в памяти EEPROM, с которого начинается сохранение нашего пароля // --- Настройка клавиатуры 4x4 --- const byte ROWS = 4; // Количество рядов const byte COLS = 4; // Количество столбцов // Матрица символов, соответствующая кнопкам на клавиатуре const char keys[ROWS][COLS] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; // Пины Arduino, к которым физически подключены выводы РЯДОВ клавиатуры const byte rowPins[ROWS] = {6, 7, 8, 9}; // Подключены к D6, D7, D8, D9 // Пины Arduino, к которым физически подключены выводы СТОЛБЦОВ клавиатуры const byte colPins[COLS] = {A0, A1, A2, A3}; // Подключены к A0, A1, A2, A3 (используются как цифровые входы) // Создание объекта keypad с помощью библиотеки Keypad Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); // --- Глобальные переменные (доступны во всех функциях) --- String password; // Переменная для хранения текущего действующего пароля (тип String) const String secretCombination = "A123"; // Секретный код для активации режима смены пароля bool passwordEntry = false; // Флажок (true/false), показывающий, находимся ли мы сейчас в процессе ввода пароля bool changePasswordMode = false; // Флажок, показывающий, находимся ли мы сейчас в процессе смены пароля String input = ""; // Переменная для накопления символов, вводимых пользователем unsigned long lastActivityTime = 0; // Переменная для хранения времени последнего нажатия кнопки (в миллисекундах) // --- Функция setup() - выполняется один раз при включении или перезагрузке Arduino --- void setup() { pinMode(lockPin, OUTPUT); // Настраиваем пин замка (D10) как ВЫХОД pinMode(buzzerPin, OUTPUT); // Настраиваем пин зуммера (D13) как ВЫХОД digitalWrite(lockPin, LOW); // Сразу устанавливаем низкий уровень на пине замка (замок закрыт) lcd.init(); // Инициализируем LCD дисплей lcd.backlight(); // Включаем подсветку дисплея lcd.print("Welcome!"); // Выводим приветственное сообщение loadPassword(); // Вызываем функцию для загрузки пароля из EEPROM lastActivityTime = millis(); // Запоминаем текущее время как время последней активности } // --- Функция loop() - основной цикл программы, выполняется бесконечно --- void loop() { // Проверка на бездействие для выключения подсветки // Если с момента последнего нажатия прошло 20000 миллисекунд (20 секунд)... if (millis() - lastActivityTime >= 20000) { lcd.noBacklight(); // ...выключаем подсветку дисплея } char key = keypad.getKey(); // Считываем, какая кнопка нажата сейчас (если ни одна, вернет NO_KEY) if (key) { // Если какая-то кнопка была нажата... // ...сразу включаем подсветку (на случай, если она была выключена) lcd.backlight(); // ...обновляем время последней активности lastActivityTime = millis(); // ...выдаем короткий звуковой сигнал зуммером (частота 1000 Гц, длительность 100 мс) tone(buzzerPin, 1000, 100); // --- Логика обработки нажатой клавиши --- // Сценарий 1: Мы НЕ в режиме ввода пароля и НЕ в режиме смены пароля (ожидаем '*') if (!passwordEntry && !changePasswordMode) { if (key == '*') { // Если нажали '*'... passwordEntry = true; // ...входим в режим ввода пароля input = ""; // ...очищаем буфер ввода lcd.clear(); // ...очищаем экран lcd.print("Enter password:"); // ...просим ввести пароль lcd.setCursor(0, 1); // ...переводим курсор на второй ряд для отображения ввода } } // Сценарий 2: Мы УЖЕ в режиме ввода пароля ИЛИ в режиме его смены else { if (key == '#') { // Если нажали '#' (завершение ввода)... // --- Обработка после нажатия '#' --- if (changePasswordMode) { // Если мы были в режиме СМЕНЫ пароля... if (input.length() > 0) { // ...и новый пароль не пустой... password = input; // ...сохраняем введенную строку как новый пароль savePassword(); // ...записываем новый пароль в EEPROM lcd.clear(); lcd.print("Password changed"); // ...сообщаем об успехе tone(buzzerPin, 2000, 500); // ...выдаем длинный подтверждающий сигнал delay(2000); // ...ждем 2 секунды changePasswordMode = false; // ...выходим из режима смены пароля passwordEntry = false; // (также выходим из режима ввода) input = ""; // ...очищаем буфер lcd.clear(); lcd.print("Welcome!"); // ...возвращаем приветственное сообщение } else { // Если новый пароль пустой - ничего не делаем, просто выходим changePasswordMode = false; passwordEntry = false; input = ""; lcd.clear(); lcd.print("Cancelled"); delay(1000); lcd.clear(); lcd.print("Welcome!"); } } else { // Если мы были в режиме ВВОДА пароля (не смены)... // --- Проверка введенного пароля --- if (input == password) { // Если введенное совпадает с сохраненным паролем... // *** ДОСТУП РАЗРЕШЕН *** lcd.clear(); lcd.print("Password correct"); tone(buzzerPin, 2000, 500); // ...победный сигнал digitalWrite(lockPin, HIGH); // ...ОТКРЫВАЕМ ЗАМОК (подаем HIGH на MOSFET) delay(3000); // ...держим замок открытым 3 секунды digitalWrite(lockPin, LOW); // ...ЗАКРЫВАЕМ ЗАМОК (снимаем сигнал с MOSFET) lcd.clear(); lcd.print("Locked"); // ...сообщаем, что замок закрыт delay(1500); // ...небольшая пауза lcd.clear(); lcd.print("Welcome!"); // ...возвращаем приветствие } else if (input == secretCombination) { // Если введенное совпадает с кодом смены пароля... // *** АКТИВАЦИЯ РЕЖИМА СМЕНЫ ПАРОЛЯ *** changePasswordMode = true; // ...устанавливаем флажок режима смены passwordEntry = false; // ...(выходим из режима простого ввода) input = ""; // ...очищаем буфер lcd.clear(); lcd.print("Enter new pass:"); // ...просим ввести новый пароль lcd.setCursor(0, 1); } else { // Если введенное не совпало ни с паролем, ни с кодом смены... // *** ДОСТУП ЗАПРЕЩЕН *** lcd.clear(); lcd.print("Wrong password"); // Выдаем три коротких тревожных сигнала for (int i = 0; i < 3; i++) { tone(buzzerPin, 500, 200); delay(300); } delay(2000); // ...ждем 2 секунды lcd.clear(); lcd.print("Welcome!"); // ...возвращаем приветствие } // После обработки '#' в режиме ввода, сбрасываем флажок и буфер passwordEntry = false; input = ""; } } else { // Если нажата НЕ '#' (а цифра, буква или '*') // --- Добавление символа в буфер ввода --- if (input.length() < 16) { // Ограничение длины пароля (чтобы не переполнить буфер) input += key; // Добавляем нажатый символ в строку 'input' lcd.print('*'); // !!! Вместо символа выводим на экран звездочку '*' для секретности !!! } } } } } // --- Вспомогательная функция для загрузки пароля из EEPROM --- void loadPassword() { char buffer[17]; // Создаем буфер для чтения (размер пароля + 1 для '\0') EEPROM.get(EEPROM_ADDRESS, buffer); // Считываем данные из EEPROM, начиная с адреса EEPROM_ADDRESS, в буфер buffer[16] = '\0'; // Гарантируем, что строка заканчивается нулевым символом password = String(buffer); // Преобразуем прочитанный массив символов в объект String // Проверка на "первый запуск": если пароль пустой или содержит "мусор" if (password.length() == 0 || password.length() > 16) { password = "1234"; // ...устанавливаем пароль по умолчанию "1234" savePassword(); // ...и сразу сохраняем его в EEPROM } } // --- Вспомогательная функция для сохранения пароля в EEPROM --- void savePassword() { char buffer[17]; // Создаем буфер для записи // Копируем текущий пароль (переменная 'password' типа String) в массив символов 'buffer' password.toCharArray(buffer, sizeof(buffer)); // Записываем содержимое буфера 'buffer' в EEPROM, начиная с адреса EEPROM_ADDRESS EEPROM.put(EEPROM_ADDRESS, buffer); // Примечание: EEPROM имеет ограниченный ресурс циклов записи (~100,000). // Эта функция вызывается только при реальном изменении пароля, что является правильным подходом. }

Видишь строку lcd.print('*');? Это классика жанра! Вместо того чтобы показывать введенный пароль, мы выводим звездочки. Почувствуй себя настоящим шпионом, даже когда вводишь "1111"!
Логика Работы Системы
stateDiagram-v2 [*] --> Setup: Включение питания state Setup { [*] --> PinInit: Настройка пинов PinInit --> LockInit: Установка замка в позицию LOW LockInit --> DisplayInit: Инициализация дисплея DisplayInit --> PassInit: Загрузка пароля из EEPROM PassInit --> TimerInit: Запуск таймера активности } Setup --> MainLoop: Переход к основному циклу MainLoop --> MainLoop: Бесконечный цикл state MainLoop { [*] --> IdleCheck: Проверка бездействия IdleCheck --> KeyCheck: Проверка нажатия кнопок state KeyCheck <> KeyCheck --> KeyProcess: Кнопка нажата KeyCheck --> IdleCheck: Кнопка не нажата KeyProcess --> KeyChoice state KeyChoice < > KeyChoice --> EnterMode: Нажата * KeyChoice --> ProcessKey: Другие кнопки state ProcessKey < > ProcessKey --> CheckPass: Нажата # ProcessKey --> AddChar: Другие символы AddChar --> KeyCheck state CheckPass < > CheckPass --> OpenLock: Пароль верный CheckPass --> ChangePass: Секретный код A123 CheckPass --> WrongPass: Пароль неверный OpenLock --> LockAgain: Задержка 3 сек LockAgain --> KeyCheck ChangePass --> KeyCheck WrongPass --> KeyCheck } note right of MainLoop Звездочка (*) - вход в режим ввода Решетка (#) - подтверждение ввода Другие кнопки - символы пароля end note
Инициализация
Основной Цикл
Программа входит в бесконечный цикл loop() и постоянно выполняет следующие действия:
Обработка Ввода
Состояние Ожидания
Если нажата *, система переходит в режим ввода пароля.
Состояние Ввода Пароля
После ввода кнопка # завершает ввод, система проверяет пароль.
Состояние Смены Пароля
Активируется при вводе секретной комбинации "A123".
Ключевые моменты в коде
Первый закон программирования: если код работает с первого раза – ты что-то делаешь не так. Второй закон: Ctrl+Z – твой лучший друг.
Монтаж Замка на Шкафчик и Финальное Подключение
Теперь самый ответственный этап – установка замка и соединение его с нашим блоком управления.
flowchart TB subgraph LOCK["Установка Замка"] direction TB SELECT["Выбор места
расположения"] INSTALL["Физический монтаж
замка и защелки"] CONNECT["Подключение
кабеля"] end subgraph CONTROL["Блок Управления"] BOX["Коробка с
электроникой"] MOSFET["MOSFET
модуль"] end SELECT --> INSTALL INSTALL --> CONNECT MOSFET --> |"Двужильный
провод"| CONNECT BOX --- MOSFET classDef control fill:#9cf,stroke:#333,stroke-width:2px classDef lock fill:#fc9,stroke:#333,stroke-width:2px classDef action fill:#f9f,stroke:#333,stroke-width:1px class CONTROL control class LOCK lock class SELECT,INSTALL,CONNECT,MOSFET action
Выбор Места
Определи, где на дверце шкафчика и на его корпусе будет установлен электромеханический замок ZK-ZNS14 и его ответная часть (защелка).
Монтаж Замка
Закрепи замок и его ответную часть на шкафчике. Возможно, понадобится сделать отверстия или небольшие выборки в материале шкафчика.
Подключение к Блоку Управления
Последний шаг – соединение электромеханизма с нашей электроникой.

Боевое Крещение – Тестируем Замок!
Инструкция для Агента 007 по работе с его новым гаджетом:
sequenceDiagram actor User as Агент 007 participant KeyPad as Клавиатура participant Arduino as Контроллер participant Display as LCD Дисплей participant Lock as Замок Note over User,Lock: Базовая последовательность разблокировки User->>Arduino: Вставляет аккумулятор Arduino->>Display: "Welcome!" User->>KeyPad: Нажимает "*" KeyPad->>Arduino: Сигнал "*" Arduino->>Display: "Enter password:" User->>KeyPad: Вводит "1234" KeyPad->>Arduino: Сигналы "1","2","3","4" Arduino->>Display: "****" User->>KeyPad: Нажимает "#" KeyPad->>Arduino: Сигнал "#" Arduino->>Display: "Password correct" Arduino->>Lock: Открывает (HIGH) Note over Lock: Замок открыт Note over Lock: Через 3 секунды Arduino->>Lock: Закрывает (LOW) Arduino->>Display: "Locked" Arduino->>Display: "Welcome!" Note over User,Lock: Смена пароля User->>KeyPad: Нажимает "*" User->>KeyPad: Вводит "A123" User->>KeyPad: Нажимает "#" Arduino->>Display: "Enter new pass:" User->>KeyPad: Вводит новый пароль User->>KeyPad: Нажимает "#" Arduino->>Display: "Password changed"
Включение
Разблокировка
Смена Шифра
Экономия Энергии
Если 20 секунд ничего не нажимать, подсветка дисплея погаснет.
Нажатие любой кнопки ее разбудит.


Человеческий мозг – странная штука. Мы можем помнить текст песни 20-летней давности, но забыть пароль, который сменили вчера. Запиши новый пароль где-нибудь... но не на стикере на самом шкафу!
Arduino сохраняет пароль в EEPROM – это как флешка внутри микроконтроллера. Пароль не исчезнет, даже если выключить питание (вынуть аккумулятор). Очень удобно!
Что-то Пошло Не Так? Разбор Полетов!
Даже у лучших шпионов бывают проколы. Не паникуй, диагностируем!
Типичные проблемы и их решение:
- Проверь заряд аккумулятора через TP4056.
- Проверь 5V на выходе DC-DC мультиметром.
- Проверь подключение замка к клеммам MOSFET модуля.
- Проверь подключение MOSFET модуля: SIG к D10, VCC/GND управления к 5V/GND, VIN+/GND силовые к 5V/GND от DC-DC.
- Слышен ли "пик" зуммера при введении верного пароля? Если да, сигнал на D10, вероятно, идет, проблема в силовой части или замке.
- Проверь подключение I2C: GND, VCC(5V!), SDA(A4), SCL(A5). Пайка надежна?
- Правильный ли I2C адрес в скетче (0x27)? Запусти I2C Scanner, чтобы проверить.
- Включается ли подсветка при нажатии кнопок? Если нет - проблема с питанием LCD или самого LCD.
- Проверь надежность подключения шлейфа к разъему и разъема к плате.
- Убедись, что пины рядов (D6-D9) и столбцов (A0-A3) в скетче соответствуют физическому подключению.
- Проверь подключение к D13 и GND. Полярность для пассивного зуммера обычно не важна, для активного - важна (ищи метку '+').
- Не занят ли пин D13 чем-то другим?
- Проверь питание 5V и GND на самой Nano.
- Попробуй прошить простой скетч Blink.
Если ничего не помогает, попробуй классическое "выключить и включить". В 50% случаев работает. В других 50% – делает только хуже, но это уже другая история!
Вывод: Миссия Выполнена!
Поздравляю, Агент! Ты только что создал не просто замок, а настоящую электронную крепость для своих секретов! Теперь шкаф – это надежный тайник, куда без кода – ни ногой! Ты прокачал свои навыки в электронике, пайке, программировании и конспирации. Этот проект – отличная база для будущих, еще более крутых гаджетов.

Главное теперь – не забыть пароль после празднования успешного завершения миссии. А то следующая операция будет называться "Как взломать собственный суперзамок с помощью лома и чьей-то мамы".
© 2025 Мій Проект. Автор: Jazzzman. Использование материалов разрешено только с ссылкой на источник.
Написать комментарий