C语言arduino密码锁实验报告,简易密码锁的制作-Arduino中文社区 - Powered by Discuz!...

本帖最后由 chemistry 于 2018-11-8 16:57 编辑

一款简易密码锁一、功能:

将密码显示在lcd屏上,正常状态下电磁锁处于锁定状态,当输入密码与原设定密码一致时,打开电磁锁。同时可改变密码。

二 、工作原理:正常状态下继电器通电,常开闭合,电磁锁有电压,状态闭合当密码正确时,10引脚输出低电平,继电器断电,电路开路,密码锁打开。三、需要的组件:Arduino uno x1lcd 1602 x14x4矩阵键盘x1电源SRD-05VDC-SL-C继电器x1电磁锁x1

导线若干四、硬件连接:4x4矩阵键盘的连接:1-8脚分别连接arduino的2 3 A5-A0 8个引脚lcd1602屏幕的连接:vss v0接电源负极,vdd接+5v,RS RW E分别接引脚4 5 6D4-D7分别接引脚8 9 11 12,背光A接3.3v K接GND继电器的连接:线圈两端一端接GND一端接10脚公共端接电源负极  常开端接电磁锁负极电磁锁和电源的连接:电磁锁正极连电源正  负极连接常开

五、电路原理图:

forum.php?mod=viewthread&tid=82408&page=1

系统组成:arduino 继电器 4x4键盘 电源 电磁锁

面包板视图:

forum.php?mod=viewthread&tid=82408&page=1

右上为电磁锁,中间为继电器,右下角为4x4键盘 从上到下为1-8脚

六、代码部分://首先,我们将包括用于4X4键盘,LCD和用于存储密码的库的库,设定lcd和键盘的引脚

#include

#include

#include

LiquidCrystal liquid_crystal_display{4,5,6,8,9,11,12,};

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;

const byte 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_key = Keypad( makeKeymap(hexaKeys), row_pins, column_pins, rows, columns);

void setup()

{

pinMode(relay_pin, OUTPUT);//设定引脚模式为输出

liquid_crystal_display.begin(16,2);

liquid_crystal_display.print("Enter Password");

liquid_crystal_display.setCursor(0,1);

initialpassword();

}

//按下的键存储在“ 密码 ”变量中,当按下键时,这些键显示在LCD上。然后这些键将与存储在EEPROM中的初始密码相匹配。如果按下的键与初始密码匹配,则锁定将打开,并且LCD上将打印“已接受通过”。如果密码不匹配,则会要求再次输入密码。

void loop()

{

digitalWrite(relay_pin, HIGH);//初始化为高电平

key_pressed = keypad_key.getKey();

if (key_pressed)

{

password[i++]=key_pressed;

liquid_crystal_display.print(key_pressed);

while(key_pressed=='*')

{

change();

}

}

if(i==4)

{

delay(200);

for(int j=0;j<4;j++)

initial_password[j]=EEPROM.read(j);

if(!(strncmp(password, initial_password,4)))//比较输入密码与当前密码是否一致

{

liquid_crystal_display.clear();

liquid_crystal_display.print("Pass Accepted");

digitalWrite(relay_pin, LOW);//输出低电平

delay(2000);

liquid_crystal_display.clear();

liquid_crystal_display.print("Enter Password:");

liquid_crystal_display.setCursor(0,1);

i=0;

}

else

{

digitalWrite(relay_pin, HIGH);

liquid_crystal_display.clear();

liquid_crystal_display.print("Wrong Password");

delay(2000);

liquid_crystal_display.clear();

liquid_crystal_display.print("Enter Password");

liquid_crystal_display.setCursor(0,1);

i=0;

}

}

}

//如果按下'*'键,它将调用' change() '函数。在更改功能中,它会要求您输入当前密码。如果当前密码正确,则会要求您输入新密码。输入新密码后,密码将被更改。

void change()//修改密码

{

int j=0;

liquid_crystal_display.clear();

liquid_crystal_display.print("Current Password");

liquid_crystal_display.setCursor(0,1);

while(j<4)

{

char key=keypad_key.getKey();

if(key)

{

new_password[j++]=key;

liquid_crystal_display.print(key);

}

key=0;

}

delay(500);

if((strncmp(new_password, initial_password, 4)))

{

liquid_crystal_display.clear();

liquid_crystal_display.print("Wrong Password");

liquid_crystal_display.setCursor(0,1);

liquid_crystal_display.print("Try Again");

delay(1000);

}

else

{

j=0;

liquid_crystal_display.clear();

liquid_crystal_display.print("New Password:");

liquid_crystal_display.setCursor(0,1);

while(j<4)

{

char key=keypad_key.getKey();

if(key)

{

initial_password[j]=key;

liquid_crystal_display.print(key);

EEPROM.write(j,key);

j++;

}

}

liquid_crystal_display.print("Pass Changed");

delay(1000);

}

liquid_crystal_display.clear();

liquid_crystal_display.print("Enter Password");

liquid_crystal_display.setCursor(0,1);

key_pressed=0;

}

//初始密码的设定

void initialpassword(){

for(int j=0;j<4;j++)

EEPROM.write(j, j+49);

for(int j=0;j<4;j++)

initial_password[j]=EEPROM.read(j);

}键盘库:

[url=]keypad.zip[/url]

七、总结:

通过这次项目的设计,更加清晰了代码的设计,电路的原理,对arduino的认识。

项目中遇到的问题:继电器的使用,用加在线圈上的电压来控制继电器的工作状态从而控制电磁锁的开关。附:实物图:

forum.php?mod=viewthread&tid=82408&page=1