Каталог товаров
Клиенту
Тема сайта:
+38 (066) 305-77-25
Наш адрес
Харьков, времено - только доставка Новой Почтой, УкрПочтой, МистЕкспрес, ROZETKA Delivery
Телефоны:
Время работы
  • Пн-Пт: с 9 до 18
  • Сб.: с 10 до 17
  • Вс: с 11 до 16
E-mail
Мы в соцсетях
Перейти в контакты
0 0
Каталог
Главная
Закладки
0
Сравнить
0
Контакты

Операция "Неприступный Шкаф"

Чи була корисною ця стаття?
Операция "Неприступный Шкаф"

Содержание

Операция "Неприступный Шкаф": Создаем Сверхсекретный Тайник с Электронным Замком для Юного Агента!

Привет, коллеги-шифровальщики и будущие мастера тайных операций! Сегодня мы не просто мастерим – мы воплощаем мечту каждого десятилетнего (и, чего греха таить, взрослого) шпиона: создаем собственный неприступный шкаф! Представьте: ваш ребенок – Агент 007, и его шкаф – это не просто место для носков, а настоящий сейф для самых ценных артефактов. Секретные чертежи, конфискованные у младшего брата конфеты, планы захвата мира (или хотя бы школьного буфета) – все под надежным кодовым замком! И самое крутое – пароль можно менять на лету, прямо с клавиатуры. Никаких скучных ключей, только хардкор, только цифры!

Для этой секретной миссии нам понадобится не просто энтузиазм, а арсенал настоящего гаджетостроителя. Готовы? Тогда заряжайте паяльники, надевайте защитные очки (потому что искры вдохновения могут быть опасны) и погнали!

Электронный шкаф с кодовым замком
Наш будущий шпионский тайник

Интересный факт: Гениальность часто кроется в ресайклинге! Обычная картонная коробка из-под телефона становится идеальным корпусом для блока управления нашим электронным замком. Это доказывает: чтобы создавать крутые гаджеты, не нужна лаборатория МИ-6, достаточно желания, кучи компонентов и верной коробки!

Интересный факт: Первые электронные замки были похожи на чемоданы из фильмов о шпионах 70-х – громоздкие и дорогие. А наш замок будет компактным, стильным и собранным из деталей, доступных даже без бюджета МИ-6! Мы сделаем его за вечер, а уровень крутости будет зашкаливать!

Для кого эта сверхсекретная миссия?

Этот проект – идеальное задание для юного инженера 10+ лет, который мечтает о собственном уголке, куда "вход только по пропускам". Это не просто игрушка, это настоящий учебный полигон! Ваш ребенок (под вашим чутким руководством, конечно) узнает:

  • Как работает "мозг" операции – микроконтроллер Arduino Nano.
  • Как превратить нажатия кнопок на клавиатуре 4x4 в секретный код.
  • Зачем нужен LCD дисплей 1602 (спойлер: чтобы видеть, что происходит, и хвастаться перед друзьями).
  • Как заставить электронный замок ZK-ZNS14 слушаться команд.
  • Почему MOSFET модуль – это круче маленького транзистора (особенно когда надо "открыть шлюзы" для замка).
  • Как организовать автономное питание с помощью аккумулятора 18650, модуля зарядки TP4056 и повышающего преобразователя.
  • И главное – как аккуратно все это спаять на макетной плате, чтобы оно не только работало, а и выглядело как настоящий шпионский гаджет!

Это также отличная возможность провести время вместе, передать свои навыки пайки (или научиться вместе!) и создать что-то действительно уникальное.

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

Арсенал Агента: Что нам понадобится?

Компоненты для проекта
Арсенал технических компонентов

Сверяем наш чемоданчик юного шпиона-инженера:

Мозговой Центр: Плата разработчика Nano V3.0 ATmega328P Type-C – Наш главный герой, маленький, но мощный. Type-C – это современно и удобно!
Энергетическое Ядро:
Интерфейс Ввода: Клавиатура мембранная 4х4 – Наша панель доступа. Здесь рождаются секретные коды!
Визуальный Контакт: LCD 1602 Дисплей IIC/I2C Синий – Показывает статус операции: "Введите пароль", "Доступ разрешен" или грозное "Попробуй еще, хакер!". I2C версия – меньше проводов, больше порядка!
Исполнительный Механизм: Замок электромеханический ZK-ZNS14 врезной – Наш надежный страж. Щелкает только для своих.
Силовой Ключ: Модуль Силового Ключа на Двух MOSFET AOD4184 – Этот парень – настоящий "вышибала" для тока. Он легко управляет замком по команде от слабого сигнала Arduino, не перегреваясь и не жалуясь. Намного надежнее маленького транзистора для таких задач!
Полигон для Сборки: Макетная плата для пайки двусторонняя 80х60 мм – Здесь мы создадим наш шедевр. Никаких соплей из проводов – только надежные паяные соединения!
Соединительные Ткани: Провода для пайки (разных цветов – это важно для порядка!), припой, флюс.
Инструменты: Паяльник (с тонким жалом – наш главный инструмент!), кусачки, инструмент для зачистки проводов, мультиметр (очень желательно, для проверки напряжения и соединений), термоусадка (для изоляции).

Энергетический Блок – Обеспечиваем Автономность

Прежде чем командовать замком, надо дать нашей системе "поесть". Собираем систему питания – это основа основ!

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
1

Зарядка и Аккумулятор

Припаяй провода от батарейного отсека к контактам B+ и B- на модуле зарядки TP4056.

! Не перепутай полярность – красный на +, черный на -! Сам аккумулятор пока не вставляй.
2

Повышаем Напряжение

OUT+ VIN+ повышающего модуля DC-DC
OUT- VIN- повышающего модуля DC-DC
Полярность очень важна! Проверь дважды перед подключением!
3

Настройка 5V

  1. Временно подключи модуль TP4056 к USB-зарядке (без аккумулятора).
  2. На выходе Boost Converter (OUT+ и OUT-) должно появиться напряжение.
  3. Возьми мультиметр и сними перемычки "А" и "В" на плате Boost Converter. Этот режим отвечает за 5 вольт. Проверь выходное напряжение - должно быть значение близкое к 5V
Это будет питание для нашего Arduino и всей логики.
4

Готово!

Теперь у нас есть стабильные 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
+
-
🔌
TP4056
Type-C
B+
B-
🔌
TP4056
Type-C
OUT+
OUT-
DC-DC Boost
Converter
VIN+
VIN-
DC-DC Boost
Converter
OUT+
OUT-
+5V Шина Питания
GND Шина (Земля)
📝 Перед подключением других компонентов настройте выходное напряжение на 5V с помощью потенциометра на модуле и мультиметра, или перепаяв соответствующую перемычку

B. Питание Компонентов (Внутри Блока Управления)

+5V Шина Питания
GND Шина (Земля)
🧠
Arduino Nano
5V
GND
🖥️
LCD 1602 I2C
VCC
GND
🔌
MOSFET Модуль
VCC (управление)
GND (управление)
VIN+ (силовое)
GND (силовое)
🔊
Зуммер
GND
Сигнал

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

Схема пинов Arduino Nano
Цифровые пины
D6 - Клавиатура Ряд 1 D7 - Клавиатура Ряд 2 D8 - Клавиатура Ряд 3 D9 - Клавиатура Ряд 4 D10 - MOSFET SIG D13 - Зуммер
Аналоговые пины
A0 - Клавиатура Столбец 1 A1 - Клавиатура Столбец 2 A2 - Клавиатура Столбец 3 A3 - Клавиатура Столбец 4 A4 - LCD SDA A5 - LCD SCL

D. Подключение Нагрузки (Внешний Замок)

🔌
MOSFET Модуль
OUT+
OUT-
Длинный провод
Длинный провод
🔒
Электромеханический
Замок ZK-ZNS14
Контакт 1
Контакт 2
📝 Полярность для этого типа замка обычно не важна.
Схема подключения модулей

Если на выходе не 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
1

Планирование

Разложи компоненты (Nano, MOSFET модуль, разъемы для LCD и клавиатуры) на макетной плате. Подумай, как их разместить компактно, чтобы провода были как можно короче. Помни о местеMight для подвода питания (5V и GND от буст-конвертера) и вывода проводов к замку.

2

Паяем Мозг (Nano)

Припаяй Arduino Nano к плате. Можно использовать гребенки (pin headers), чтобы плату можно было снять, если что-то пойдет не так.

3

Паяем Дисплей (I2C LCD)

Дисплей I2C – это просто сказка! Всего 4 провода:

GND GND на Nano
VCC 5V (с выхода буст-конвертера)
SDA пин A4 на Nano
SCL пин A5 на Nano

Припаяй 4-пиновый разъем на плату, чтобы дисплей можно было легко подключить/отключить.

4

Паяем Клавиатуру

Клавиатура 4x4 имеет 8 выводов. Припаяй 8-пиновый разъем.

Ряды (сверху вниз):
пины D9, D8, D7, D6 на Nano (можно изменить в коде)
Столбцы (слева направо):
пины D5, D4, D3, D2 на Nano (тоже можно изменить)
Примечание: Можно использовать пины A0-A3, но лучше использовать цифровые пины, если есть свободные
5

Паяем Силовой Ключ (MOSFET Module)

Этот модуль будет управлять замком.

Управление: SIG к D10
Силовое питание: VIN+, GND к выходу DC-DC конвертера
! К выходным клеммам MOSFET модуля (OUT +/-) припаиваем длинный двухжильный провод, который потом пойдет к электромеханическому замку на шкафчике. Оставьте достаточную длину!
6

Разводка Питания

Аккуратно разведи дорожки 5V и GND от выхода буст-конвертера ко всем компонентам, которым они нужны (Nano, LCD, MOSFET-логика). Используй провода потолще для силовых линий (к MOSFET и замку).

7

Готовим Корпус (Коробку)

✂️
Вырезаем Отверстия: Делаем аккуратные отверстия в крышке коробки для LCD дисплея и клавиатуры.
🔌
Отверстие для Зарядки: Делаем отверстие для доступа к Type-C порту модуля TP4056.
🔄
Отверстие для Провода Замка: Делаем отверстие для вывода наружу длинного провода, идущего от 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).
  // Эта функция вызывается только при реальном изменении пароля, что является правильным подходом.
}
Скетч Arduino
Программный код для Arduino

Видишь строку 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
      
🚀
Инициализация
1
Старт: При подаче питания (вставке аккумулятора) или перезагрузке Arduino выполняется функция setup().
2
Настройка Пинов: Пины lockPin (D10, для управления MOSFET-модулем замка) и buzzerPin (D13, для зуммера) настраиваются как выходы (OUTPUT).
3
Начальное Состояние Замка: На lockPin сразу подается низкий уровень (LOW), гарантируя, что замок будет закрыт при старте системы.
4
Инициализация Дисплея: LCD дисплей инициализируется (lcd.init()), включается его подсветка (lcd.backlight()), и на нем появляется приветственное сообщение "Welcome!".
5
Загрузка Пароля: Вызывается функция loadPassword(). Она пытается прочитать сохраненный пароль из памяти EEPROM.
6
Таймер Активности: Запоминается текущее время (millis()) в переменную lastActivityTime. Это нужно для функции автоматического выключения подсветки.
🔄
Основной Цикл

Программа входит в бесконечный цикл loop() и постоянно выполняет следующие действия:

1
Проверка Бездействия: Каждую итерацию цикла проверяется, не прошло ли 20 секунд с момента последнего нажатия кнопки. Если прошло, подсветка дисплея выключается для экономии энергии.
2
Ожидание Нажатия: Программа проверяет, была ли нажата какая-то кнопка на клавиатуре. Если ничего не нажато, цикл просто повторяется.
3
Реакция на Нажатие: Если любая кнопка нажата, включается подсветка, обновляется время последней активности, выдается короткий звуковой сигнал.
⌨️
Обработка Ввода
⏱️
Состояние Ожидания

Если нажата *, система переходит в режим ввода пароля.

🔑
Состояние Ввода Пароля

После ввода кнопка # завершает ввод, система проверяет пароль.

🔄
Состояние Смены Пароля

Активируется при вводе секретной комбинации "A123".

📝
Ключевые моменты в коде
📚
Библиотеки: Wire.h (для I2C), LiquidCrystal_I2C.h (для дисплея), Keypad.h (для клавиатуры), EEPROM.h (для сохранения пароля).
🔍
I2C Адрес: Найти правильный I2C адрес дисплея – часто 0x27 или 0x3F.
📌
Пины: Настроить пины клавиатуры и пин управления замком (D10) как OUTPUT.
🔓
Управление замком: Использовать digitalWrite(lockPin, HIGH) для открытия замка и digitalWrite(lockPin, LOW) через 3 секунды для закрытия.

Первый закон программирования: если код работает с первого раза – ты что-то делаешь не так. Второй закон: 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 и его ответная часть (защелка).

💡
Убедись, что элементы замка будут правильно смыкаться при закрытии дверцы. Используй карандаш для разметки!
🔨

Монтаж Замка

Закрепи замок и его ответную часть на шкафчике. Возможно, понадобится сделать отверстия или небольшие выборки в материале шкафчика.

🪚
Дрель / отвертка
📐
Линейка
✏️
Карандаш
📏
Шаблон (опционально)
Следуй инструкции к замку, если она есть. Разные модели могут иметь специфические требования к монтажу.
🔌

Подключение к Блоку Управления

Последний шаг – соединение электромеханизма с нашей электроникой.

1
Протяни длинный двужильный провод от блока управления (из коробки) к установленному замку.
2
Подключи концы этого провода к клеммам замка.
💡
Полярность обычно не важна для электромеханических замков этого типа!
Монтаж замка
Установка электронного замка на шкафчик

Боевое Крещение – Тестируем Замок!

Инструкция для Агента 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"
        
Пособие Агента для Работы с Гаджетом
🔌

Включение

Вставь аккумулятор в отсек. Система должна ожить, дисплей поприветствует "Welcome!", зуммер может коротко пикнуть.
🔓

Разблокировка

1
*
"Enter password:"
Зуммер пикнет один раз
2
1
2
3
4
****
Каждое нажатие – пик зуммера
3
#
"Password correct"
Длинный пик, щелчок замка!
4
"Locked" → "Welcome!"
Замок закроется через 3 сек
⚠️
Если пароль неверный:
"Wrong password"
Три коротких тревожных пика, затем "Welcome!"
🔄

Смена Шифра

1
*
"Enter password:"
2
A
1
2
3
****
Секретная комбинация!
3
#
"Enter new pass:"
4
Введи новый пароль
**...
До 16 символов
5
#
"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 чем-то другим?
Arduino "молчит" (нет приветствия, светодиоды не горят):
  • Проверь питание 5V и GND на самой Nano.
  • Попробуй прошить простой скетч Blink.

Если ничего не помогает, попробуй классическое "выключить и включить". В 50% случаев работает. В других 50% – делает только хуже, но это уже другая история!

Вывод: Миссия Выполнена!

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

Готовый проект
Сверхсекретный тайник готов к использованию

Главное теперь – не забыть пароль после празднования успешного завершения миссии. А то следующая операция будет называться "Как взломать собственный суперзамок с помощью лома и чьей-то мамы".

© 2025 Мій Проект. Автор: Jazzzman. Использование материалов разрешено только с ссылкой на источник.

Рекомендуемые товары
Похожие статьи
Моніторинг стану батареї з використанням JKBMS та TFT дисплея
Моніторинг стану батареї з використанням JKBMS та TFT дисплея
Блог, Инструкции Подключения и Обзоры
08 ноября 2024
Портативний міні-дебаггер I2C/SPI на Arduino Nano
Портативний міні-дебаггер I2C/SPI на Arduino Nano
Блог, Инструкции Подключения и Обзоры
05 декабря 2024
Живий чат
Живий чат