基于 Arduino、键盘与线性执行器的密码门锁
组件与物料
| 组件 | 数量 | 备注 |
|---|---|---|
| Arduino UNO | 1 | |
| 4×4 薄膜矩阵键盘 | 1 | |
| L293D 双 H 桥驱动芯片 | 1 | |
| 12V 线性执行器 | 1 |
项目介绍
本项目实现一个基于密码的门锁:通过 4×4 矩阵键盘输入 4 位密码,正确则驱动线性执行器伸缩开锁。虽然网上已有类似教程,但作者尝试以更清晰方式讲解键盘扫描原理与密码验证逻辑。
键盘内部结构与扫描原理
矩阵键盘内部为 4 行 4 列按键,按下时对应行列短路。采用列输入上拉、行输出轮询低电平的扫描方式:依次拉低各行,读取列状态,若某列为低则判断对应按键按下。



代码 1:按键扫描 (无库版本)
手写扫描逻辑,便于理解及移植到不支持 Keypad 库的单片机 (如 STM32)。串口监视器实时显示按下的键值。
int rows=4; int columns=4;
#define c3 9 #define c2 8 #define c1 7 #define c0 6
#define r3 5 #define r2 4 #define r1 3 #define r0 2
void setup() {
Serial.begin(9600);
pinMode(c0,INPUT_PULLUP); pinMode(c1,INPUT_PULLUP);
pinMode(c2,INPUT_PULLUP); pinMode(c3,INPUT_PULLUP);
pinMode(r0,OUTPUT); pinMode(r1,OUTPUT);
pinMode(r2,OUTPUT); pinMode(r3,OUTPUT);
pinMode(11,OUTPUT); pinMode(12,OUTPUT);
}
char readkey(void) {
digitalWrite(r0,LOW); digitalWrite(r1,HIGH); digitalWrite(r2,HIGH); digitalWrite(r3,HIGH);
if(digitalRead(c0)==LOW){delay(500); return '1';}
else if(digitalRead(c1)==LOW){delay(500); return '2';}
else if(digitalRead(c2)==LOW){delay(500); return '3';}
else if(digitalRead(c3)==LOW){delay(500); return 'A';}
digitalWrite(r0,HIGH); digitalWrite(r1,LOW); digitalWrite(r2,HIGH); digitalWrite(r3,HIGH);
if(digitalRead(c0)==LOW){delay(500); return '4';}
else if(digitalRead(c1)==LOW){delay(500); return '5';}
else if(digitalRead(c2)==LOW){delay(500); return '6';}
else if(digitalRead(c3)==LOW){delay(500); return 'B';}
digitalWrite(r0,HIGH); digitalWrite(r1,HIGH); digitalWrite(r2,LOW); digitalWrite(r3,HIGH);
if(digitalRead(c0)==LOW){delay(500); return '7';}
else if(digitalRead(c1)==LOW){delay(500); return '8';}
else if(digitalRead(c2)==LOW){delay(500); return '9';}
else if(digitalRead(c3)==LOW){delay(500); return 'C';}
digitalWrite(r0,HIGH); digitalWrite(r1,HIGH); digitalWrite(r2,HIGH); digitalWrite(r3,LOW);
if(digitalRead(c0)==LOW){delay(500); return '*';}
else if(digitalRead(c1)==LOW){delay(500); return '0';}
else if(digitalRead(c2)==LOW){delay(500); return '#';}
else if(digitalRead(c3)==LOW){delay(500); return 'D';}
return 'o';
}
char nfunc(void) { char key='o'; while(key=='o') key=readkey(); return key; }
void loop() {
char key1 = nfunc();
if(key1) Serial.print(key1);
}
代码 2:密码验证与开锁
设定密码 "1234",收集 4 位输入后比对,正确则拉高引脚 11、拉低引脚 12 驱动 L293D 使执行器收缩开锁 (持续 250ms),错误串口提示 "intruder"。
char password[5]="1234";
char typed[5];
int count=0;
void loop() {
char key1 = nfunc();
if(key1) {
typed[count]=key1;
count++;
Serial.print(key1);
}
if(count==4){
if(strcmp(typed,password)==0) {
Serial.println(" correct");
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
delay(250);
digitalWrite(11,LOW);
} else {
Serial.println(" intruder");
}
count=0;
}
}
硬件连接
执行器接在 L293D 电机输出端,L293D 逻辑侧由 Arduino 5V 供电,功率侧接 12V。Arduino 引脚 11、12 分别接 L293D 输入端控制正反转。

原理图与演示视频


视频演示:按键显示、密码正确 LED 亮、执行器动作开锁。
制造工艺