|
包括指紋開鎖、語音開鎖、刷卡開鎖
指紋模塊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 //語音復(fù)位,高電平復(fù)位
- int LED1 = 14; //檢測指示燈 綠的
- int LED2 = 15; //開鎖指示燈 藍(lán)的 另一個藍(lán)色的是指紋的
- int LED3 = 7; //2分鐘倒計時指示燈 紅色
- int sign1=0; //RFID讀取標(biāo)志位
- int sign2=0; //指紋讀取標(biāo)志位
- int sign3=0; //語音讀取標(biāo)志位
- int mark1=0; //RFID讀取標(biāo)志位,定時器用
- int mark2=0; //指紋讀取標(biāo)志位,定時器用
- int mark3=0; //語音讀取標(biāo)志位,定時器用
- int i=1; //進(jìn)一次定時器用
- int j=1; //語音模塊賦值限制
- int sum=0; //驗證通過的個數(shù)
- 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]; // 初始化數(shù)組用于存儲讀取到的NUID
- byte show[4]; // 用來顯示的數(shù)組
- byte figerPICC; // 初始化數(shù)組用于存儲讀取到的指紋序號
- void RFIDMain( );
- //中斷函數(shù)開始
- void flash() //中斷處理函數(shù)
- {
- sum=0; //歸零
- mark1=0;
- mark2=0;
- mark3=0;
- digitalWrite(LED3,LOW); //關(guān)2分鐘倒計時指示燈
- digitalWrite(SONGREST,LOW); //語音模塊上電
- MsTimer2::stop();
- Serial.println("\n\n1分鐘到了!");
- i=1;
- j=1;
- }
- //中斷函數(shù)結(jié)束
- 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); // 中斷設(shè)置函數(shù),每 60000ms、1min 進(jìn)入一次中斷 30s
-
- while (!Serial); // For Yun/Leo/Micro/Zero/... //指紋模塊自檢函數(shù)
- 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函數(shù)結(jié)束
-
- void loop()
- {
-
- sign3=digitalRead(SONG); //語音判斷
- if(sign3==1 && j==1)
- {
- mark3=sign3;
- if(mark3==1)
- Serial.println("語音模塊的標(biāo)志位是1");
- j=0;
- }
-
-
- figerPICC=getFingerprintIDez(); //指紋識別
- delay(50);
-
- RFIDMain();
-
- sum=mark1+mark2+mark3; //計算驗證通過的個數(shù)
- 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) //顯示判斷函數(shù)
- {
- 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); //高電平復(fù)位
- Serial.println("\n語音模塊斷電了。");
- delay(100); //確保最后使用語音時可以復(fù)位
- 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 ) //開鎖函數(shù)
- {
- digitalWrite(LED2,HIGH);
- digitalWrite(SUO,LOW);
- delay(1300);
- digitalWrite(LED2,LOW);
- digitalWrite(SUO,HIGH);
- digitalWrite(SONGREST,LOW); //語音模塊上電復(fù)位
- u8g.setFont(u8g_font_unifont);
- u8g.setPrintPos(25, 35);
- u8g.print("GOOD LUCK");
- sum=0; //歸零
- mark1=0;
- mark2=0;
- mark3=0;
- digitalWrite(LED3,LOW); //關(guān)2分鐘倒計時指示燈
- MsTimer2::stop();
- Serial.println("\n\n關(guān)定時器!");
- i=1;
- j=1;
-
- }
- }
- //loop函數(shù)結(jié)束loop函數(shù)結(jié)束loop函數(shù)結(jié)束loop函數(shù)結(jié)束loop函數(shù)結(jié)束loop函數(shù)結(jié)束loop函數(shù)結(jié)束loop函數(shù)結(jié)束loop函數(shù)結(jié)束loop函數(shù)結(jié)束loop函數(shù)結(jié)束loop函數(shù)結(jié)束loop函數(shù)結(jié)束loop函數(shù)結(jié)束
-
- 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數(shù)組
- {
- nuidPICC[i] = rfid.uid.uidByte[i];
- }
-
- if( nuidPICC[3]==0xdc || nuidPICC[3]==0xa3) //驗證RFID是否正確
- sign1=1; //RFID標(biāo)志位
- mark1=1; //RFID標(biāo)志位
-
- Serial.print("十六進(jìn)制UID:");
- printHex(rfid.uid.uidByte, rfid.uid.size);
- Serial.println();
-
- rfid.PICC_HaltA(); // 使放置在讀卡區(qū)的IC卡進(jìn)入休眠狀態(tài),不再重復(fù)讀卡
- 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模塊結(jié)束
- 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;
- }
復(fù)制代碼
全部資料51hei下載地址:
核心程序.rar
(575.11 KB, 下載次數(shù): 100)
2019-1-9 09:47 上傳
點擊文件名下載附件
程序和PCB圖 下載積分: 黑幣 -5
|
|