本帖最后由 最帅的老饼 于 2018-1-7 22:25 编辑
以下是写了一整天的密码盘代码,代码说明如下:
1.代码用到 <Keypad.h> , 是4 行 3列 排线键盘, { 2, 3, 4, 5} { 8, 7, 6} ,9号脚是蜂鸣器
2.设置了'#' 为输入键
3.输入正确密码:80*123# //输入正确密码主板就通过 I2C 发送字符 'A' 关且在1秒后关闭LED
4.密码可以无限按键,只取'#'的前6位有效。
5.只要触动按键就打开键盘的背光LED
6.在输入过程中,只要超过10秒不动就把前面的输入清除且关闭LED
7.连续输入5次错误密码,锁键盘 900秒。
#include <Wire.h>
#include <Keypad.h>
#define BuzzerPin 9 //蜂鸣器脚
#define pinOUT 10 // 密码正确的输出脚
#define led 11 //键盘LED 脚
#define ErTime 900000 //输入五次错误的锁盘时间
unsigned long Time = 0 ;
boolean T = 0 ;
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] = { 2, 3, 4, 5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = { 8, 7, 6}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void Buzzer();
void Buzzer2();
void Buzzer3();
char qey[6]={0};
char z[6] = { '8','0','*','1','2','3'};
byte i = 0 ;
byte Error = 0 ;
unsigned long errorTime = 0 ;
void setup(){
// Serial.begin(9600);
Wire.begin ();
pinMode ( BuzzerPin ,OUTPUT);
pinMode ( pinOUT ,OUTPUT);
pinMode ( led ,OUTPUT);
}
void loop(){
char key = keypad.getKey(); //调用函数把按键读进 char key。
if ( key ){
Time = millis();
T = 1 ;
digitalWrite ( led , HIGH );
if ( key != '#'){ //当输入的char不是#时 ,把输入的char 装进数组。
if ( i == 6 ){ //当i == 5 时,把数组的后5个char 向前移动一位。
for ( byte j = 0 ; j < 5 ; j++ ){
qey[j] = qey [ j+1 ];
}
i = 5 ; //把i = 5 ,等代 qey[5] 的装入。
}
qey = key ; // 把key中的char 装进数组qey
// Serial.print('*');
Buzzer();
i++;
}
if ( key == '#' ){ //输入#后,进行数组的比较。
// Serial.println("");
for ( byte j = 0 ; j < 6 ; j++ ){
// Serial.print( qey[j] );
}
// Serial.println("");
if ( qey[0] == z[0] && qey[1] == z[1] && qey[2] == z[2] && qey[3] == z[3] &&
qey[4] == z[4] && qey[5] == z[5] ){ // 进行数组的比较。
// Serial.println("");
// Serial.println("Correct password.");
// Serial.println("");
Wire.beginTransmission ( 3 ) ; //输出
Wire.write ( 'A');
Wire.endTransmission ();
Buzzer2();
delay ( 1000 );
digitalWrite ( led , LOW );
T = 0 ;
Error = 0 ;
}else{
Buzzer3();
// Serial.println("");
// Serial.println("Password error.");
// Serial.println("");
Error ++ ;
// Serial.print("Error=");
// Serial.println( Error );
}
i = 0 ;
for ( byte j = 0 ; j < 6 ; j++ ){
qey[j] = 0 ;
}
}
}
if ( (millis( ) - Time ) > 10000 && T == 1 ){ //按键停10秒就清空内存中的密码和关灯。
for ( byte j = 0 ; j < 6 ; j++ ){
qey[j] = 0 ;
}
Buzzer3();
digitalWrite ( led , LOW );
T = 0 ;
}
if ( Error > 4 ){ //密码连续输错5次就锁键盘15秒。
errorTime = millis();
digitalWrite ( led , LOW );
T = 0 ;
while ( ( millis ( ) - errorTime ) < ErTime ){
;
}
Error = 0 ;
}
} //Loop
void Buzzer3(){
for(byte x = 0 ; x < 3 ; x++){
digitalWrite( BuzzerPin ,HIGH );
delay (30);
digitalWrite( BuzzerPin ,LOW );
delay (50);
}
}
void Buzzer2(){
digitalWrite( BuzzerPin ,HIGH );
delay (500);
digitalWrite( BuzzerPin ,LOW );
}
void Buzzer(){
digitalWrite( BuzzerPin ,HIGH );
delay (100);
digitalWrite( BuzzerPin ,LOW );
} |