Зміст
- Вступ
- Для кого ця надсекретна місія?
- Арсенал Агента: Що нам знадобиться?
- Крок 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 та клавіатури) на макетній платі. Подумай, як їх розмістити компактно, щоб дроти були якомога коротшими. Пам'ятай про місце для підведення живлення (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.h> // Стандартна бібліотека Arduino (для millis() тощо) #include <Keypad.h> // Для роботи з матричною клавіатурою 4x4 #include <EEPROM.h> // Для збереження пароля в енергонезалежній пам'яті Arduino #include <Wire.h> // Необхідна для комунікації по шині I2C #include <LiquidCrystal_I2C.h> // Спеціальна бібліотека для роботи з 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 <<choice>> KeyCheck --> KeyProcess: Кнопка натиснута KeyCheck --> IdleCheck: Кнопка не натиснута KeyProcess --> KeyChoice state KeyChoice <<choice>> KeyChoice --> EnterMode: Натиснуто * KeyChoice --> ProcessKey: Інші кнопки state ProcessKey <<choice>> ProcessKey --> CheckPass: Натиснуто # ProcessKey --> AddChar: Інші символи AddChar --> KeyCheck state CheckPass <<choice>> 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. Використання матеріалів дозволено лише з посиланням на джерело.
Написати коментар