
使用键盘输入您设置的密码并打开门锁。 ![]() 这个项目中使用的东西 硬件组件 Arduino UNO和Genuino UNO × 1 薄膜键盘 × 1 双H桥电机驱动器L293D 德州仪器双H桥电机驱动器L293D × 1 线性执行器 × 1 介绍 有很多网站发布了这个项目,它存在于各种YouTube频道上,甚至这个网站也有一些。所以,说实话,它没有任何原创性。但我可能能够以更简单,更丰富的方式解释和展示。 该项目的主要组成部分是矩阵键盘。我使用了4x4薄膜键盘,如下所示: ![]() 键盘上的按键基本上是按钮。这些按钮开关在按下时“关闭”,一旦释放力,它们就会回到自然状态,即“打开”。 ![]() 这就是键盘在内部以行和列的形式连接的方式。当按下1时,第1列和第1行连接在一起。当按下9时,r3和c3连接在一起。 ![]() 扫描由4个键配置为输出,4个键作为输入完成。我使用输入上拉电阻将所有列作为输入,并将所有行作为输出。使用编程,所有行逐个变为低,一秒钟多次。因此,当按下某个键时,相应的列变为LOW。所有列连接的输入引脚的状态被多次读取。每当读取LOW状态时,表示按下该列中的键。如果某行是低的并且同时某列低,则确定按下的键。 例如,如果按下1,则列1将为低。并且由于每一行都是如此快速地降低,一个接一个,即使你按键很短的时间跨度,行1也会被发现为低,并且将确定按下1。如果row1 == low && column1 == low,则表示按下了1。 这在代码1中显示。我自己编写了这段代码,因为我想将它上传到stm32板,并且KEYPAD库不兼容。使用此代码,您将了解我上面解释的内容。或者您只需使用键盘库并运行“customkeypad”示例。两者都有同样的目的。但该代码不会解释你的工作。 使用串行监视器,按下的每个键都显示在屏幕上。这在视频1中显示。 在密钥确定工作正常后,是时候处理密码了。它如此简单。我做的是 - 做了一个字符串“1234”。这是我设置的密码。现在,我又做了一个阵列。无论键值是什么,它都存储在这个数组中。当计数达到4时,两个字符串都会进行比较。如果匹配 - 密码是正确的,否则不是。这在代码2中显示。我将LED连接到引脚11.因此,当密码正确时,它会发光。它显示在视频2中。 现在,将用作锁的组件:12 V线性执行器。看起来像这样。 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg 这是使用L293d IC操作的,L293d IC通常被称为“电机驱动器”IC。该IC与12v电源连接。它接收来自Arduino的输入,即5v输入,并将12v输出到其输出引脚(执行器连接到该引脚)。因此,当密码正确时,引脚11设置为高电平,引脚12设置为低电平。引脚11和12连接到l293d的输入。因此,致动器被拉入内部并且门打开。视频中显示3 。 原理图 与arduino的键盘连接 ![]() l293d连接 连接电机连接的执行器。 将引脚8连接到12v ![]() 代码 int rows=4; int columns=4; char readkey(void); char nfunc(void); #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); } } 7 R0 G/ F- W3 w, I% B/ H8 } |