中大计赛-基于生物特征识别的IOT门禁系统-代码开源(电控)
2020-02-14 15:42
211 查看
中大计赛-基于生物特征识别的IOT门禁系统-代码开源(电控)
Arduino-1
- 控制密码输入与对比
#include<IRremote.h> //第三方红外解码库 #include <TTP229.h> //第三方触摸键盘库 #include <SoftwareSerial.h> //软串口库 SoftwareSerial Serial_terminal(14,15);//RX,TX,设置模块的软串口 #define SHOW_IN_SERIAL bool ray_or_TTP = 1; /*************************处理触摸键盘**************************/ const int TTP229_sclPin = 2; // 触摸时钟IO const int TTP229_sdoPin = 3; // 触摸数据IO TTP229 ttp229(TTP229_sclPin,TTP229_sdoPin); /************************处理红外信号***************************/ int recvPin = 5; //红外IO IRrecv irrecv(recvPin); //定义该io为红外接收口 decode_results results; //使用decode_results类,用于存储解码结果 const byte ROWS = 7; //解码含义表行列数 const byte COLS = 3; long remote_Code[ROWS][COLS] = { //遥控红外信号码值 {0x00FFA25D,0x00FF629D,0x00FFE21D}, {0x00FF22DD,0x00FF02FD,0x00FFC23D}, {0x00FFE01F,0x00FFA857,0x00FF906F}, {0x00FF6897,0x00FF9867,0x00FFB04F}, {0x00FF30CF,0x00FF18E7,0x00FF7A85}, {0x00FF10EF,0x00FF38C7,0x00FF5AA5}, {0x00FF42BD,0x00FF4AB5,0x00FF52AD} }; char remote_Mean[ROWS][COLS] = { //遥控码值对应意义 {'A','B','C'}, {'D','E','F'}, {'G','H','#'}, {'0','#','*'}, {'1','2','3'}, {'4','5','6'}, {'7','8','9'} }; /*********************处理密码问题*************************/ #define pass_admin_len_MAX 64 //密码最大长度 char password_custom[pass_admin_len_MAX] = {NULL}; //用户输入密码 char password_admin[pass_admin_len_MAX] = {NULL}; //初始标准密码 int pass_admin_len = 0; //用户所输入初始密码的长度 /**************************自定义函数**********************/ char get_ray_key(){ //通过红外线接收密码 irrecv.enableIRIn(); //红外端口使能,准备接受红外信号 while(1){ if(irrecv.decode(&results)){ //接收到信号并解码成功,把数据放入results变量中 for(int i = 0;i<ROWS;i++){ for(int j = 0;j<COLS;j++){ if((results.value) == remote_Code[i][j]){ //该信号有效,返回信号含义 Serial_terminal.print(remote_Mean[i][j]); #ifdef SHOW_IN_SERIAL Serial.print(remote_Mean[i][j]); #endif return (remote_Mean[i][j]); } } } irrecv.resume(); //继续等待接收下一组信号 } } } char get_TTP229_key(){ //通过键盘接收密码 int key = ttp229.ReadKey16(); // Blocking char key_c; if (key){ switch(key){ case 10: key_c = '0'; break; case 11: key_c = 'A'; break; case 12: key_c = 'B'; break; case 13: key_c = 'C'; break; case 14: key_c = 'D'; break; case 15: key_c = 'E'; break; case 16: key_c = '#'; break; default: key_c = key+48; } ttp229.ReadKey16(); //清空缓存区,解决choice被计入密码的bug Serial_terminal.print(key_c); #ifdef SHOW_IN_SERIAL Serial.print(key_c); #endif return key_c; } } void password_change(){ pass_admin_len = 0; #ifdef SHOW_IN_SERIAL Serial.println("Input your init_key:"); #endif char customKey; //接受用户输入的初始密码,以"EQ"作为结束符 if(ray_or_TTP) customKey = get_ray_key(); else customKey = get_TTP229_key(); while(customKey != '#'){ password_admin[pass_admin_len++] = customKey; if(ray_or_TTP) customKey = get_ray_key(); else customKey = get_TTP229_key(); } #ifdef SHOW_IN_SERIAL Serial.println("The initial password is set."); #endif Serial_terminal.print('P'); //Serial.println(pass_admin_len); } void password_unlock(){ int pass_custom_len = 0; //用户输入密码长度 #ifdef SHOW_IN_SERIAL Serial.print("Input your passward:"); #endif char customKey; //先将用户输入密码保存,以"#"作为结束符 if(ray_or_TTP) customKey = get_ray_key(); else customKey = get_TTP229_key(); while(customKey != '#'){ password_custom[pass_custom_len++] = customKey; if(ray_or_TTP) customKey = get_ray_key(); else customKey = get_TTP229_key(); } //Serial.println(pass_custom_len); //判断密码是否正确,flag为标志位,flag_invert为逆序输入,用于报警信息 bool flag = 0,flag_invert = 0; //密码是否正确标志位,1为正确 int custom_i = 0,admin_j = 0; bool last_same = 0; while((custom_i<pass_custom_len) && (admin_j<pass_admin_len)){ if((password_custom[custom_i] != password_admin[admin_j]) && (last_same == 0)){ custom_i++; last_same = 0; } else if((password_custom[custom_i] != password_admin[admin_j]) && (last_same == 1)){ admin_j = 0; last_same = 0; } else if(password_custom[custom_i] == password_admin[admin_j]){ custom_i++; admin_j++; last_same = 1; } if(admin_j == pass_admin_len) flag = 1; } if(!flag){ custom_i = 0,admin_j = pass_admin_len-1; last_same = 0; while((custom_i<pass_custom_len) && (admin_j >= 0)){ if((password_custom[custom_i] != password_admin[admin_j]) && (last_same == 0)){ custom_i++; last_same = 0; } else if((password_custom[custom_i] != password_admin[admin_j]) && (last_same == 1)){ admin_j = pass_admin_len-1; last_same = 0; } else if(password_custom[custom_i] == password_admin[admin_j]){ custom_i++; admin_j--; last_same = 1; } if(admin_j == -1) flag_invert = 1; } } //判断完成执行的操作 if(flag){ #ifdef SHOW_IN_SERIAL Serial.println(" PASS!"); #endif Serial_terminal.print('O'); } if(flag_invert){//逆序输入密码,报警 #ifdef SHOW_IN_SERIAL Serial.println("urgency"); #endif Serial_terminal.print('U'); } if(!flag && !flag_invert){ #ifdef SHOW_IN_SERIAL Serial.println(" ERROR!"); #endif Serial_terminal.print('L'); } //执行完毕后,破坏原数组 for(int i = 0;i<pass_admin_len;i++){ password_custom[i] = {"x"}; } } /*************************主函数******************************/ void setup(){ Serial_terminal.begin(9600); Serial.begin(115200); irrecv.enableIRIn(); if(ray_or_TTP)//解决reset后不同步的问题 get_ray_key(); else get_TTP229_key(); } void loop(){ static char data_in; if(Serial_terminal.available()>0){//接收终端指令 switch(data_in = Serial_terminal.read()){ case '@': if(ray_or_TTP) get_ray_key(); else get_TTP229_key(); break; case 'K': ray_or_TTP = 0; break; case 'R': ray_or_TTP = 1; break; case 'P': //密码解锁 password_unlock(); break; case 'C': //更换密码 password_change(); break; //default: } } }
Arduino-2
- 指纹、人脸数据传输、物联网传输
#include <Adafruit_Fingerprint.h> // #define SHOW_IN_SERIAL SoftwareSerial mySerial(14,15); //RX,TX 与指纹传感器通信 SoftwareSerial Serial_terminal(8,9);//RX,TX 与终端通信 int reset_Pin = 5; Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); uint8_t id; void setup(){ Serial_terminal.begin(9600); Serial.begin(9600); pinMode(reset_Pin,INPUT); while(!Serial_terminal) #ifdef SHOW_IN_SERIAL Serial.println("Can't open serial_terminal"); #endif while (!Serial); delay(100); finger.begin(57600);//设置传感器串口波特率 finger_init(); } void loop(){ Serial_terminal.listen(); char data_in; if(Serial_terminal.available()>0){ data_in = Serial_terminal.read();//从终端接收消息,执行功能函数 mySerial.listen(); switch (data_in){ //指纹指令 case 'Y': finger_unlock(); break; case 'N': finger_new(); break; case 'M': finger_delete(); break; case 'Z': finger.getTemplateCount(); Serial_terminal.print(finger.templateCount); break; //人脸指令,只传输 case 'X': //关闭人脸识别 case 'F': //开启人脸识别 case 'Q': //新建人脸 case 'T': //查看人脸数量 Serial.print(data_in); break; //记录指令,传输2位 case 'C': Serial.print('C'); //密码开锁记录 break; case 'A': Serial.print('A'); //刷卡开锁记录 break; case 'U': Serial.print('U'); //报警 break; default: delay(500); Serial.print(data_in); break; } } Serial_terminal.listen(); if(Serial.available()>0){ Serial_terminal.print(data_in = Serial.read()); // Serial.print(data_in); } } void finger_unlock(){ while(1){//RESET终止 mySerial.listen(); finger_matching();//默认一直匹配指纹 if(digitalRead(reset_Pin)<=0){//按下任意键就RESET return; } } } //指纹模块初始化 void finger_init(){ #ifdef SHOW_IN_SERIAL Serial.println("Fingerprint init over"); #endif if (finger.verifyPassword()) { #ifdef SHOW_IN_SERIAL Serial.println("Found fingerprint sensor!"); #endif } else { #ifdef SHOW_IN_SERIAL Serial.println("Did not find fingerprint sensor :("); #endif while(1){ delay(1); } } finger.getTemplateCount(); #ifdef SHOW_IN_SERIAL Serial.print("The number of fingerprints is "); Serial.print(finger.templateCount); Serial.println("Waiting for valid finger..."); #endif } //指纹匹配 void finger_matching(){ int finger_label = getFingerprintIDez(); if(finger_label != -1 && finger_label != 0){ Serial_terminal.print('O');//给终端发数据开锁 //给linux发送数据记录开锁记录 Serial.print('B'); delay(500); Serial.print(finger_label); #ifdef SHOW_IN_SERIAL Serial.println(''); Serial.println('O'); #endif } delay(50);//最高速率 } //指纹录入 void finger_new(){ #ifdef SHOW_IN_SERIAL Serial.println("Ready to enroll a fingerprint!"); Serial.println("Please type in the ID # (from 1 to 127) you want to save this finger as..."); #endif finger.getTemplateCount(); #ifdef SHOW_IN_SERIAL Serial.println(finger.templateCount+1); #endif id = finger.templateCount + 1; // if (id == 0) {// ID #0 not allowed, try again! // return; // } #ifdef SHOW_IN_SERIAL Serial.print("Enrolling ID #"); Serial.println(id); #endif Serial_terminal.print((char)92); //提示用户按下手指 while (!getFingerprintEnroll() ); } //指纹删除 void finger_delete(){ #ifdef SHOW_IN_SERIAL Serial.println("Please type in the ID # (from 1 to 127) you want to delete..."); #endif Serial_terminal.print((char)92); //提示用户按下手指 int finger_label = -1; while (finger_label == -1){ //等待按下有效指纹 finger_label = getFingerprintIDez(); if(finger_label == 0){ Serial_terminal.print((char)124); //按下的指纹没有被录入,删除失败 } } uint8_t id = (uint8_t)finger_label; // if (id == 0) {// ID #0 not allowed, try again! // return; // } #ifdef SHOW_IN_SERIAL Serial.print("Deleting ID #"); Serial.println(id); #endif deleteFingerprint(id); } //指纹匹配核心 //返回0即为没有匹配到指纹,-1为没有指纹,其他为指纹标签 int getFingerprintIDez() { uint8_t p = finger.getImage(); if (p != FINGERPRINT_OK) return -1; p = finger.image2Tz(); if (p != FINGERPRINT_OK) return -1; p = finger.fingerFastSearch(); if (p != FINGERPRINT_OK) return 0; //匹配到指纹 #ifdef SHOW_IN_SERIAL Serial.print("Found ID #"); Serial.print(finger.fingerID); Serial.print(" with confidence of "); Serial.println(finger.confidence); #endif return finger.fingerID; } uint8_t getFingerprintEnroll() {//指纹录入核心 int p = -1; Serial_terminal.print((char)92);//发送显示指令 #ifdef SHOW_IN_SERIAL Serial.print("Waiting for valid finger to enroll as #"); Serial.println(id); #endif while (p != FINGERPRINT_OK) { p = finger.getImage(); #ifdef SHOW_IN_SERIAL switch (p) { case FINGERPRINT_OK: Serial.println("Image taken"); break; case FINGERPRINT_NOFINGER: Serial.println("."); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); break; case FINGERPRINT_IMAGEFAIL: Serial.println("Imaging error"); break; default: Serial.println("Unknown error"); break; } #endif } // OK success! p = finger.image2Tz(1); #ifdef SHOW_IN_SERIAL switch (p) { case FINGERPRINT_OK: Serial.println("Image converted"); break; case FINGERPRINT_IMAGEMESS: Serial.println("Image too messy"); Serial_terminal.print((char)96);//发送显示指令 return 1; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); Serial_terminal.print((char)96);//发送显示指令 return 1; case FINGERPRINT_FEATUREFAIL: Serial.println("Could not find fingerprint features"); Serial_terminal.print((char)96);//发送显示指令 return 1; case FINGERPRINT_INVALIDIMAGE: Serial.println("Could not find fingerprint features"); Serial_terminal.print((char)96);//发送显示指令 return 1; default: Serial.println("Unknown error"); Serial_terminal.print((char)96);//发送显示指令 return 1; } #endif Serial_terminal.print((char)93);//发送显示指令 #ifdef SHOW_IN_SERIAL Serial.println("Remove finger"); #endif delay(500); p = 0; while (p != FINGERPRINT_NOFINGER) { p = finger.getImage(); } #ifdef SHOW_IN_SERIAL Serial.print("ID "); Serial.println(id); #endif p = -1; Serial_terminal.print((char)94);//发送显示指令 #ifdef SHOW_IN_SERIAL Serial.println("Place same finger again"); #endif while (p != FINGERPRINT_OK) { p = finger.getImage(); #ifdef SHOW_IN_SERIAL switch (p) { case FINGERPRINT_OK: Serial.println("Image taken"); break; case FINGERPRINT_NOFINGER: Serial.print("."); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); break; case FINGERPRINT_IMAGEFAIL: Serial.println("Imaging error"); break; default: Serial.println("Unknown error"); break; } #endif } // OK success! p = finger.image2Tz(2); #ifdef SHOW_IN_SERIAL switch (p) { case FINGERPRINT_OK: Serial.println("Image converted"); break; case FINGERPRINT_IMAGEMESS: Serial.println("Image too messy"); Serial_terminal.print((char)96);//发送显示指令 return 1; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); Serial_terminal.print((char)96);//发送显示指令 return 1; case FINGERPRINT_FEATUREFAIL: Serial.println("Could not find fingerprint features"); Serial_terminal.print((char)96);//发送显示指令 return 1; case FINGERPRINT_INVALIDIMAGE: Serial.println("Could not find fingerprint features"); Serial_terminal.print((char)96);//发送显示指令 return 1; default: Serial.println("Unknown error"); Serial_terminal.print((char)96);//发送显示指令 return 1; } #endif // OK converted! #ifdef SHOW_IN_SERIAL Serial.print("Creating model for #"); Serial.println(id); #endif p = finger.createModel(); if (p == FINGERPRINT_OK) { #ifdef SHOW_IN_SERIAL Serial.println("Prints matched!"); #endif } else if (p == FINGERPRINT_PACKETRECIEVEERR) { #ifdef SHOW_IN_SERIAL Serial.println("Communication error"); #endif Serial_terminal.print((char)96);//发送显示指令 return 1; } else if (p == FINGERPRINT_ENROLLMISMATCH) { #ifdef SHOW_IN_SERIAL Serial.println("Fingerprints did not match"); #endif Serial_terminal.print((char)96);//发送显示指令 return 1; } else { #ifdef SHOW_IN_SERIAL Serial.println("Unknown error"); #endif Serial_terminal.print((char)96);//发送显示指令 return 1; } #ifdef SHOW_IN_SERIAL Serial.print("ID "); Serial.println(id); #endif p = finger.storeModel(id); if (p == FINGERPRINT_OK) { Serial_terminal.print((char)95);//发送显示指令 #ifdef SHOW_IN_SERIAL Serial.println("Stored!"); #endif return 1; } else if (p == FINGERPRINT_PACKETRECIEVEERR) { Serial_terminal.print((char)96);//发送显示指令 #ifdef SHOW_IN_SERIAL Serial.println("Communication error"); #endif return 1; } else if (p == FINGERPRINT_BADLOCATION) { Serial_terminal.print((char)96);//发送显示指令 #ifdef SHOW_IN_SERIAL Serial.println("Could not store in that location"); #endif return 1; } else if (p == FINGERPRINT_FLASHERR) { Serial_terminal.print((char)96);//发送显示指令 #ifdef SHOW_IN_SERIAL Serial.println("Error writing to flash"); #endif return 1; } else { #ifdef SHOW_IN_SERIAL Serial.println("Unknown error"); #endif Serial_terminal.print((char)96);//发送显示指令 return 1; } } //指纹删除核心 uint8_t deleteFingerprint(uint8_t id) { uint8_t p = -1; p = finger.deleteModel(id); if (p == FINGERPRINT_OK) { #ifdef SHOW_IN_SERIAL Serial.println("Deleted!"); #endif Serial_terminal.print((char)123);//发送显示指令 } else if (p == FINGERPRINT_PACKETRECIEVEERR) { #ifdef SHOW_IN_SERIAL Serial.println("Communication error"); #endif Serial_terminal.print((char)124);//发送显示指令 return p; } else if (p == FINGERPRINT_BADLOCATION) { #ifdef SHOW_IN_SERIAL Serial.println("Could not delete in that location"); #endif Serial_terminal.print((char)124);//发送显示指令 return p; } else if (p == FINGERPRINT_FLASHERR) { #ifdef SHOW_IN_SERIAL Serial.println("Error writing to flash"); #endif Serial_terminal.print((char)124);//发送显示指令 return p; } else { #ifdef SHOW_IN_SERIAL Serial.print("Unknown error: 0x"); Serial.println(p, HEX); #endif Serial_terminal.print((char)124);//发送显示指令 return p; } }
Arduino-3
- 主控
#include <Servo.h> //官方舵机控制库 #include <Adafruit_SSD1306.h> //第三方oled库 #include <SoftwareSerial.h> //软串口库 #include <SPI.h> #include <MFRC522.h> #include <HardwareSerial.h> #define MAXSIZE_IC_UID 8 #define SS_PIN 10 #define RST_PIN 9 // #define SHOW_RFID_IN_SERIAL /********************各功能状态*************/ bool state_face=0,state_finger=1,state_password=1,state_rfid=1,state_app = 1; bool state_input_way = 1; //1:默认红外,2:触摸键盘 SoftwareSerial Serial_key(2,3); //RX,TX,与密码模块通信的软串口 /*************************处,理蜂鸣器***************************/ int buzzerPin = 7; //蜂鸣器IO /**************************处理舵机***************************/ Servo servo_door; //定义舵机变量名 int servoPin = 8; //舵机IO /**********************处理oled************************/ #define OLED_RESET 4 //UNO:SDA=a4 SCL=a5 ;pro micro:SDA=2 SCL=3 Adafruit_SSD1306 display(OLED_RESET); #if (SSD1306_LCDHEIGHT != 32) #error("Height incorrect, please fix Adafruit_SSD1306.h!"); #endif /**********************************处理RFID函数*************************/ MFRC522 rfid(SS_PIN, RST_PIN); //实例化类 // 初始化数组用于存储读取到的NUID void printUID(byte *buffer, byte bufferSize = 4, bool form = 0) { for (byte i = 0; i < bufferSize; i++) { //Serial.print(buffer[i] < 0x10 ? " 0" : ""); Serial.print(buffer[i], form == 0? HEX : DEC); Serial.print(' '); } } class IC_UID{ public: /*IC_UID(){ data = (byte**)malloc(sizeof(byte*) * MAXSIZE_IC_UID); for(int i = 0; i < MAXSIZE_IC_UID; i++) { data[i] = (byte*)malloc(sizeof(byte) * 4); } } void print_All_Uid(){ Serial.println("all data:"); for(int i = 0;i < size;i++){ Serial.print(i); Serial.print(": "); printUID(data[i]); Serial.println(); } }*/ // byte **data; byte data[MAXSIZE_IC_UID][4]; int size = 0; }; IC_UID icUid; /********************************处理舵机函数******************************/ void servo_open(){ for(int jiao=50;jiao<170;jiao++){ servo_door.write(jiao); delay(10); } delay(5000); for(int jiao=170;jiao>50;jiao--){ servo_door.write(jiao); delay(10); } } void servo_init(){ servo_door.write(50); delay(1000); } /********************************处理声音函数*****************************/ void voice_error(){ int i; for (i = 0; i < 100; i++) { digitalWrite(buzzerPin, HIGH); delay(1); digitalWrite(buzzerPin, LOW); delay(1); } for (i = 0; i < 100; i++) { digitalWrite(buzzerPin, HIGH); delay(2); digitalWrite(buzzerPin, LOW); delay(2); } } void voice_pass(){ int i; for (i = 0; i < 100; i++) { digitalWrite(buzzerPin, HIGH); delay(1); digitalWrite(buzzerPin, LOW); delay(1); } for (i = 0; i < 50; i++) { digitalWrite(buzzerPin, HIGH); delay(2); digitalWrite(buzzerPin, LOW); delay(2); } for (i = 0; i < 100; i++) { digitalWrite(buzzerPin, HIGH); delay(1); digitalWrite(buzzerPin, LOW); delay(1); } } void voice_input(){ for (int i = 0; i < 60; i++) { digitalWrite(buzzerPin, HIGH); delay(1); digitalWrite(buzzerPin, LOW); delay(1); } } /****************************** NEW_OLED_DISPLAY *********************************/ //显示输入的字符,不清屏 void oled_display_char(char x,int _size = 1,unsigned int _color = 1){ display.setTextSize(_size);//字体大小 if(_color){ display.setTextColor(WHITE);//文字颜色 } else{ display.setTextColor(BLACK, WHITE); } display.print(x); display.dis 4000 play(); } //清屏显示字符串 void oled_display_string(char *str,int _delayTime = 1000,int _size = 1,bool _color = 1){ display.clearDisplay(); display.setCursor(0,0); if(_color){ display.setTextColor(WHITE);//文字颜色 } else{ display.setTextColor(BLACK, WHITE); } display.setTextSize(_size); display.println(str); display.display(); if(_delayTime){ delay(_delayTime); display.setCursor(0,0); display.clearDisplay(); } } //主界面 void oled_Main_interface(unsigned char choice,bool setting_flag = 0){ display.clearDisplay(); display.setCursor(0,0); display.setTextSize(1); display.setTextColor(WHITE); if(setting_flag) display.println(" SYSTEM-SETTING"); else display.println(" ACCESS-CONTROL"); if(choice == 1){ display.setTextColor(BLACK,WHITE); } display.print("1.Password"); display.setTextColor(WHITE); display.print(" "); if(choice == 2){ display.setTextColor(BLACK,WHITE); } display.println("2.Finger"); display.setTextColor(WHITE); if(choice == 3){ display.setTextColor(BLACK,WHITE); } display.print("3.Face"); display.setTextColor(WHITE); display.print(" "); if(choice == 4){ display.setTextColor(BLACK,WHITE); } display.println("4.Rfid"); display.setTextColor(WHITE); if(choice == 5){ display.setTextColor(BLACK,WHITE); } display.print("5.APP"); display.setTextColor(WHITE); display.print(" "); if(choice == 6){ display.setTextColor(BLACK,WHITE); } if(setting_flag) display.println("6.<--Exit"); else display.println("6.Setting"); display.display(); if(choice != 0){ delay(500); display.setCursor(0,0); display.clearDisplay(); } } void oled_func_setting(char *func,unsigned char choice = 0){ display.clearDisplay(); display.setCursor(0,0); display.setTextSize(1); display.setTextColor(WHITE); display.print(" 18287 "); display.print(func); display.println("-SETTING"); if(choice == 1) display.setTextColor(BLACK,WHITE); display.print("1.New"); display.setTextColor(WHITE); display.print(" "); if(choice == 2) display.setTextColor(BLACK,WHITE); display.println("2.Delete"); display.setTextColor(WHITE); if(choice == 3) display.setTextColor(BLACK,WHITE); display.print("3.Number"); display.setTextColor(WHITE); display.print(" "); if(choice == 4) display.setTextColor(BLACK,WHITE); display.println("4.<-Back"); display.setTextColor(WHITE); display.print("5.Change state: "); switch (func[1]){ //显示该功能开关状态 case 'A': if(state_face) display.print("ON"); else display.print("OFF"); break; case 'I': if(state_finger) display.print("ON"); else display.print("OFF"); break; case 'F': if(state_rfid) display.print("ON"); else display.print("OFF"); break; default: break; } display.display(); if(choice > 0 && choice <5){ delay(500); display.setCursor(0,0); display.clearDisplay(); } } void oled_passward_setting(unsigned char choice = 0){ display.clearDisplay(); display.setCursor(0,0); display.setTextSize(1); display.setTextColor(WHITE); display.println(" PASSWORD-SETTING"); if(choice == 1) display.setTextColor(BLACK,WHITE); display.println("1.Change password"); display.setTextColor(WHITE); display.print("2.Change state: "); if(state_password) display.println("ON"); else display.println("OFF"); display.setTextColor(WHITE); if(choice == 3) display.setTextColor(BLACK,WHITE); display.print("3.<-Back"); display.setTextColor(WHITE); display.print(" 4."); if(state_input_way) display.println("Remote"); else display.println("Keyboard"); display.display(); if(choice == 3 || choice == 4){ delay(500); display.setCursor(0,0); display.clearDisplay(); } } /**********************************密码**********************************/ void password_unlock(){ Serial_key.print('P');//向主控板1发送用密码解锁指令 char data_in; oled_display_string("Enter your password:",0); while(1){ if(Serial_key.available()>0){ //Arduino1-密码 data_in = Serial_key.read(); //Serial.println(data_in); switch (data_in){ case 'O': //密码匹配成功,开门 Serial.print('C'); voice_pass(); oled_display_string("Welcome. :)",1000,2); servo_open(); return; case 'L': //密码匹配失败,锁定 voice_error(); oled_display_string("Error! :(",1000,2); servo_init(); return; case 'U': //密码匹逆序输入,报警 Serial.print('U'); voice_pass(); oled_display_string("Welcome. :)",1000,2); servo_open(); return; default: //显示输入的密码 voice_input(); oled_display_char(data_in,1,1); break; } } } } bool password_setting(){ char data_in; oled_passward_setting(0); Serial_key.print('@'); while(1){ //接收到用户输入就返回,1,2,3有效 if(Serial_key.available()>0){ switch (data_in = Serial_key.read()){ case '1': //更换密码 voice_input(); oled_passward_setting(1); password_change(); break; case '2': //功能开关 voice_input(); state_password = !state_password; break; case '3': //返回 voice_input(); oled_passward_setting(3); return 1; case '4': //输入方式开关 voice_input(); state_input_way = !state_input_way; if(state_input_way) //向主控板1发送默认输入方式 Serial_key.print('R'); else Serial_key.print('K'); break; default: voice_error(); oled_display_string("Invalid!",1000,2); break; } return 0; } } } void password_change(){ Serial_key.print('C'); oled_display_string("Input your key:",0); char data_in; while(1){ //接收到密码设定成功就返回,P有效 if(Serial_key.available()>0){ data_in = Serial_key.read(); if(data_in == 'P'){ //接收到p即密码设定完成 voice_pass(); oled_display_string("OK! :)",1000,2); servo_init(); return; } else{ //显示输入的密码 voice_input(); oled_display_char(data_in,1,1); } } } } /*************************************指纹***********************************/ bool finger_unlock(bool verify = 0){ digitalWrite(4,HIGH); Serial.print('Y'); //向arduino2发送指令,开始识别 Serial_key.print('@'); //向arduino1发送指令,准备接收任意键返回 oled_display_string("Verify finger,any key to exit..."); char data_in; while(1){ if(Serial_key.available()>0){//按任意键返回,并RESET指纹Arduino Serial_key.read(); voice_input(); //通过D4口RESET Arduino2,解决双软串口无法同时监视的问题 digitalWrite(4,LOW); return 0; } if(Serial.available()>0){ //Arduino2-指纹 data_in = Serial.read(); if(data_in == 'O'){ digitalWrite(4,LOW); voice_pass(); if(!verify){ oled_display_string("Welcome. :)",1000,2); servo_open(); } return 1; } oled_display_string("Verify finger,any key to exit..."); while(Serial.read()>=0){}//清空指纹和人脸识别结果的缓存区 } } } bool finger_setting(){ char data_in; oled_func_setting("FINGER",0); Serial_key.print('@'); while(1){ //接收到用户输入就返回,1,2,3有效 if(Serial_key.available()>0){ switch (data_in = Serial_key.read()){ case '1': voice_input(); oled_func_setting("FINGER",1); Serial.print('N');//向主控板2发送新建指纹指令 finger_judge(); break; case '2': voice_input(); oled_func_setting("FINGER",2); Serial.print('M');//向主控板2发送删除指纹指令 finger_judge(); break; case '3': voice_input(); oled_func_setting("FINGER",3); Serial.print('Z');//向主控板2发送查看指纹数量指令 while(1){ if(Serial.available()>0){ oled_display_char(Serial.read(),4); delay(1000); break; } } break; case '4': voice_input(); oled_func_setting("FINGER",4); return 1; case '5': voice_input(); state_finger = !state_finger; break; default: voice_error(); oled_display_string("Invalid!",1000,2); break; } return 0; } } } bool finger_judge(){ int ID; char data_in; while(1){ if(Serial.available()>0){ data_in = Serial.read(); switch (data_in) { case 92: oled_display_string("Press finger..."); break; case 93: oled_display_string("Move finger away."); break; case 94: oled_display_string("Press finger again..."); break; case 95: oled_display_string("Succeed :)",1000,2); return 1; break; case 96: oled_display_string("Failed,try again! :("); return 0; break; case 123: oled_display_string("Succeed :)",1000,2); break; case 124: oled_display_string("Failed,try again! :("); break; case 'S': oled_display_string("Put your face close..."); break; case 'W': oled_display_string("Succeed :)",1000,2); return 1; default: break; } if(data_in >=95 && data_in <= 123) break; } } } /***************************************人脸*****************************/ bool face_setting(){ char data_in; oled_func_setting("FACE",0); Serial_key.print('@'); while(1){ //接收到用户输入就返回,1,2,3有效 if(Serial_key.available()>0){ switch (data_in = Serial_key.read()){ case '1': voice_input(); oled_func_setting("FACE",1); Serial.print('Q');//向主控板2发送新建人脸指令 finger_judge(); break; case '2': voice_input(); Serial.print('D');//向主控板2发送新建人脸指令 finger_judge(); break; case '3': voice_input(); oled_func_setting("FACE",3); Serial.print('T');//向主控板2发送查看人脸数量指令 while(1){ if(Serial.available()>0){ oled_display_char(Serial.read(),4); delay(1000); break; } } break; case '4': voice_input(); oled_func_setting("FACE",4); return 1; case '5': voice_input(); state_face = !state_face; if(state_face) Serial.print('F'); //开启人脸识别 else Serial.print('X'); //关闭人脸识别 break; default: voice_error(); oled_display_string("Invalid!",1000,2); break; } return 0; } } } /***********************************刷卡*********************************/ bool rfid_setting(){ char data_in; oled_func_setting("RFID",0); Serial_key.print('@'); while(1){ //接收到用户输入就返回,1-5有效 if(Serial_key.available()>0){ switch (data_in = Serial_key.read()){ case '1': voice_input(); oled_func_setting("RFID",1); new_uid(); break; case '2': voice_input(); oled_func_setting("RFID",2); delete_uid(); break; case '3': voice_input(); oled_func_setting("RFID",3); oled_display_char(icUid.size+48,4); delay(1000); break; case '4': voice_input(); oled_func_setting("RFID",4); return 1; case '5': voice_input(); state_rfid = !state_rfid; break; default: voice_error(); oled_display_string("Invalid!",1000,2); break; } return 0; } } } void new_uid(){ oled_display_string("Place your card...",0); static int label = 0; /*Serial.print("Input your label:"); while(Serial.available()<=0){}*/ //while(Serial.read()<0){}; #ifdef SHOW_RFID_IN_SERIAL Serial.println(label); Serial.println("Put your card... ..."); #endif while(1){ //找卡 if ( ! rfid.PICC_IsNewCardPresent()) continue; // 验证NUID是否可读 if ( ! rfid.PICC_ReadCardSerial()) continue; MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); // 将NUID保存到数组 for (byte i = 0; i < 4; i++) { icUid.data[label][i] = rfid.uid.uidByte[i]; } icUid.size++; #ifdef SHOW_RFID_IN_SERIAL Serial.print("十六进制UID:"); printUID(icUid.data[label]); Serial.println(); #endif /*Serial.print("十进制UID:"); printUID(rfid.uid.uidByte, rfid.uid.size, 1); Serial.println();*/ // 使放置在读卡区的IC卡进入休眠状态,不再重复读卡 rfid.PICC_HaltA(); // 停止读卡模块编码 rfid.PCD_StopCrypto1(); label++; voice_pass(); oled_display_string("Successfully created! :)"); return; } } //匹配卡 int match_uid(){ //找卡 if (!rfid.PICC_IsNewCardPresent()) return -1; // 验证NUID是否可读 if (!rfid.PICC_ReadCardSerial()) return -1; //读卡,保存卡id MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); byte temp_uid[4]; for (int i = 0; i < 4; i++){ temp_uid[i] = rfid.uid.uidByte[i]; } //匹配 for (int i = 0; i < icUid.size; i++){ for (int j = 0; j < 4; j++){ if (temp_uid[j] != icUid.data[i][j]){ continue; } //匹配成功,并返回卡在icUid.data中的索引 if (j == 3){ // 使放置在读卡区的IC卡进入休眠状态,不再重复读卡 rfid.PICC_HaltA(); // 停止读卡模块编码 rfid.PCD_StopCrypto1(); return i; } } } // 使放置在读卡区的IC卡进入休眠状态,不再重复读卡 rfid.PICC_HaltA(); // 停止读卡模块编码 rfid.PCD_StopCrypto1(); return -1; } //删除已保存的卡 void delete_uid() { oled_display_string("Place your card...",0); int index; while(1){ index = match_uid(); if(index >= 0) break; } for (int i = index + 1; i < icUid.size; i++){ int j = i - 1; for(unsigned char k = 0;k<4;k++) icUid.data[j][k] = icUid.data[i][k]; } icUid.size--; voice_pass(); oled_display_string("Successfully deleted! :)"); } /**************************************主函数***************************************/ bool system_setting(){ char data_in; Serial_key.print('@');//向主控板1发送用接收选择信息指令 oled_Main_interface(0,1); while(1){ //接收到用户输入就返回,1-6有效 if(Serial_key.available()>0){ switch (data_in = Serial_key.read()){ case '1': //密码设置 voice_input(); oled_Main_interface(1,1); while(!password_setting()); break; case '2': //指纹设置 voice_input(); oled_Main_interface(2,1); while(!finger_setting()); break; case '3': //人脸设置 voice_input(); oled_Main_interface(3,1); while(!face_setting()); break; case '4': //刷卡设置 voice_input(); oled_Main_interface(4,1); while(!rfid_setting()); break; case '5': //APP设置 voice_input(); oled_Main_interface(5,1); if(state_app) oled_display_string("ON -->",1000,2); else{ oled_display_string("OFF -->",1000,2); } state_app = 24000 !state_app; if(state_app) oled_display_string("ON",1000,2); else{ oled_display_string("OFF",1000,2); } break; case '6': //退出管理模式 voice_input(); oled_Main_interface(6,1); system_init(); return 1; default: voice_error(); oled_display_string("Invalid!",1000,2); break; } return 0; } } } bool system_init(){ Serial.print('Z'); //向主控板2发送查看指纹数量指令 if(state_input_way) //向主控板1发送默认输入方式 Serial_key.print('R'); else Serial_key.print('K'); unsigned char finger_num; while(1){ if(Serial.available()>0){ finger_num = Serial.read(); oled_display_string("Fingerprints:",0); oled_display_char(finger_num); delay(1000); if(finger_num >= '1' && finger_num <= '9'){ oled_display_string("OK.",500,4); return 1; } if(finger_num == '0'){ Serial.print('N'); return (finger_judge()); } } } } void setup(){ Serial.begin(9600);//各串口初始化 while(!Serial){} Serial_key.begin(9600); pinMode(4,OUTPUT); digitalWrite(4,LOW); SPI.begin(); // 初始化SPI总线 rfid.PCD_Init(); // 初始化 MFRC522 pinMode(buzzerPin,OUTPUT);//蜂鸣器初始化 servo_door.attach(servoPin); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //oled初始化 display.display(); delay(1000); display.clearDisplay(); while(!system_init()); //系统初始化,设置初始指纹 } void loop(){ while(Serial.read()>=0){}//清空指纹和人脸识别结果的缓存区 int match_result; char data_in; Serial_key.print('@');//向主控板1发送用接收选择信息指令 oled_Main_interface(0); while(1){ //接收到用户输入就返回,1,2,3,4有效,其余交接指令判断函数处理 if(Serial_key.available()>0){ switch (data_in = Serial_key.read()){ case '1': //密码解锁,需要进入 voice_input(); oled_Main_interface(1); if(state_password) password_unlock(); else oled_display_string("Disabled. :(",1000,2); break; case '2': //指纹解锁,需要进入 voice_input(); oled_Main_interface(2); if(state_finger) finger_unlock(); else oled_display_string("Disabled. :(",1000,2); break; case '3': //人脸解锁,默认开启 voice_input(); oled_Main_interface(3); if(state_face) oled_display_string("Enabled. :)",1000,2); else oled_display_string("Disabled. :(",1000,2); break; case '4': //刷卡解锁,默认开启 voice_input(); oled_Main_interface(4); if(state_rfid) oled_display_string("Enabled. :)",1000,2); else oled_display_string("Disabled. :(",1000,2); break; case '5': //APP解锁,默认开启 voice_input(); oled_Main_interface(5); if(state_app) oled_display_string("Enabled. :)",1000,2); else oled_display_string("Disabled. :(",1000,2); break; case '6': //管理模式,进入系统设置 voice_input(); oled_Main_interface(6); if(finger_unlock(1)) while(!system_setting()); break; default: voice_error(); oled_display_string("Invalid!",1000,2); break; } break; } if(state_rfid){ match_result = match_uid(); if(match_result >= 0){ Serial.print('A'); Serial.print(match_result); voice_pass(); oled_display_string("Welcome. :)",0,2); servo_open(); break; } } if(Serial.available()>0){ voice_input(); switch (data_in = Serial.read()){ case 'O': voice_pass(); oled_display_string("Welcome. :)",0,2); servo_open(); break; case 'F': state_face = 1; Serial.print('F'); //开启人脸识别 break; case 'f': state_face = 0; Serial.print('X'); //关闭人脸识别 break; case 'q': Serial.print('Q'); //向主控板2发送新建人脸指令 finger_judge(); break; case 'd': Serial.print('D');//向主控板2发送删除人脸指令 finger_judge(); break; case 't': Serial.print('T');//向主控板2发送查看人脸数量指令 while(1){ if(Serial.available()>0){ display.clearDisplay(); display.setCursor(0,0); oled_display_char(Serial.read(),4); delay(1000); break; } } break; case 'P': state_password = 1; break; case 'p': state_password = 0; break; case 'b': password_change(); break; case 'r': state_input_way = !state_input_way; if(state_input_way) //向主控板1发送默认输入方式 Serial_key.print('R'); else Serial_key.print('K'); break; case 'Z': state_finger = 1; break; case 'z': state_finger = 0; break; case 'n': Serial.print('N');//向主控板2发送新建指纹指令 finger_judge(); break; case 'm': Serial.print('M');//向主控板2发送删除指纹指令 finger_judge(); break; case 'l': Serial.print('Z');//向主控板2发送查看指纹数量指令 while(1){ if(Serial.available()>0){ display.clearDisplay(); display.setCursor(0,0); oled_display_char(Serial.read(),4); delay(1000); break; } } break; case 'C': state_rfid = 1; break; case 'c': state_rfid = 0; break; case 'i': new_uid(); break; case 'j': delete_uid(); break; case 'k': display.clearDisplay(); display.setCursor(0,0); oled_display_char(icUid.size+48,4); delay(1000); break; default: break; } break; } } }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- Arduino Esp8266 Nodemcu Blinker 物联网浇花系统 EspTouch配网使用方法
- 【完全原创】QT写的阿里云物联网模拟器小工具,可以在windows上连接云平台
- 稍微记录一下最近弄物联网服务器的小心得
- 物联网安全
- nRF51822外设应用[2]:GPIOTE的应用-按键检测
- 物联网IoT实习的记录分享(持续推进)
- 钱包被黑客入侵后,IOTA 加密货币关闭了整个网络
- IoT时代,物联网安全风险有哪些?
- 因美的IoT,结缘智能家居
- 物联网开发之 socket 通信点亮第一个 led 灯
- NB-IOT模组SIM7020供电测试
- 物联网时代下的展馆设计与发展
- 物联网课程设计-Zigbee组网及基于WiFi的传感器数据获取
- 物联网课程设计-通过Wifi控制Zigbee网络中执行器节点
- iotop 安装及使用
- index table (IOT)
- 2017中国物联网工程(本科)专业建设情况
- 电信IoT平台对接及使用
- 物联网和传感器
- 十几款国内外嵌入式(物联网、工业)操作系统介绍(至今总结最全)