在这篇文章中,我们将构建一个密码安全锁电路,它可以通过一个6位密码访问。更准确地说,它是字母数字密码。
本项目硬件
我们将使用4x4键盘,它由0到9个十进制值、两个特殊字符‘#’和‘*’以及A到D字母组成。这些字符的组合可以用作密码。
Arduino是系统的大脑,当输入正确的密码时,Arduino通过一个继电器来激活和关闭。这里使用两个LED指示灯来指示锁系统的状态。
如果你不熟悉4x4键盘,请参考我之前的文章,其中全面讨论基本的4x4矩阵键盘
这个项目的硬件设计非常简约。它只是由一个键盘,继电器,arduino和两个led组成,即使是arduino新手也可以轻松完成。
这个项目中唯一稍微困难的部分是编码,不用担心代码是在这个项目中给出的。程序应该这样写,它是傻瓜证明,没有劫机者可以黑进系统。
但是,如果您暴露的硬件或这个项目的硬件是容易访问的,请小心,继电器可以很容易地被黑客攻击。所以把这个项目放在保护好的底盘上。
它是如何工作的
注:晶体管的基极必须连接一个4.7K的限流电阻,图中没有显示。
下面让我们来看看Arduino密码安全锁电路是如何工作的,请仔细阅读下面给出的说明,以便操作电路。
线路图
下面是两个如何连接键盘和Arduino的插图:
•电路上电时,要求输入密码,可以在串口显示器上看到(串口显示器不是强制性的,但可以用于测试目的)。
•输入您在编译程序之前输入的密码。
•当您按下按键时,绿色LED闪烁十分之一秒,表示用户按下了某个按键。
•输入6位密码后,按键盘上的“D”键,这相当于“Enter”键。如果您的密码是正确的,继电器被激活,绿色LED打开。
•要关闭继电器,请按键盘中的“C”键。当,这是完成,绿色LED关闭和继电器失活。没有其他钥匙可以解除继电器。
•如果用户输入的密码不正确,则红色LED亮起,用户需要等待30秒才能进行下一次尝试。当30秒结束,红色LED熄灭,通知用户,系统准备从用户的输入。
•当激活成功后继电器失效时,用户需要再次输入密码并按“D”键,才能再次激活继电器。
这里有一个特例:
•当输入正确的密码时,继电器被激活,成功停用后,当用户按错任何一个按键(不是整个密码),程序识别为错误的密码,用户需要再等待30秒。如果这是一个劫机者,它将延迟劫机者的尝试次数。
•当第一次尝试按下正确的击键时,只有这样它才允许输入下一个键。这只适用于第一次击键,而不适用于所有后续的击键。
•上述概念的座右铭是拖延劫机者的多次尝试。
程序代码:
//--------------------------------- 项目由R.Girish --------------------------//
# include < Keypad.h >
const byte ROWS = 4;
const byte COLS = 4;
char pass[] = "123ABC";// 6位密码(不少于或不多于)
int OP = 10;
int绿色= 12;
int红色= 11;
char key1;
char key2;
char key3;
char key4;
char key5;
char key6;
char dumpkey;
char keyOK;
char好[]= " D ";
char offkey;
char[] =“C”;
int z;
字符键(行)[关口]=
{
{' D ', ' # ', ' 0 ',‘*’},
{' C ', ' 9 ', ' 8 ', ' 7 '},
{' B ', ' 6 ', ' 5 ', ' 4 '},
{' A ', ' 3 ', ' 2 ', ' 1 '}
};
byte rowPins[ROWS] = {6,7,8,9};//连接到键盘的行输出
byte colPins[colPins] = {2,3,4,5};//连接到键盘的列输出
keyypad (makeKeymap(keys), rowPins, colPins, ROWS, COLS);
无效的设置()
{
Serial.begin (9600);
pinMode (OP、输出);
pinMode(绿色、输出);
pinMode(红、输出);
digitalWrite (OP,低);
}
无效循环()
{
上图:
以(" ");
系列。println("[按D = Enter]");
系列。print("输入密码:");
key1 = keypad.waitForKey ();
如果(key1 = =通过[0])
{
digitalWrite(绿色、高);
延迟(100);
digitalWrite(绿色、低);
{
z = 1;
并同时(“*”);
转到一个;
}
}
其他的
{
goto倾倒;
}
答:
key2 = keypad.waitForKey ();
如果(key2 = =通过[1])
{
digitalWrite(绿色、高);
延迟(100);
digitalWrite(绿色、低);
{
z = 2;
并同时(“*”);
转到B;
}
}
其他的
{
goto倾倒;
}
B:
key3 = keypad.waitForKey ();
如果(key3 = =通过[2])
{
digitalWrite(绿色、高);
延迟(100);
digitalWrite(绿色、低);
{
z = 3;
并同时(“*”);
转到C;
}
}
其他的
{
goto倾倒;
}
C:
key4 = keypad.waitForKey ();
如果(key4 = =通过[3])
{
digitalWrite(绿色、高);
延迟(100);
digitalWrite(绿色、低);
{
z = 4;
并同时(“*”);
goto D;
}
}
其他的
{
goto倾倒;
}
D:
key5 = keypad.waitForKey ();
如果(key5 = =通过[4])
{
digitalWrite(绿色、高);
延迟(100);
digitalWrite(绿色、低);
{
z = 5;
并同时(“*”);
goto E;
}
}
其他的
{
goto倾倒;
}
艾凡:
key6 = keypad.waitForKey ();
如果(key6 = =通过[5])
{
digitalWrite(绿色、高);
延迟(100);
digitalWrite(绿色、低);
{
z = 6;
并同时(“*”);
高特好;
}
}
其他的
{
goto倾倒;
}
好:
keyOK = keypad.waitForKey ();
如果(keyOK = =好[0])
{
digitalWrite (OP、高);
digitalWrite(绿色、高);
以(" ");
系列。println("继电器激活,按'C' to Deactivate.n");
}
其他的
{
以(" ");
系列。println("按'D'进入");
高特好;
}
:
offkey = keypad.waitForKey ();
如果(offkey = = [0])
{
digitalWrite (OP,低);
digitalWrite(绿色、低);
系列。println(“接力Deactivated.n”);
转到最高;
}
其他的
{
系列。println(“按‘C’去去激活”);
转到;
}
转储文件:
如果(z = = 0)
{
digitalWrite(绿色、高);
延迟(100);
digitalWrite(绿色、低);
并同时(“*”);
dumpkey = keypad.waitForKey ();
并同时(“*”);
dumpkey = keypad.waitForKey ();
并同时(“*”);
dumpkey = keypad.waitForKey ();
并同时(“*”);
dumpkey = keypad.waitForKey ();
并同时(“*”);
dumpkey = keypad.waitForKey ();
并同时(“*”);
dumpkey = keypad.waitForKey ();
并同时(“*”);
转到错误;
}
如果(z = = 1)
{
digitalWrite(绿色、高);
延迟(100);
digitalWrite(绿色、低);
并同时(“*”);
dumpkey = keypad.waitForKey ();
并同时(“*”);
dumpkey = keypad.waitForKey ();
并同时(“*”);
dumpkey = keypad.waitForKey ();
并同时(“*”);
dumpkey = keypad.waitForKey ();
并同时(“*”);
dumpkey = keypad.waitForKey ();
并同时(“*”);
转到错误;
}
如果(z = = 2)
{
digitalWrite(绿色、高);
延迟(100);
digitalWrite(绿色、低);
并同时(“*”);
dumpkey = keypad.waitForKey ();
并同时(“*”);
dumpkey = keypad.waitForKey ();
并同时(“*”);
dumpkey = keypad.waitForKey ();
并同时(“*”);
dumpkey = keypad.waitForKey ();
并同时(“*”);
转到错误;
}
如果(z = = 3)
{
digitalWrite(绿色、高);
延迟(100);
digitalWrite(绿色、低);
并同时(“*”);
dumpkey = keypad.waitForKey ();
并同时(“*”);
dumpkey = keypad.waitForKey ();
并同时(“*”);
dumpkey = keypad.waitForKey ();
并同时(“*”);
转到错误;
}
如果(z = = 4)
{
digitalWrite(绿色、高);
延迟(100);
digitalWrite(绿色、低);
并同时(“*”);
dumpkey = keypad.waitForKey ();
并同时(“*”);
dumpkey = keypad.waitForKey ();
并同时(“*”);
转到错误;
}
如果(z = = 5)
{
digitalWrite(绿色、高);
延迟(100);
digitalWrite(绿色、低);
并同时(“*”);
dumpkey = keypad.waitForKey ();
并同时(“*”);
转到错误;
}
错误:
以(" ");
系列。print(“密码错误,请等待30秒”);
digitalWrite(红、高);
延迟(10000);
延迟(10000);
延迟(10000);
digitalWrite(红、低);
转到最高;
}
//--------------------------------- 项目由R.Girish --------------------------//
注意:设置密码:char pass[] = "123ABC";// 6位密码(不少于或不多于)
用您自己的密码更改“123ABC”,在引号内。
请确保在程序中设置的密码是6位“ONLY”,不能多也不能少,但要恰好是6位。否则程序不能正常运行。
如果您对所解释的密码安全锁电路有任何疑问,请随时通过您的评论发表
太大了,我喜欢它的巨大
亲爱的斯瓦卡塔姆,我很想知道
Arduino。但我是新手,所以请贴一些链接,我是否可以学习ABCD的
Arduino。
亲爱的Manas,你可以参考下面的链接
https://www.arduino.cc/en/Tutorial/HomePage
先生,我可以用这个电路来汽车点火吗?如果不是友好的建议一个电路,它是有帮助的,谢谢你先生
Satish,是的,你可以使用这个电路用于汽车点火锁定或任何相关的锁定应用