任务需求:需要使用4*4矩阵键盘来完成一个按键密码锁
需要使用keypad和password这两个开源库
开源库的查找
1.在IDE中直接查找
同时在更多中能够看到api文档
2.在官网中进行找寻
至于导入的方式比较简单就不做叙述
keypad库文件文档api分析
api可以在官网中有相应的说明,我只看到英文版,暂时没看到中文版的
const byte rows = 4; //four rows
const byte cols = 3; //three columns
char keys[rows][cols] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'#','0','*'}
};
byte rowPins[rows] = {5, 4, 3, 2}; //连接行引脚
byte colPins[cols] = {8, 7, 6}; //连接的列引脚
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, rows, cols );
1.Keypad Keypad()
实例化一个键盘,让esp32芯片和键盘对应起来,官网中以4*3按键举的例子,我们可以按照自己的需求进行修改
2.char getKey()
获取按下对应的按键值
3.addEventListener(keypadEvent)
使用按键就会触发事件,可以设置当按键处于持续按下时的任务
按理来说这三个内容就可以完成密码锁的任务,但是如果我们手动去实现的话会遇到很多麻烦,而且面作为一个独立的模块,可以封装出来。所以有了password库文件
password库文件分析
这是这个库文件的核心代码,就是一个一一比对的循环函数
bool Password::evaluate(){
char pass = target[0];//初始化设置的密码
char guessed = guess[0];//我们输入的密码
for (byte i=1; i<MAX_PASSWORD_LENGTH; i++){
//判断是否一一对比到末端了
if (pass==STRING_TERMINATOR && guessed==STRING_TERMINATOR){
return true; //比对成功返回true
}
else if (pass!=guessed || pass==STRING_TERMINATOR || guessed==STRING_TERMINATOR){
return false; //比对每一项,只要出现上述的三种条件一种就是密码错误了
}
//移动每一位密码位
pass = target[i];
guessed = guess[i];
}
return false; //a 'true' condition has not been met
}
在百度上搜索只看到了bilibili上一个up主发了这个库文件
https://www.bilibili.com/read/cv5500506/
注意:这里的在你输入密码长度大于实际密码长度(只要不大于他规定的20个字符)时是不会有问题的,对于有些给定输入密码长度的方案中需要自己重新定义。
使用和功能代码
![在这里插入图片描述](https://img-blog.csdnimg.cn/9b55704265624dd690e6ce5c34fc0ecb.png
首先是薄膜按键的接线,从左到右依次对应的是行->列,设置错误会出现按键无效
#include <Keypad.h>
#include <Password.h>
Password password = Password("1111"); //解锁密码
const byte ROWS = 4; // 四行
const byte COLS = 4; // 四列
char keys[ROWS][COLS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
}; // 定义键盘
byte rowPins[ROWS] = { 13, 12, 14, 27 }; //行
byte colPins[COLS] = { 26, 25, 33, 32 }; //列
//initialize an instance of class NewKeypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);
void setup() {
Serial.begin(9600);
delay(200);
pinMode(23, OUTPUT);
keypad.addEventListener(keypadEvent); //键盘侦听
}
void loop(){
keypad.getKey();
}
void keypadEvent(KeypadEvent eKey) {
switch
(keypad.getState()) {
case PRESSED:
Serial.print("Enter: ");
Serial.println(eKey);
delay(10);
switch (eKey){
case 'A':
checkPassword(); delay(1); break;
case 'B':
password.reset(); delay(1);
Serial.println("Has been unlocked!");break;
default: password.append(eKey); delay(1);
}}}
void checkPassword(){
if (password.evaluate()){
Serial.println("True");//如果密码正确开锁
digitalWrite(23, HIGH);//LED指示灯
delay(500);
digitalWrite(23, LOW);
}else{
Serial.println("Already locked!"); //如果密码错误保持锁定
}
}
按键中功能的选择是通过Switch进行分级实现的,如果需要实现的更多功能,需要在switch中添加,或者嵌套Switch