亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

基于 Arduino 的无钥匙门锁系统——LCD 显示与 4×4 键盘

项目简介

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

基于 Arduino 的无钥匙门锁系统——LCD 显示与 4×4 键盘

所需组件

工作原理

  1. 按键输入与 EEPROM 存储的初始密码“1234”比对。
  2. 匹配成功:LCD 显示“Pass Accepted”,继电器吸合(低电平有效),电子锁开锁 2 秒后自动上锁。
  3. 匹配失败:LCD 显示“Wrong Password”,提示按“#”修改密码。
  4. 按“#”键进入修改流程:先验证当前密码,正确后输入新密码并写入 EEPROM。

接线指南

4×4 键盘接线

键盘前 6 脚接 Arduino A0–A5,后 2 脚接数字引脚 3 和 2。

LCD 接线(16 脚并口)

LCD 引脚功能Arduino 连接
1VSSGND
2VDD5V
3V0(对比度)10kΩ 电位器中间脚,两侧接 5V 和 GND
4RSD7
5R/WGND
6ED6
11D4D5
12D5D4
13D6D3
14D7D2
15背光阳极5V 经 220Ω 电阻
16背光阴极GND

电子锁驱动电路

电子锁工作电压 7–12V,不可直连 Arduino。使用继电器隔离:

完整代码

#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 的无钥匙门锁系统——LCD 显示与 4×4 键盘

制造工艺

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