包括指纹开锁、语音开锁、刷卡开锁
指纹模块AS608
语音模块ASR MO8-B
射频模块RC522
源码:
- #include <Adafruit_Fingerprint.h>
- #include <SoftwareSerial.h>
- #include <MFRC522.h>
- #include <MsTimer2.h>
- #include <U8glib.h>
- #include <SPI.h>
- #define SS_PIN 10 //RFID
- #define RST_PIN 9 //RFID
- #define SUO 8 //锁
- #define SONG 4 //语音
- #define SONGREST 5 //语音复位,高电平复位
- int LED1 = 14; //检测指示灯 绿的
- int LED2 = 15; //开锁指示灯 蓝的 另一个蓝色的是指纹的
- int LED3 = 7; //2分钟倒计时指示灯 红色
- int sign1=0; //RFID读取标志位
- int sign2=0; //指纹读取标志位
- int sign3=0; //语音读取标志位
- int mark1=0; //RFID读取标志位,定时器用
- int mark2=0; //指纹读取标志位,定时器用
- int mark3=0; //语音读取标志位,定时器用
- int i=1; //进一次定时器用
- int j=1; //语音模块赋值限制
- int sum=0; //验证通过的个数
- MFRC522 rfid(SS_PIN, RST_PIN); //实例化类10.11.12.13
- U8GLIB_SSD1306_128X64 u8g(16, 17, 2, 19, 18); // SW SPI OLED
- SoftwareSerial mySerial(2, 3); // 指纹
- Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
- byte nuidPICC[4]; // 初始化数组用于存储读取到的NUID
- byte show[4]; // 用来显示的数组
- byte figerPICC; // 初始化数组用于存储读取到的指纹序号
- void RFIDMain( );
- //中断函数开始
- void flash() //中断处理函数
- {
- sum=0; //归零
- mark1=0;
- mark2=0;
- mark3=0;
- digitalWrite(LED3,LOW); //关2分钟倒计时指示灯
- digitalWrite(SONGREST,LOW); //语音模块上电
- MsTimer2::stop();
- Serial.println("\n\n1分钟到了!!");
- i=1;
- j=1;
- }
- //中断函数结束
- void setup() {
- pinMode(SONG,INPUT);
- pinMode(SONGREST,OUTPUT);
- pinMode(LED1,OUTPUT);
- pinMode(LED2,OUTPUT);
- pinMode(LED3,OUTPUT);
- pinMode(SUO,OUTPUT);
-
- digitalWrite(SUO,HIGH);
- Serial.begin(9600);
-
- SPI.begin(); // 初始化SPI总线
- rfid.PCD_Init(); // 初始化 MFRC522
-
- MsTimer2::set(60000, flash); // 中断设置函数,每 60000ms、1min 进入一次中断 30s
-
- while (!Serial); // For Yun/Leo/Micro/Zero/... //指纹模块自检函数
- delay(100);
- Serial.println("\n\nAdafruit finger detect test");
-
- finger.begin(57600); // set the data rate for the sensor serial port
-
- if (finger.verifyPassword())
- {
- Serial.println("Found fingerprint sensor!");
- }
- else
- {
- Serial.println("Did not find fingerprint sensor :(");
- while (1) { delay(1); }
- }
-
- finger.getTemplateCount();
- Serial.print("Sensor contains ");
- Serial.print(finger.templateCount);
- Serial.println(" templates");
- Serial.println("Waiting for valid finger...");
-
-
- u8g.firstPage();
- do {
- u8g.setFont(u8g_font_unifont);
- u8g.setPrintPos(25, 35);
- u8g.print("GOOD LUCK");
- } while( u8g.nextPage() );
- }
- //main函数结束
-
- void loop()
- {
-
- sign3=digitalRead(SONG); //语音判断
- if(sign3==1 && j==1)
- {
- mark3=sign3;
- if(mark3==1)
- Serial.println("语音模块的标志位是1");
- j=0;
- }
-
-
- figerPICC=getFingerprintIDez(); //指纹识别
- delay(50);
-
- RFIDMain();
-
- sum=mark1+mark2+mark3; //计算验证通过的个数
- if(sum==1)
- Serial.println("sum是1");
- if(sum==1 && i==1)
- {
- MsTimer2::start(); //开始计时
- digitalWrite(LED3,HIGH); //开2分钟倒计时指示灯
- Serial.println("\n开定时器!!");
- i=0;
- }
-
-
- if(sign1==1 || sign2==1) //显示判断函数
- {
- if( nuidPICC[3]==0xdc || figerPICC==2)
- Serial.println("你好,韩先生!");
- else if(nuidPICC[3]==0xa3||figerPICC==1)
- Serial.println("你好,王先生!");
-
-
- u8g.firstPage();
- do {
- u8g.setFont(u8g_font_unifont);
-
- u8g.setPrintPos(0, 20);
- if( nuidPICC[3]==0xdc || figerPICC==2 )
- u8g.print("Hello Mr.Han!");
- else if(nuidPICC[3]==0xa3 || figerPICC==1)
- u8g.print("Hello Mr.Wang!");
-
- u8g.setPrintPos(0, 40);
- u8g.print("UID:");
- u8g.setPrintPos(35, 40);
- delay(100);
-
- if(sign1==1)
- {
- for(byte i=0;i<4;i++)
- show[i]=nuidPICC[i];
- }
-
- if(sign2==1)
- {
- show[3]=figerPICC;
- for(byte i=0;i<3;i++)
- show[i]=0;
- }
-
- u8g.print(show[0],HEX);
- u8g.print(show[1],HEX);
- u8g.print(show[2],HEX);
- u8g.print(show[3],HEX);
-
- sign2=0;
- sign1=0;
-
- } while( u8g.nextPage() );
-
- }
- if(sign3==1) //语音控制
- {
- Serial.println("你好,朋友!");
- u8g.setPrintPos(0, 20);
- u8g.print("Hello friend!");
-
- sign3=0;
- delay(100);
- digitalWrite(SONGREST,HIGH); //高电平复位
- Serial.println("\n语音模块断电了!!");
- delay(100); //确保最后使用语音时可以复位
- pinMode(SONG,OUTPUT);
- digitalWrite(SONG,LOW);
- delay(2000);
- pinMode(SONG,INPUT);
-
- }
-
- u8g.firstPage();
- do
- {
- if( sum==0 )
- {
- u8g.setFont(u8g_font_unifont);
- u8g.setPrintPos(25, 35);
- u8g.print("GOOD LUCK");
- }
- if( sum==1 ) //一种方式通过时显示next
- {
- u8g.setFont(u8g_font_unifont);
- u8g.setPrintPos(45, 35); //NEXT的位置需要居中~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- u8g.print("NEXT");
- }
-
- } while( u8g.nextPage() );
- if( sum>1 ) //开锁函数
- {
- digitalWrite(LED2,HIGH);
- digitalWrite(SUO,LOW);
- delay(1300);
- digitalWrite(LED2,LOW);
- digitalWrite(SUO,HIGH);
- digitalWrite(SONGREST,LOW); //语音模块上电复位
- u8g.setFont(u8g_font_unifont);
- u8g.setPrintPos(25, 35);
- u8g.print("GOOD LUCK");
- sum=0; //归零
- mark1=0;
- mark2=0;
- mark3=0;
- digitalWrite(LED3,LOW); //关2分钟倒计时指示灯
- MsTimer2::stop();
- Serial.println("\n\n关定时器!!");
- i=1;
- j=1;
-
- }
- }
- //loop函数结束loop函数结束loop函数结束loop函数结束loop函数结束loop函数结束loop函数结束loop函数结束loop函数结束loop函数结束loop函数结束loop函数结束loop函数结束loop函数结束
-
- void RFIDMain(void)
- {
- if ( ! rfid.PICC_IsNewCardPresent()) // 找卡 检测不到卡直接返回
- {
- digitalWrite(LED1,LOW);
- return;
- }
-
- digitalWrite(LED1,HIGH);
- delay(500);
- if ( ! rfid.PICC_ReadCardSerial()) // 验证NUID是否可读
- return;
-
- MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
-
- // 检查是否MIFARE卡类型
- if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
- piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
- piccType != MFRC522::PICC_TYPE_MIFARE_4K)
- {
- Serial.println("不支持读取此卡类型");
- return;
- }
-
- for (byte i = 0; i < 4; i++) // 将NUID保存到nuidPICC数组
- {
- nuidPICC[i] = rfid.uid.uidByte[i];
- }
-
- if( nuidPICC[3]==0xdc || nuidPICC[3]==0xa3) //验证RFID是否正确
- sign1=1; //RFID标志位
- mark1=1; //RFID标志位
-
- Serial.print("十六进制UID:");
- printHex(rfid.uid.uidByte, rfid.uid.size);
- Serial.println();
-
- rfid.PICC_HaltA(); // 使放置在读卡区的IC卡进入休眠状态,不再重复读卡
- rfid.PCD_StopCrypto1(); // 停止读卡模块编码
- }
- void printHex(byte *buffer, byte bufferSize)
- {
- for (byte i = 0; i < bufferSize; i++)
- {
- Serial.print(buffer[i] < 0x10 ? " 0" : "");
- Serial.print(buffer[i], HEX);
- }
- }
- //RFID模块结束
- uint8_t getFingerprintID()
- {
- uint8_t p = finger.getImage();
- switch (p)
- {
- case FINGERPRINT_OK:
- Serial.println("Image taken");
- break;
- case FINGERPRINT_NOFINGER:
- Serial.println("No finger detected");
- return p;
- case FINGERPRINT_PACKETRECIEVEERR:
- Serial.println("Communication error");
- return p;
- case FINGERPRINT_IMAGEFAIL:
- Serial.println("Imaging error");
- return p;
- default:
- Serial.println("Unknown error");
- return p;
- }
- // OK success!
- p = finger.image2Tz();
- switch (p)
- {
- case FINGERPRINT_OK:
- Serial.println("Image converted");
- break;
- case FINGERPRINT_IMAGEMESS:
- Serial.println("Image too messy");
- return p;
- case FINGERPRINT_PACKETRECIEVEERR:
- Serial.println("Communication error");
- return p;
- case FINGERPRINT_FEATUREFAIL:
- Serial.println("Could not find fingerprint features");
- return p;
- case FINGERPRINT_INVALIDIMAGE:
- Serial.println("Could not find fingerprint features");
- return p;
- default:
- Serial.println("Unknown error");
- return p;
- }
-
- // OK converted!
- p = finger.fingerFastSearch();
- if (p == FINGERPRINT_OK)
- {
- Serial.println("Found a print match!");
- }
- else if (p == FINGERPRINT_PACKETRECIEVEERR)
- {
- Serial.println("Communication error");
- return p;
- }
- else if (p == FINGERPRINT_NOTFOUND)
- {
- Serial.println("Did not find a match");
- return p;
- }
- else
- {
- Serial.println("Unknown error");
- return p;
- }
-
- // found a match!
- Serial.print("Found ID #"); Serial.print(finger.fingerID);
- Serial.print(" with confidence of "); Serial.println(finger.confidence); //相似度
- return finger.fingerID;
- }
- // returns -1 if failed, otherwise returns ID #
- 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 -1;
-
- // found a match!
- if(finger.fingerID==1||finger.fingerID==2) //验证指纹的正确与否
- sign2=1;
- mark2=1;
- Serial.print("Found ID #"); Serial.print(finger.fingerID);
- Serial.print(" with confidence of "); Serial.println(finger.confidence);
- return finger.fingerID;
- }
复制代码
全部资料51hei下载地址:
核心程序.rar
(575.11 KB, 下载次数: 100)
|