继上次关于4*4矩阵式键盘学习之后,于是乎,我就想为何不将他制作成一个简单的类似于密码锁的小玩意。
首先,我们先构思这个密码锁应该有什么功能,当然最重要的是,他能够输入数字,其次我们得要一个初始密码,如果输入值与初始密码相匹配,打印出“welcome”,如果不匹配则输入清零并且提示输入错误,总共有四次错误机会,如果超过四次,则需要等待30秒直到显示“try again"时才能再次输入。
首先我们需要准备的材料有:
- 4*4矩阵式键盘
- Arduino 板
- lcd1602液晶显示器
对于初始密码的设定,我们需要用到EEPROM。在这里,简单介绍一下EEPROM
EEPROM(带电可擦写可编程读写存储器)是用户可更改的只读存储器(ROM),其可通过高于普通电压的作用来擦除和重编程(重写)。不像EPROM芯片,EEPROM不需从计算机中取出即可修改。EEPROM是一种特殊形式的闪存,其应用通常是个人电脑中的电压来擦写和重编程
electrically erasable programmable read only memory(EEPROM)
电气可拭除可编程只读存储器
lcd1602的接线图忘记了的可以看这个
之后就是我们的原密码代码部分,当然,大家可以按照自己的喜好随意更改。
#include <EEPROM.h>
void setup() {
EEPROM.write(0,0);
EEPROM.write(1,3);
EEPROM.write(2,0);
EEPROM.write(3,6);
}
void loop() {
}
码先烧录到 Arduino中为0306,之后我们就能开始编写密码锁。(烧录完初始密码后,再烧录密码锁程序并不会清除原来的密码)
#include <EEPROM.h>
#include <LiquidCrystal.h>
#include <Key.h>
#include <Keypad.h>
LiquidCrystal mylcd(0, 1, 9, 10, 11, 12);
const byte ROWS = 4;
const byte COLS = 4;
int a;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {2, 3, 4, 5};
byte colPins[COLS] = {6, 7, 8, 13};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
String opw = ""; //oldpassword
String npw = ""; //这里可以在修改密码使用到
int falsh = 0; //记录输入错误次数
String input = ""; //输入
void setup()
{
Serial.begin(9600);
mylcd.begin(16, 2);
for (int i = 0; i < 4; i++)
{
opw += EEPROM.read(i); //读取之前烧录进去的密码
}
Serial.println("The oldpassword is "); //串口打印出初始密码
Serial.println(opw);
delay (5000);
Serial.flush(); //清除串口的数据
mylcd.setCursor(0, 0);
mylcd.print("input");
}
void loop()
{
char key = keypad.getKey();
if (key) //当有按键按下时
{
input += key;
mylcd.setCursor(a, 1);
mylcd.print("*");
Serial.println("input=");
Serial.println(input);
if (a > 3)
{
a = 0; //当输入超过四位时,清零
}
if (input == opw) //当密码匹配
{
falsh = 0; //错误次数清零
Serial.flush();
Serial.println("welcome");
delay (500);
mylcd.clear();
mylcd.setCursor(0, 1);
mylcd.print("welcome");
input = "";
mylcd.clear();
mylcd.setCursor(0, 0);
mylcd.print("input");
}
else if (input.length() == 4 && input != opw)
{
Serial.flush();
Serial.println("wrong");
mylcd.clear();
mylcd.setCursor(0, 1);
mylcd.print("wrong");
input = "";
falsh ++;
Serial.print("input wrong ");
Serial.print(falsh);
Serial.println("times");
delay(500);
Serial.flush();
Serial.print("please input again:");
mylcd.clear();
mylcd.setCursor(0, 1);
mylcd.print("again");
if (falsh > 3)
{
mylcd.clear();
mylcd.setCursor(0, 1);
mylcd.print("wait 30s");
Serial.println("you have already tried four times");
Serial.println("please try again after 30s");
delay(30000);
Serial.println("try again");
falsh = 0;
input = "";
}
}
}
串口经过实验可以完成他的功能,但是lcd1602 的部分,大家需按照自己的需求更改,在这里我的1602一直显示乱码,其原因还未找出,如果是程序的问题还请大家指出。