#include <Keypad.h>
#include <EEPROM.h>
#include <Servo.h>
#include <Adafruit_GFX.h>
#include "Adafruit_SSD1306.h"
#define OLED_RESET 4
#define SSD1306_LCDHEIGHT 64
Adafruit_SSD1306 display(OLED_RESET);
#define LOGO16_GLCD_HEIGHT 16 //定义显示高度
#define LOGO16_GLCD_WIDTH 16 //定义显示宽度
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
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] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
Servo myservo; // 创建舵机对象来控制舵机
int pos = 0; // 用来存储舵机位置的变量
int D_break=1,A_break=1,ZhuYe=0;
char secret_num[6]={}; //设置6位密码,保存至eeprom
char secret_input[6]={};//输入密码进行判断
int secret_lenth; //密码设置长度
//for(int i = 0;i<6;i++)
//{
// EEPROM.write(i,TimeOn[i]);
// //延时100ms 等待写入
// delay(10);
//}
void setup(){
Serial.begin(9600);
myservo.attach(10); // 把连接在引脚9上的舵机赋予舵机对象
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
display.setTextColor(WHITE); //开像素点发光
display.clearDisplay(); //清屏
//--------------------------------------OLED屏调试代码
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE,BLACK); //设置字体黑色,字体背景白色
display.setCursor(0,5); //128*64的点阵屏对应x,y轴,x,y的起始点
display.print("ShuRu: A"); //这里输入显示内容,可以是变量
display.setCursor(0,25); //128*64的点阵屏对应x,y轴,x,y的起始点
display.print("SheZhi:D"); //这里输入显示内容,可以是变量
display.display();
//---------------------------------------
myservo.write(0); //舵机旋转指定角度
delay(1000);
secret_lenth=EEPROM.read(10);
for(int i = 0;i<secret_lenth;i++) //初始化密码
{
secret_num[i]=EEPROM.read(i);
delay(10);
}
}
void loop(){
char key = keypad.getKey();
if(ZhuYe==1)
{
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE,BLACK); //设置字体黑色,字体背景白色
display.setCursor(0,5); //128*64的点阵屏对应x,y轴,x,y的起始点
display.print("ShuRu: A"); //这里输入显示内容,可以是变量
display.setCursor(0,25); //128*64的点阵屏对应x,y轴,x,y的起始点
display.print("SheZhi:D"); //这里输入显示内容,可以是变量
display.display();
ZhuYe=0;
}
if (key != NO_KEY)
{
//Serial.println(key);
if(key=='B'||key=='C')
{
myservo.write(0); //舵机旋转指定角度
}
if(key=='D')
{
int lenth_num=0;
while(D_break)
{
display.clearDisplay(); //清屏
display.setTextSize(2);
display.setTextColor(WHITE,BLACK); //设置字体黑色,字体背景白色
display.setCursor(0,5); //128*64的点阵屏对应x,y轴,x,y的起始点
display.print("shezhi"); //这里输入显示内容,可以是变量
display.setCursor(0,35);
display.print("lenth"); //这里输入显示内容,可以是变量
display.display();
char key = keypad.getKey();
if(key != NO_KEY)
{
secret_lenth=int(key)-48;
lenth_num=1;
display.setCursor(80,35); //128*64的点阵屏对应x,y轴,x,y的起始点
display.print(secret_lenth); //这里输入显示内容,可以是变量
display.display();
}
int num_break=0; //循环跳出标志
while(lenth_num)
{
char key = keypad.getKey();
if(key != NO_KEY)
{
secret_num[num_break]=key;
display.clearDisplay(); //清屏
display.setTextSize(2);
display.setTextColor(WHITE,BLACK); //设置字体黑色,字体背景白色
display.setCursor(0,5); //128*64的点阵屏对应x,y轴,x,y的起始点
display.print("shezhi"); //这里输入显示内容,可以是变量
display.setCursor(0,45); //128*64的点阵屏对应x,y轴,x,y的起始点
display.print(num_break+1); //这里输入显示内容,可以是变量
display.display();
num_break++;
}
if(num_break>secret_lenth-1)
{
for(int i = 0;i<secret_lenth;i++)
{
EEPROM.write(i,secret_num[i]);
//延时100ms 等待写入
delay(10);
}
EEPROM.write(10,secret_lenth);
delay(10);
display.clearDisplay(); //清屏
for(int i=0;i<secret_lenth;i++)
{
display.setTextSize(2);
display.setTextColor(WHITE,BLACK); //设置字体黑色,字体背景白色
display.setCursor(i*15,30); //128*64的点阵屏对应x,y轴,x,y的起始点
display.print(secret_num[i]); //这里输入显示内容,可以是变量
display.display();
}
num_break=0;
delay(2000);
display.clearDisplay(); //清屏
display.setTextSize(2);
display.setTextColor(WHITE,BLACK); //设置字体黑色,字体背景白色
display.setCursor(0,25); //128*64的点阵屏对应x,y轴,x,y的起始点
display.print("OK!"); //这里输入显示内容,可以是变量
display.display();
delay(1000);
display.clearDisplay();
ZhuYe=1;
goto start;
}
}
}
}
if(key=='A') //验证密码
{
while(A_break)
{
display.clearDisplay(); //清屏
display.setTextSize(2);
display.setTextColor(WHITE,BLACK); //设置字体黑色,字体背景白色
display.setCursor(0,15); //128*64的点阵屏对应x,y轴,x,y的起始点
display.print("ShuRu:"); //这里输入显示内容,可以是变量
display.display();
int num_break2=0; //循环跳出标志
while(1)
{
char key = keypad.getKey();
//display.clearDisplay(); //清屏
if(key != NO_KEY)
{
secret_input[num_break2]=key;
//display.clearDisplay(); //清屏
display.setTextSize(2);
display.setTextColor(WHITE,BLACK); //设置字体黑色,字体背景白色
display.setCursor(0,15); //128*64的点阵屏对应x,y轴,x,y的起始点
display.print("ShuRu:"); //这里输入显示内容,可以是变量
display.setCursor(num_break2*15,45); //128*64的点阵屏对应x,y轴,x,y的起始点
display.print(secret_input[num_break2]); //这里输入显示内容,可以是变量
display.display();
num_break2++;
}
if(num_break2>secret_lenth-1)
{
int num_True=0;
for(int i = 0;i<secret_lenth;i++)
{
if(secret_input[i]==secret_num[i])
{
num_True++;
}
//延时100ms 等待写入
delay(10);
}
if(num_True==secret_lenth)
{
Serial.print("密码正确!");
num_True=0;
display.clearDisplay(); //清屏
display.setTextSize(2);
display.setTextColor(WHITE,BLACK); //设置字体黑色,字体背景白色
display.setCursor(0,25); //128*64的点阵屏对应x,y轴,x,y的起始点
display.print("success"); //这里输入显示内容,可以是变量
display.display();
delay(2000);
display.clearDisplay();
display.clearDisplay(); //清屏
display.setTextSize(2);
display.setTextColor(WHITE,BLACK); //设置字体黑色,字体背景白色
display.setCursor(0,25); //128*64的点阵屏对应x,y轴,x,y的起始点
myservo.write(100); //舵机旋转指定角度
delay(1500);
ZhuYe=1;
goto start;
}
else
{
Serial.print("密码错误!");
num_True=0;
display.clearDisplay(); //清屏
display.setTextSize(2);
display.setTextColor(WHITE,BLACK); //设置字体黑色,字体背景白色
display.setCursor(0,25); //128*64的点阵屏对应x,y轴,x,y的起始点
display.print("fail"); //这里输入显示内容,可以是变量
display.display();
delay(2000);
display.clearDisplay();
display.clearDisplay(); //清屏
display.setTextSize(2);
display.setTextColor(WHITE,BLACK); //设置字体黑色,字体背景白色
display.setCursor(0,25); //128*64的点阵屏对应x,y轴,x,y的起始点
ZhuYe=1;
goto start;
}
}
}
}
}
}
start:{}
}