Электронный замок на Arduino с клавиатурой и пользовательским кодом
Компоненты и материалы
| Компонент | Количество | Примечание |
|---|---|---|
| Arduino UNO | 1 | |
| Матричная клавиатура 4x4 | 1 | Можно 3x4 с изменениями в коде |
| Кнопка (для открытия изнутри) | 1 | С подтягивающим резистором |
| LCD I2C (16x2) | 1 | Адрес 0x27 (проверьте сканером) |
| Соленоидный замок (12V) | 1 | Вариант 1 |
| МОП-транзистор IRF510N | 1 | Для управления соленоидом |
| Релейный модуль 1 канал | 1 | Вариант 2 (вместо соленоида) |
Инструменты
- Макетная плата 170 контактов
- Набор перемычек 5 см
- Блок питания 12V (для соленоида/замка)
О проекте
Классический проект электронного замка с клавиатурой, LCD-дисплеем и возможностью смены кода пользователем (код хранится в EEPROM). Два варианта исполнительного механизма: соленоид (через МОП-транзистор) или релейный модуль (универсальнее, может управлять любым замком до 250V AC). Кнопка внутри позволяет открыть дверь без кода.
Принцип работы соленоида
Соленоид 12V управляется через IRF510N (N-канал). При 5V на Gate транзистор открывается, замыкая цепь соленоида. Резистор на Gate не нужен. При низком уровне — транзистор закрыт.
Принцип работы реле
Реле управляется так же, но логика инвертирована: LOW — включено, HIGH — выключено (зависит от модуля). Реле позволяет коммутировать нагрузку до 250V AC.
Алгоритм (блок-схема)
Основные состояния: ожидание → ввод кода (*) → проверка → открытие / ошибка. Смена кода (#) → ввод старого кода → ввод нового кода дважды → сравнение → сохранение в EEPROM.
Важные нюансы кода
- При первой загрузке код по умолчанию
6601. Раскомментируйте строки чтения из EEPROM (вsetup()) и перезагрузите скетч — это делается один раз. - Длина кода определяется массивом
code[]. Можно изменить длину, поменяв начальный массив в коде (нельзя просто так сменить 4-значный на 6-значный без перепрошивки). - Для подтверждения ввода кода используется клавиша 'A' (на 4x4). На 3x4 замените на '*' или '#'.
Тестирование
На фото показан процесс: ввод кода, смена кода, открытие кнопкой изнутри. Работает стабильно как с соленоидом, так и с реле.
Код для соленоида (Keypad_doorlock_solenoid.ino)
/* Работает с Keypad 4x4, LCD I2C, IRF510N, кнопкой
* Открытие по коду или кнопке изнутри
* Код меняется с клавиатуры, хранится в EEPROM
*/
#include <Keypad.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#define SOLENOID 11 // Gate транзистора
#define O_BUTTON 10 // Кнопка внутри
#define I2C_ADDR 0x27
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
const byte ROWS = 4, COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {9,8,7,6};
byte colPins[COLS] = {5,4,3,2};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);
char code[] = {'6','6','0','1'}; // Код по умолчанию
char code_buff1[sizeof(code)];
char code_buff2[sizeof(code)];
short a=0, i=0, s=0, j=0;
void setup() {
lcd.begin(16,2);
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
lcd.setBacklight(HIGH);
lcd.home(); lcd.print("Standby");
pinMode(SOLENOID, OUTPUT);
pinMode(O_BUTTON, INPUT);
// Первая загрузка: закомментируйте следующий блок, загрузите, раскомментируйте, загрузите снова
// for(i=0; i<sizeof(code); i++) EEPROM.get(i, code[i]);
}
void loop() {
char key = keypad.getKey();
if (key == '*') { // Ввод кода
lcd.clear(); lcd.setCursor(0,0); lcd.print("Enter code");
getCode();
if (a == sizeof(code)) openDoor();
else { lcd.clear(); lcd.print("Wrong"); }
delay(2000); lcd.clear(); lcd.print("Standby");
}
if (key == '#') { // Смена кода
changeCode();
lcd.clear(); lcd.print("Standby");
}
if (digitalRead(O_BUTTON) == HIGH) { // Кнопка внутри
digitalWrite(SOLENOID, HIGH);
delay(3000);
digitalWrite(SOLENOID, LOW);
}
}
void getCode() {
i=0; a=0; j=0;
while (key != 'A') {
key = keypad.getKey();
if (key != NO_KEY && key != 'A') {
lcd.setCursor(j,1); lcd.print("*");
j++;
if (key == code[i] && i < sizeof(code)) { a++; i++; }
else a--;
}
}
key = NO_KEY;
}
void changeCode() {
lcd.clear(); lcd.print("Changing code"); delay(1000);
lcd.clear(); lcd.print("Enter old code");
getCode();
if (a == sizeof(code)) {
lcd.clear(); lcd.print("Changing code");
getNewCode1(); getNewCode2();
s=0;
for(i=0; i<sizeof(code); i++) if (code_buff1[i]==code_buff2[i]) s++;
if (s == sizeof(code)) {
for(i=0; i<sizeof(code); i++) { code[i]=code_buff2[i]; EEPROM.put(i, code[i]); }
lcd.clear(); lcd.print("Code Changed"); delay(2000);
} else { lcd.clear(); lcd.print("Codes not matching"); delay(2000); }
} else { lcd.clear(); lcd.print("Wrong"); delay(2000); }
}
void getNewCode1() {
i=0; j=0;
lcd.clear(); lcd.print("Enter new code"); lcd.setCursor(0,1); lcd.print("and press A"); delay(2000);
lcd.clear(); lcd.setCursor(0,1); lcd.print("and press A");
while (key != 'A') {
key = keypad.getKey();
if (key != NO_KEY && key != 'A') {
lcd.setCursor(j,0); lcd.print("*"); code_buff1[i]=key; i++; j++;
}
}
key = NO_KEY;
}
void getNewCode2() {
i=0; j=0;
lcd.clear(); lcd.print("Confirm code"); lcd.setCursor(0,1); lcd.print("and press A"); delay(3000);
lcd.clear(); lcd.setCursor(0,1); lcd.print("and press A");
while (key != 'A') {
key = keypad.getKey();
if (key != NO_KEY && key != 'A') {
lcd.setCursor(j,0); lcd.print("*"); code_buff2[i]=key; i++; j++;
}
}
key = NO_KEY;
}
void openDoor() {
lcd.clear(); lcd.print("Welcome");
digitalWrite(SOLENOID, HIGH); delay(3000); digitalWrite(SOLENOID, LOW);
}
Код для реле (Keypad_doorlock_relay.ino)
Аналогичен предыдущему, отличие только в управлении реле (инвертированная логика):
#define RELAY 11
// ... в openDoor() и кнопке:
digitalWrite(RELAY, LOW); delay(3000); digitalWrite(RELAY, HIGH);
// при нажатии кнопки:
digitalWrite(RELAY, LOW); delay(3000); digitalWrite(RELAY, HIGH);
Схемы подключения
Две схемы: для соленоида (через IRF510N) и для реле. Обе включают клавиатуру, LCD I2C, кнопку, питание 12V для замка.
Производственный процесс
- Внутри банковских хранилищ: история, дизайн и будущее безопасности
- Создание умного автозамка двери с использованием Bluetooth-близости смартфона
- Многопозиционная система датчиков температуры для интеграции в умный дом
- MotionSense: умная система обнаружения проникновения на Arduino и ESP8266
- Пожарная безопасность 3D-принтера: умная система обнаружения дыма
- Электронный кодовый замок на Arduino с клавиатурой и линейным приводом
- Веб-управляемый IoT-индикатор на Arduino, Yaler и IFTTT
- Магнитная левитация на отталкивании с Arduino: Простая схема и DIY-руководство
- Продвинутый дистанционно управляемый манипулятор-робот для точной работы
- CoroFence: термический детектор на GridEye + PIR с IoT