#include <Keypad.h> //矩阵键盘库头文件
#include <MsTimer2.h> //定时器库头文件
#include <FastLED.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//初始化LED
#define NUM_LEDS 2 // LED灯珠数量
#define DATA_PIN 2 // Arduino输出控制信号引脚
#define LED_TYPE WS2812 // LED灯带型号
#define COLOR_ORDER RGB // RGB灯珠中红色、绿色、蓝色LED的排列顺序
uint8_t max_bright = 120; // LED亮度控制变量,可使用数值为 0 ~ 255, 数值越大则光带亮度越高
CRGB leds[NUM_LEDS]; // 建立光带leds
// 定义屏幕行列数,默认不用更改,因为大家的LCD1602规格都是一致的
int lcdColumns = 16;
int lcdRows = 2;
// 初始化LCD1602
// 参数一为IIC地址
// 参数二为列数
// 参数三为行数
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
//定义键盘
const byte ROWS = 4; //four rows
const byte COLS = 3; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins[ROWS] = {40, 39, 38, 37}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {36, 35, 0}; //connect to the column pinouts of the keypad
//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
//初始化矩阵键盘
char key = customKeypad.getKey();
int type = 0; //输入密码计数器清零
int correctkey = 0; //正确密码计数清零
int passwordAccount = 7; //定义密码位数
char pass[7] = {'7','3','5','5','6','0','8'}; //定义密码
char newpass[7]; // 定义输入密码存入数组的位数
int tick = 0; //拆弹计数器清零
int SW = 4; //拓展开关引脚
int beep = 5; //蜂鸣器引脚
int defuseTime = 700; //中断时间
int val;
long frq;//嗡鸣器频率设定
void wing(long freq,int delaytime);
void welcome(void){ //初始化界面显示8位'8’
leds[0] = CRGB::CRGB::Red;
lcd.setCursor(2,0);
lcd.print("88888888");
delay(1000);
leds[0] = CRGB::Black;
digitalWrite(SW, LOW);
lcd.clear();
}
void inputpassword(void){ //等待输入界面显示8位'-'
for (int i=0;i<7;i++){
lc.setChar(0,i,'-',false);
}
}
void correct(void){
lcd.clear();
}
}
//触发中断检测按键
void defuse(){
int val = digitalRead(SW);
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
char key = customKeypad.getKey();
if (key != NO_KEY && key == '#'){ //如果#号键被按下
if (tick == 0){
digitalWrite(beep, HIGH); //开始拆弹提示音
delay(50);
digitalWrite(beep, LOW);
delay(50);
digitalWrite(beep, HIGH);
delay(50);
}
if(val==1){ //没有拆弹钳
int ticks = tick/2;
int p = passwordAccount - 1 - ticks ;
lc.setChar(0,p,pass[ticks],false); //依次显示破解密码
Serial.println(ticks);
Serial.println(tick);
Serial.println(val);//串口调试
delay(1000);
tick++;
if(ticks > 7){ //如果计数器累计按下8秒,拆弹成功
digitalWrite(beep, LOW);
digitalWrite(LED, LOW);
tick = 0;
type = 0;
correctkey = 0;
//lc.clearDisplay(0);
//inputpassword();
delay(200);
while(1){
}
}
}
else{ //有拆弹钳
int p = passwordAccount - 1 - tick ;
lc.setChar(0,p,pass[tick],false); //依次显示破解密码
Serial.println(tick);
Serial.println(val);//串口调试
delay(1000);
tick++;
if(tick > 7){ //如果计数器累计按下8秒,拆弹成功
digitalWrite(beep, LOW);
digitalWrite(LED, LOW);
tick = 0;
type = 0;
correctkey = 0;
//lc.clearDisplay(0);
//inputpassword();
delay(200);
while(1){
}
}
}
}
else if (key == NO_KEY && tick != 0){ //中间松手检测,拆弹计数清零
tick = 0; //拆弹计数器清零
correct(); //显示复位
}
else{
tick = 0; //拆弹计数器清零
}
}
void boom(void) { //爆炸倒计时
int delaytime = 1000;
for (int i = 0;i < 75; i ++){
delaytime = 1000 - 13*i;
digitalWrite(beep, HIGH); // turn the LED on (HIGH is the voltage level)
delay(100); // wait for a second
digitalWrite(beep, LOW); // turn the LED off by making the voltage LOW
delay(delaytime);
}
for (int i=0;i<7;i++){
lc.setChar(0,i,'8',false);
}
delay(2000);
}
void setup(){
pinMode(SW,INPUT_PULLUP); //拓展开关拉高
pinMode(beep, OUTPUT);
Serial.begin(9600); //串口调试波特率
Wire.begin(41,42);
MsTimer2::set(defuseTime, defuse); //设置中断,每1000ms检测是否拆弹 defuse()
MsTimer2::start(); //开始计时_开启定时器中断
/* start display */
lcd.init();
// 打开LCD背光显示
lcd.backlight();
//初始化LED
LEDS.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // 初始化光带
FastLED.setBrightness(max_bright); // 设置光带亮度
leds[0] =CRGB::Red;
/* 初始化 */
for (int i=0;i<3;i++){
wing(2500,100);
}
//初始化响三声表示安包,拨纽开关和总电源相连
welcome();
inputpassword();
}
void loop(){
lcd.setCursor(0,0);
lcd.print("scaning password")
char key = customKeypad.getKey();
if (key != NO_KEY && type < passwordAccount){ //检测到输入密码且密码位数不足
newpass[type] = key;
int pos = passwordAccount - type - 1;
lc.setChar(0,pos,key,false);
lcd.setCursor(,1);
delay(200);
if(newpass[type] == pass[type]){
correctkey++;
}
type++; //输入密码计数
}
if(correctkey == passwordAccount && type == passwordAccount){ //有7位输入且全部正确
type = 0;
correctkey = 0;
lcd.clear();
correct(); //显示7位'_'
boom(); //倒计时子程序
digitalWrite(beep, LOW);
digitalWrite(LED, LOW);
//digitalWrite(SW, LOW);
inputpassword();
}
if(correctkey < passwordAccount && type == passwordAccount){ //有7位输入但不正确
type = 0;
correctkey = 0;
lc.clearDisplay(0);
inputpassword();
}
}
void wing(long freq,int delaytime){
tone(beep,freq);
delay(delaytime);
noTone();
}Loading
esp32-s3-devkitc-1
esp32-s3-devkitc-1