Каталог товарів
Клієнту
Тема сайту:
+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 та клавіатури) на макетній платі. Подумай, як їх розмістити компактно, щоб дроти були якомога коротшими. Пам'ятай про місце для підведення живлення (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.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).
  // Ця функція викликається тільки при реальній зміні пароля, що є правильним підходом.
}
Скетч 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 <<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
      
🚀
Ініціалізація
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
Живий чат
Живий чат