基于 Arduino 的无钥匙门锁系统——LCD 显示与 4×4 键盘
项目简介
本项目实现一个无钥匙门锁系统:通过 4×4 矩阵键盘输入密码,16×2 LCD 显示交互信息,正确密码驱动继电器控制直流电子锁开门。默认密码为“1234”,支持通过“#”键修改密码,新密码掉电保存在 EEPROM 中。

所需组件
- Arduino UNO
- 4×4 矩阵键盘(带 LED 兼容接口)
- 16×2 字符 LCD(白字蓝底)
- 直流电子锁(7–12V 工作电压)
- 继电器模块(单路)
- 9V 电池(为电子锁供电)
- 10kΩ 电位器(调节 LCD 对比度)
- 220Ω 电阻(LCD 背光限流)
工作原理
- 按键输入与 EEPROM 存储的初始密码“1234”比对。
- 匹配成功:LCD 显示“Pass Accepted”,继电器吸合(低电平有效),电子锁开锁 2 秒后自动上锁。
- 匹配失败:LCD 显示“Wrong Password”,提示按“#”修改密码。
- 按“#”键进入修改流程:先验证当前密码,正确后输入新密码并写入 EEPROM。
接线指南
4×4 键盘接线
键盘前 6 脚接 Arduino A0–A5,后 2 脚接数字引脚 3 和 2。
LCD 接线(16 脚并口)
| LCD 引脚 | 功能 | Arduino 连接 |
|---|---|---|
| 1 | VSS | GND |
| 2 | VDD | 5V |
| 3 | V0(对比度) | 10kΩ 电位器中间脚,两侧接 5V 和 GND |
| 4 | RS | D7 |
| 5 | R/W | GND |
| 6 | E | D6 |
| 11 | D4 | D5 |
| 12 | D5 | D4 |
| 13 | D6 | D3 |
| 14 | D7 | D2 |
| 15 | 背光阳极 | 5V 经 220Ω 电阻 |
| 16 | 背光阴极 | GND |
电子锁驱动电路
电子锁工作电压 7–12V,不可直连 Arduino。使用继电器隔离:
- 继电器信号脚接 Arduino D10
- 继电器公共端(COM)接 9V 电池负极
- 继电器常开端(NO)接电子锁一端
- 电子锁另一端接 9V 电池正极
- 继电器线圈供电可接 Arduino 5V/GND
完整代码
#include <Keypad.h>
#include <LiquidCrystal.h>
#include <EEPROM.h>
LiquidCrystal lcd(9, 8, 7, 6, 5, 4); // RS, E, D4, D5, D6, D7
char password[4];
char initial_password[4], new_password[4];
int i = 0;
int relay_pin = 10;
char key_pressed = 0;
const byte rows = 4, columns = 4;
char hexaKeys[rows][columns] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte row_pins[rows] = {A0, A1, A2, A3};
byte column_pins[columns] = {A4, A5, 3, 2};
Keypad keypad = Keypad(makeKeymap(hexaKeys), row_pins, column_pins, rows, columns);
void setup() {
pinMode(relay_pin, OUTPUT);
lcd.begin(16, 2);
lcd.print(" DIYhacking.com");
lcd.setCursor(0,1); lcd.print("Electronic Lock ");
delay(2000);
lcd.clear(); lcd.print("Enter Password");
lcd.setCursor(0,1);
initialpassword(); // 初始化 EEPROM 默认密码 1234
}
void loop() {
digitalWrite(relay_pin, HIGH); // 继电器默认断开(锁定)
key_pressed = keypad.getKey();
if(key_pressed == '#') change();
if(key_pressed) {
password[i++] = key_pressed;
lcd.print(key_pressed);
}
if(i == 4) {
delay(200);
for(int j=0;j<4;j++) initial_password[j] = EEPROM.read(j);
if(!(strncmp(password, initial_password, 4))) {
lcd.clear(); lcd.print("Pass Accepted");
digitalWrite(relay_pin, LOW); // 开锁
delay(2000);
lcd.setCursor(0,1); lcd.print("Pres # to change");
delay(2000);
lcd.clear(); lcd.print("Enter Password:"); lcd.setCursor(0,1);
i = 0;
} else {
digitalWrite(relay_pin, HIGH);
lcd.clear(); lcd.print("Wrong Password");
lcd.setCursor(0,1); lcd.print("Pres # to Change");
delay(2000);
lcd.clear(); lcd.print("Enter Password"); lcd.setCursor(0,1);
i = 0;
}
}
}
void change() {
int j = 0;
lcd.clear(); lcd.print("Current Password"); lcd.setCursor(0,1);
while(j < 4) {
char key = keypad.getKey();
if(key) { new_password[j++] = key; lcd.print(key); }
}
delay(500);
if(strncmp(new_password, initial_password, 4)) {
lcd.clear(); lcd.print("Wrong Password");
lcd.setCursor(0,1); lcd.print("Try Again"); delay(1000);
} else {
j = 0;
lcd.clear(); lcd.print("New Password:"); lcd.setCursor(0,1);
while(j < 4) {
char key = keypad.getKey();
if(key) { initial_password[j] = key; lcd.print(key); EEPROM.write(j, key); j++; }
}
lcd.print("Pass Changed"); delay(1000);
}
lcd.clear(); lcd.print("Enter Password"); lcd.setCursor(0,1);
key_pressed = 0;
}
void initialpassword() {
for(int j=0;j<4;j++) EEPROM.write(j, j+49); // 写入 '1','2','3','4'
for(int j=0;j<4;j++) initial_password[j] = EEPROM.read(j);
}
代码要点解析
库引入
#include <Keypad.h>
#include <LiquidCrystal.h>
#include <EEPROM.h>
Keypad.h 处理矩阵键盘扫描,LiquidCrystal.h 驱动 16×2 LCD,EEPROM.h 实现密码掉电保存。
主循环按键处理
key_pressed = keypad.getKey();
if(key_pressed == '#') change();
检测到“#”键即进入修改密码流程。
密码输入与比对
if(key_pressed) { password[i++] = key_pressed; lcd.print(key_pressed); }
if(i == 4) {
for(int j=0;j<4;j++) initial_password[j] = EEPROM.read(j);
if(!(strncmp(password, initial_password, 4))) { ... }
}
连续读取 4 位按键存入 password 数组,随后从 EEPROM 读取基准密码,用 strncmp 比对。匹配则开锁,否则报错。
修改密码流程
void change() {
// 1. 提示输入当前密码
// 2. 比对当前密码
// 3. 正确则提示输入新密码,逐字符写入 EEPROM 并更新 initial_password
}
双重验证机制确保只有知晓当前密码者才能修改。
原理图
另附 Fritzing 版原理图,展示电磁锁由继电器控制的完整接线。

制造工艺
- Arduino Nano 与 MPU-6050 构建实时陀螺仪游戏
- 基于 Arduino 与 Python 的可靠 RFID 考勤系统
- DHT11 温湿度传感器项目:LED 指示与压电蜂鸣器报警
- Arduino UNO 驱动 16x2 LCD 实现动画与小游戏
- Unopad:基于 Arduino 的无缝 Ableton Live MIDI 控制器
- Arduino + DHT11 + 以太网盾板温湿度数据记录仪
- 自制简易红外避障传感器:IR LED + 光电二极管 + Arduino
- 用 Arduino Uno 和 1Sheeld 构建 4x4x4 LED 立方体 - 互动音乐可视化项目
- Arduino 高速转速计 - 单次检测算法实测 6.5MHz 级响应,红外 + 红激光方案
- 基于 Arduino 与 Google Sheets 的实时 RFID 考勤系统
- 智能无钥匙门锁:Arduino + Android 蓝牙密码控制舵机开锁
- Arduino Modbus 从机开发全攻略:基于 RS485 扩展板的分步实现指南