Содержание
- Введение
- Для кого эта сверхсекретная миссия?
- Арсенал Агента: Что нам понадобится?
- Шаг 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. Использование материалов разрешено только с ссылкой на источник.
Написать комментарий