A
ARDUINO LABGUIDE

Выставка · проект 5

Электронный сейф с кодом

Клавиатура 4×4, экран LCD I2C, серво-защёлка SG90 и зуммер. Верный код — дверца открывается; неверный — писк и краткая блокировка. Библиотека Keypad из Library Manager.

дальше серво-защёлка клавиатура ~3–4 часа + печать

Оглавление

1. Цель

Шкатулка-сейф на столе. Гость вводит код на мембранной/кнопочной клавиатуре, на LCD видит звёздочки. «#» — проверить. Верно — серво открывает защёлку и короткий «успех»; неверно — отказ и пауза.

Критерий готовности: верный пароль (по умолчанию 1234) открывает защёлку; неверный даёт отказ на LCD + писк; после таймаута снова можно вводить; серво не дрожит в крайних положениях.

2. Подготовка

Программы

Инструменты

Компоненты

ЧтоКаталогСколько
Arduino Unoarduino-uno-r31
Клавиатура 4×4keypad-4x41
LCD 1602 + I2C-адаптерlcd-1602, i2c-lcd-adapter1
Серво SG90 (защёлка)servo-sg901
Зуммерbuzzer-tmb12a051
Тактовые кнопки (опционально «сброс»)tact-switches1
Макетка, проводаbreadboard-mb102, jumper-mf—
Клавиатура 4×4 LCD 1602

3. Распиновка (Uno → модуль)

У клавиатуры 4×4 обычно 8 выводов слева направо: 4 ряда (R0…R3), затем 4 столбца (C0…C3). Сверьте с modularным шлейфом — ориентация важна.

Пин UnoКудаПояснение
D2ряд 0 (R0)Keypad
D3ряд 1
D4ряд 2
D5ряд 3
D6столбец 0
D7столбец 1
D8столбец 2
D9столбец 3
D10сигнал сервоЗащёлка
D11зуммер
A4 / A5SDA / SCL LCDI2C
5 V / GNDVCC/GND LCD, серво, общие минусыОбщий GND
Если клавиши «съехали» (нажимаете 1 — приходит 4) — перепутаны ряды/столбцы: поправьте массивы rowPins/colPins или физический порядок проводов.

4. Сборка по шагам

Шаг 4.1

LCD I2C

VCC→5 V, GND→GND, SDA→A4, SCL→A5. Включите подсветку (джампер на адаптере, если есть). Адрес часто 0x27 или 0x3F.

✓ После заливки LCD показывает «Safe» / приглашение ввода
Шаг 4.2

Клавиатура

Восемь проводов по таблице. Пока без корпуса — удобнее отлаживать.

✓ Каждая клавиша 0–9, *, # даёт символ в Serial
Шаг 4.3

Серво-защёлка и зуммер

Серво D10, зуммер D11. Углы LOCKED/OPEN подберите так, чтобы рычаг не упирался в пластик.

✓ Без кода серво в «закрыто»; после верного кода уходит в «открыто»
Шаг 4.4

Библиотеки → Verify → Upload по согласию

Установите Keypad и LiquidCrystal_I2C. Скомпилируйте. Заливайте только после явного согласия.

✓ Код 1234 + # открывает; 0000 + # отказывает; * стирает ввод

5. Скетч (полный рабочий)

Смените SECRET перед выставкой. «*» — стереть, «#» — проверить. После трёх ошибок — пауза 5 секунд.

#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>

const char* SECRET = "1234";
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {2, 3, 4, 5};
byte colPins[COLS] = {6, 7, 8, 9};

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo latch;

const int PIN_SERVO = 10;
const int PIN_BUZZ  = 11;
const int ANGLE_LOCK = 20;
const int ANGLE_OPEN = 90;

String input;
int fails = 0;
unsigned long lockUntil = 0;

void beepOk() {
  tone(PIN_BUZZ, 1400, 80);
  delay(100);
  tone(PIN_BUZZ, 1800, 120);
}
void beepBad() {
  tone(PIN_BUZZ, 400, 400);
}

void showPrompt() {
  lcd.clear();
  lcd.print("Kod:");
  lcd.setCursor(0, 1);
  for (unsigned i = 0; i < input.length(); i++) lcd.print('*');
}

void setup() {
  pinMode(PIN_BUZZ, OUTPUT);
  latch.attach(PIN_SERVO);
  latch.write(ANGLE_LOCK);
  lcd.init();
  lcd.backlight();
  lcd.print("Safe gotov");
  delay(800);
  input = "";
  showPrompt();
  Serial.begin(115200);
}

void loop() {
  if (millis() < lockUntil) {
    return;
  }

  char k = keypad.getKey();
  if (!k) return;
  Serial.println(k);

  if (k == '*') {
    input = "";
    showPrompt();
    return;
  }

  if (k == '#') {
    if (input == SECRET) {
      lcd.clear();
      lcd.print("Otkyto");
      latch.write(ANGLE_OPEN);
      beepOk();
      fails = 0;
      delay(4000);
      latch.write(ANGLE_LOCK);
      input = "";
      showPrompt();
    } else {
      fails++;
      lcd.clear();
      lcd.print("Neverno");
      beepBad();
      delay(800);
      input = "";
      if (fails >= 3) {
        lcd.clear();
        lcd.print("Pauza 5s");
        lockUntil = millis() + 5000;
        fails = 0;
        delay(500);
      }
      showPrompt();
    }
    return;
  }

  if (input.length() < 8) {
    input += k;
    showPrompt();
  }
}

6. Печать на Bambu Lab P2S

Общий курс «с нуля» (Studio, отправка, качество): setup-bambu-p2s.html. Ниже — только детали ЭТОГО проекта.
Печатайте корпус после того, как схема на макетке уже работает.
Шаг 6.1

Какие детали печатаем

  • Основание шкатулки / сейфа.
  • Дверца с вырезом под клавиатуру 4×4 и (по желанию) окно под LCD 1602.
  • Карман под серво-защёлку SG90 (рычаг цепляет дверцу).
  • Канал для USB наружу.
Шаг 6.2

Модель: скачать или нарисовать простое

Путь A. Ищите: arduino safe box, keypad enclosure 4x4, servo latch box, LCD 1602 case.

Путь C (Tinkercad). Коробка + дверца. Вырезы: прямоугольник под клавиатуру и под LCD (замер модулей + 0,3…0,5 mm). Карман под серво; у защёлки зазор 0,5–1 mm — PLA чуть «плывёт». Петлю — нитка или винт M2–M3.

Шаг 6.3

Проект в Bambu Studio

Импорт STL → дверцу печатайте плашмя → PLA, 0.2 mm, заполнение 15–20%. Отправка — setup-bambu-p2s.html.

Шаг 6.4

Проверка качества

  • Вырез клавиатуры: модуль входит, кнопки не упираются в край
  • Окно LCD: экран читается, адаптер не выпирает
  • Карман серво: корпус серво сидит, рычаг ходит свободно
Шаг 6.5

Примерка без клея

Вставьте клавиатуру, LCD и серво «на сухую». Проверьте код 1234 + # на открытие без суперклея.

✓ Клавиатура и LCD сидят в вырезах; защёлка цепляет и отпускает дверцу

7. Скрипт демо

  1. «Это электронный сейф: пароль на клавиатуре, экран и защёлка на серво.»
  2. «Arduino сравнивает ввод с секретом в программе — как простой замок без интернета.»
  3. «Попробуйте код… (подскажите 1234 или сменённый). Решётка — ввод, звёздочка — стереть.»
  4. «Три ошибки — короткая блокировка. Дальше можно добавить RFID-карту вместо кода.»
На выставке смените пароль и напишите подсказку на табличке стенда — иначе очередь быстро «сожжёт» дефолт 1234.

8. Неисправности

СимптомЧто проверить
Клавиши не теПорядок row/col pins; ориентация шлейфа
LCD пустойАдрес 0x27/0x3F; SDA/SCL; контраст крутилкой на I2C
Нет Keypad.hLibrary Manager → Keypad установить
Защёлка не держитANGLE_LOCK/OPEN; рычаг соскакивает — подпилить модель
Сброс при сервоОбщий GND; ток серво с USB — обсудить 5 V отдельно

9. Безопасность

10. Что дальше

Следующий в каталоге выставки — турникет по RFID-карте (проект 6). Пока гайд RFID можно начать со сборки RC522 на 3.3 V и списка разрешённых карт.

← К списку проектов