#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Keypad.h>
#include <Servo.h> //舵机库文件
const int passwordLength = 4; //设置密码长度
char correctPassword[5]; //原始密码
char enteredPassword[passwordLength+1];
int passwordIndex = 0;
Servo myServo; //初始化舵机
int buzzer = 12; //蜂鸣器
#define SCREEN_WIDTH 128 //宽度
#define SCREEN_HEIGHT 64 //高度
#define OLED_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH,SCREEN_HEIGHT,&Wire,-1);
const uint8_t ROWS = 4; //行
const uint8_t COLS = 4; //列
char Keys[ROWS][COLS]={
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
uint8_t colPins[COLS]={5,4,3,2}; //列引脚
uint8_t rowPins[ROWS]={9,8,7,6}; //行引脚
Keypad keypad = Keypad(makeKeymap(Keys),rowPins,colPins,ROWS,COLS);
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
strcpy(correctPassword,"4567");
myServo.attach(11);
while(!Serial);
if (!display.begin(SSD1306_SWITCHCAPVCC,OLED_ADDRESS)){
Serial.println(F("SSD1306 allocatino failed"));
for(;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("press Button!");
display.display();
}
void loop() {
// put your main code here, to run repeatedly:
char correctPassword[5];
char key = keypad.getKey();
strcpy(correctPassword,"4567");
if(key != NO_KEY){ //按下按钮采取行动
if(key == '*'){ //按键按下*号
if(passwordIndex > 0){ //密码数>0
passwordIndex--; //删除
enteredPassword[passwordIndex] = '\0';
display.clearDisplay();
display.setCursor(0,0);
display.println("Enter Password");
display.setCursor(0,30);
for(int i=0; i<passwordIndex; i++){
display.print(enteredPassword[i]);
}
display.display();
delay(200);
}
} else if(key == '#'){ //按键按下#号
if(passwordIndex == passwordLength){ //密码数=密码长度
if(strcmp(enteredPassword,correctPassword) ==0){
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Correct Password"); //正确密码
display.display();
myServo.write(90); //舵机转动开锁
delay(2000);
myServo.write(0); //舵机复位
passwordIndex = 0;
memset(enteredPassword, 0,sizeof(enteredPassword));
display.clearDisplay();
display.setCursor(0,0);
display.println("Enter Password");
display.display();
} else {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Wrong Password"); //错误密码
display.display();
tone(buzzer,2200);
delay(100);
noTone(buzzer);
delay(200);
delay(2000);
passwordIndex = 0;
memset(enteredPassword,0,sizeof(enteredPassword));
display.clearDisplay();
display.setCursor(0,0);
display.println("Enter Password");
display.display();
}
}
} else {
if(passwordIndex < passwordLength){
enteredPassword[passwordIndex++]=key;
display.clearDisplay();
display.setCursor(0,0);
display.println("Enter Password");
display.setCursor(0,20);
for (int i=0; i<passwordIndex; i++){
display.print(enteredPassword[i]);
}
display.display();
delay(200);
}
}
}
}