找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8034|回复: 9
收起左侧

基于arduino的AS608+RC522极致智能门禁系统程序 ASR MO8-B语音

[复制链接]
ID:437557 发表于 2019-1-9 09:48 | 显示全部楼层 |阅读模式
包括指纹开锁、语音开锁、刷卡开锁
指纹模块AS608
语音模块ASR MO8-B
射频模块RC522

源码:
  1. #include <Adafruit_Fingerprint.h>
  2. #include <SoftwareSerial.h>
  3. #include <MFRC522.h>
  4. #include <MsTimer2.h>     
  5. #include <U8glib.h>
  6. #include <SPI.h>

  7. #define SS_PIN 10   //RFID
  8. #define RST_PIN 9   //RFID
  9. #define SUO 8       //锁
  10. #define SONG 4      //语音
  11. #define SONGREST 5  //语音复位,高电平复位

  12. int LED1 = 14;  //检测指示灯     绿的   
  13. int LED2 = 15;  //开锁指示灯     蓝的  另一个蓝色的是指纹的
  14. int LED3 = 7;   //2分钟倒计时指示灯     红色

  15. int sign1=0;   //RFID读取标志位
  16. int sign2=0;   //指纹读取标志位
  17. int sign3=0;   //语音读取标志位

  18. int mark1=0;   //RFID读取标志位,定时器用
  19. int mark2=0;   //指纹读取标志位,定时器用
  20. int mark3=0;   //语音读取标志位,定时器用

  21. int i=1;   //进一次定时器用
  22. int j=1;   //语音模块赋值限制

  23. int sum=0;     //验证通过的个数

  24. MFRC522 rfid(SS_PIN, RST_PIN);                //实例化类10.11.12.13
  25. U8GLIB_SSD1306_128X64 u8g(16, 17, 2, 19, 18);  // SW SPI OLED
  26. SoftwareSerial mySerial(2, 3);               // 指纹

  27. Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

  28. byte nuidPICC[4];   // 初始化数组用于存储读取到的NUID
  29. byte show[4];       // 用来显示的数组
  30. byte figerPICC;     // 初始化数组用于存储读取到的指纹序号

  31. void RFIDMain( );

  32. //中断函数开始


  33. void flash()       //中断处理函数
  34. {
  35.    sum=0;          //归零
  36.    mark1=0;
  37.    mark2=0;
  38.    mark3=0;
  39.    digitalWrite(LED3,LOW);                 //关2分钟倒计时指示灯

  40.    digitalWrite(SONGREST,LOW);             //语音模块上电
  41.    MsTimer2::stop();
  42.    Serial.println("\n\n1分钟到了!!");
  43.    i=1;
  44.    j=1;
  45. }
  46. //中断函数结束


  47. void setup() {
  48.     pinMode(SONG,INPUT);
  49.     pinMode(SONGREST,OUTPUT);
  50.     pinMode(LED1,OUTPUT);
  51.     pinMode(LED2,OUTPUT);
  52.     pinMode(LED3,OUTPUT);
  53.     pinMode(SUO,OUTPUT);
  54.    
  55.     digitalWrite(SUO,HIGH);
  56.     Serial.begin(9600);
  57.    
  58.     SPI.begin();       // 初始化SPI总线
  59.     rfid.PCD_Init();   // 初始化 MFRC522
  60.   
  61.     MsTimer2::set(60000, flash);        // 中断设置函数,每 60000ms、1min 进入一次中断                                                         30s
  62.   
  63.     while (!Serial);  // For Yun/Leo/Micro/Zero/...        //指纹模块自检函数
  64.     delay(100);
  65.     Serial.println("\n\nAdafruit finger detect test");
  66.   
  67.     finger.begin(57600);   // set the data rate for the sensor serial port
  68.    
  69.     if (finger.verifyPassword())
  70.     {
  71.       Serial.println("Found fingerprint sensor!");
  72.     }
  73.     else
  74.     {
  75.       Serial.println("Did not find fingerprint sensor :(");
  76.       while (1) { delay(1); }
  77.     }
  78.   
  79.     finger.getTemplateCount();
  80.     Serial.print("Sensor contains ");
  81.     Serial.print(finger.templateCount);
  82.     Serial.println(" templates");
  83.     Serial.println("Waiting for valid finger...");
  84.   
  85.    
  86.     u8g.firstPage();  
  87.     do {
  88.         u8g.setFont(u8g_font_unifont);
  89.         u8g.setPrintPos(25, 35);
  90.         u8g.print("GOOD LUCK");
  91.         } while( u8g.nextPage() );
  92. }
  93. //main函数结束


  94. void loop()
  95. {
  96.   
  97.     sign3=digitalRead(SONG);                  //语音判断
  98.     if(sign3==1 && j==1)
  99.       {
  100.         mark3=sign3;
  101.         if(mark3==1)
  102.             Serial.println("语音模块的标志位是1");
  103.         j=0;
  104.       }

  105.         
  106.       
  107.     figerPICC=getFingerprintIDez();           //指纹识别
  108.     delay(50);  
  109.   
  110.     RFIDMain();
  111.   
  112.     sum=mark1+mark2+mark3;                    //计算验证通过的个数

  113.     if(sum==1)
  114.         Serial.println("sum是1");

  115.     if(sum==1 && i==1)
  116.     {
  117.        MsTimer2::start();                     //开始计时
  118.        digitalWrite(LED3,HIGH);                //开2分钟倒计时指示灯
  119.        Serial.println("\n开定时器!!");
  120.        i=0;
  121.     }
  122.    
  123.    
  124.     if(sign1==1 || sign2==1)                    //显示判断函数
  125.     {
  126.       if( nuidPICC[3]==0xdc || figerPICC==2)
  127.        Serial.println("你好,韩先生!");
  128.       else if(nuidPICC[3]==0xa3||figerPICC==1)
  129.        Serial.println("你好,王先生!");
  130.       
  131.       
  132.       u8g.firstPage();  
  133.       do {
  134.           u8g.setFont(u8g_font_unifont);
  135.    
  136.           u8g.setPrintPos(0, 20);
  137.           if( nuidPICC[3]==0xdc || figerPICC==2 )
  138.           u8g.print("Hello Mr.Han!");
  139.           else if(nuidPICC[3]==0xa3 || figerPICC==1)
  140.           u8g.print("Hello Mr.Wang!");
  141.          
  142.           u8g.setPrintPos(0, 40);
  143.           u8g.print("UID:");
  144.           u8g.setPrintPos(35, 40);
  145.           delay(100);
  146.          
  147.           if(sign1==1)
  148.           {
  149.             for(byte i=0;i<4;i++)  
  150.               show[i]=nuidPICC[i];
  151.           }
  152.          
  153.           if(sign2==1)
  154.           {
  155.             show[3]=figerPICC;
  156.             for(byte i=0;i<3;i++)
  157.               show[i]=0;
  158.           }
  159.          
  160.           u8g.print(show[0],HEX);
  161.           u8g.print(show[1],HEX);
  162.           u8g.print(show[2],HEX);
  163.           u8g.print(show[3],HEX);  
  164.             
  165.           sign2=0;
  166.           sign1=0;
  167.          
  168.       } while( u8g.nextPage() );
  169.          
  170.     }
  171.     if(sign3==1)                  //语音控制
  172.       {
  173.        Serial.println("你好,朋友!");
  174.        u8g.setPrintPos(0, 20);
  175.        u8g.print("Hello friend!");
  176.       
  177.        sign3=0;
  178.        delay(100);

  179.        digitalWrite(SONGREST,HIGH);                          //高电平复位      
  180.        Serial.println("\n语音模块断电了!!");
  181.        delay(100);                                          //确保最后使用语音时可以复位   

  182.        pinMode(SONG,OUTPUT);
  183.        digitalWrite(SONG,LOW);                              
  184.        delay(2000);
  185.        pinMode(SONG,INPUT);
  186.       
  187.       }
  188.   
  189.     u8g.firstPage();  
  190.     do
  191.       {
  192.         if( sum==0 )
  193.         {
  194.           u8g.setFont(u8g_font_unifont);
  195.           u8g.setPrintPos(25, 35);
  196.           u8g.print("GOOD LUCK");
  197.         }   
  198.         if( sum==1 )                             //一种方式通过时显示next
  199.         {
  200.           u8g.setFont(u8g_font_unifont);
  201.           u8g.setPrintPos(45, 35);                //NEXT的位置需要居中~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  202.           u8g.print("NEXT");

  203.         }  
  204.         
  205.       } while( u8g.nextPage() );

  206.       if( sum>1 )                                  //开锁函数
  207.       {
  208.           digitalWrite(LED2,HIGH);
  209.           digitalWrite(SUO,LOW);
  210.           delay(1300);
  211.           digitalWrite(LED2,LOW);
  212.           digitalWrite(SUO,HIGH);

  213.           digitalWrite(SONGREST,LOW);             //语音模块上电复位

  214.           u8g.setFont(u8g_font_unifont);
  215.           u8g.setPrintPos(25, 35);
  216.           u8g.print("GOOD LUCK");

  217.           sum=0;          //归零
  218.           mark1=0;
  219.           mark2=0;
  220.           mark3=0;
  221.           digitalWrite(LED3,LOW);          //关2分钟倒计时指示灯
  222.           MsTimer2::stop();
  223.           Serial.println("\n\n关定时器!!");
  224.           i=1;
  225.           j=1;
  226.       
  227.       }


  228. }                                       
  229. //loop函数结束loop函数结束loop函数结束loop函数结束loop函数结束loop函数结束loop函数结束loop函数结束loop函数结束loop函数结束loop函数结束loop函数结束loop函数结束loop函数结束


  230. void RFIDMain(void)
  231. {

  232.     if ( ! rfid.PICC_IsNewCardPresent())    // 找卡 检测不到卡直接返回
  233.     {   
  234.        digitalWrite(LED1,LOW);
  235.        return;  
  236.      }
  237.         
  238.     digitalWrite(LED1,HIGH);
  239.     delay(500);
  240.     if ( ! rfid.PICC_ReadCardSerial())           // 验证NUID是否可读
  241.       return;
  242.    
  243.     MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
  244.    
  245.     // 检查是否MIFARE卡类型
  246.     if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&  
  247.       piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
  248.       piccType != MFRC522::PICC_TYPE_MIFARE_4K)
  249.       {
  250.         Serial.println("不支持读取此卡类型");
  251.         return;
  252.       }
  253.       
  254.     for (byte i = 0; i < 4; i++)              // 将NUID保存到nuidPICC数组
  255.       {
  256.         nuidPICC[i] = rfid.uid.uidByte[i];
  257.       }   
  258.   
  259.     if( nuidPICC[3]==0xdc || nuidPICC[3]==0xa3)              //验证RFID是否正确
  260.       sign1=1;  //RFID标志位
  261.       mark1=1;  //RFID标志位
  262.    
  263.     Serial.print("十六进制UID:");
  264.     printHex(rfid.uid.uidByte, rfid.uid.size);
  265.     Serial.println();
  266.    
  267.     rfid.PICC_HaltA();                                        // 使放置在读卡区的IC卡进入休眠状态,不再重复读卡
  268.     rfid.PCD_StopCrypto1();                                   // 停止读卡模块编码

  269. }


  270. void printHex(byte *buffer, byte bufferSize)
  271. {
  272.   for (byte i = 0; i < bufferSize; i++)
  273.   {
  274.     Serial.print(buffer[i] < 0x10 ? " 0" : "");
  275.     Serial.print(buffer[i], HEX);
  276.   }
  277. }
  278. //RFID模块结束



  279. uint8_t getFingerprintID()
  280. {
  281.     uint8_t p = finger.getImage();
  282.     switch (p)
  283.     {
  284.       case FINGERPRINT_OK:
  285.         Serial.println("Image taken");
  286.         break;
  287.       case FINGERPRINT_NOFINGER:
  288.         Serial.println("No finger detected");
  289.         return p;
  290.       case FINGERPRINT_PACKETRECIEVEERR:
  291.         Serial.println("Communication error");
  292.         return p;
  293.       case FINGERPRINT_IMAGEFAIL:
  294.         Serial.println("Imaging error");
  295.         return p;
  296.       default:
  297.         Serial.println("Unknown error");
  298.         return p;
  299.   }

  300.   // OK success!

  301.   p = finger.image2Tz();
  302.   switch (p)
  303.   {
  304.       case FINGERPRINT_OK:
  305.         Serial.println("Image converted");
  306.         break;
  307.       case FINGERPRINT_IMAGEMESS:
  308.         Serial.println("Image too messy");
  309.         return p;
  310.       case FINGERPRINT_PACKETRECIEVEERR:
  311.         Serial.println("Communication error");
  312.         return p;
  313.       case FINGERPRINT_FEATUREFAIL:
  314.         Serial.println("Could not find fingerprint features");
  315.         return p;
  316.       case FINGERPRINT_INVALIDIMAGE:
  317.         Serial.println("Could not find fingerprint features");
  318.         return p;
  319.       default:
  320.         Serial.println("Unknown error");
  321.         return p;
  322.   }
  323.   
  324.   // OK converted!
  325.   p = finger.fingerFastSearch();
  326.   if (p == FINGERPRINT_OK)
  327.     {
  328.       Serial.println("Found a print match!");
  329.     }
  330.   else if (p == FINGERPRINT_PACKETRECIEVEERR)
  331.     {
  332.       Serial.println("Communication error");
  333.       return p;
  334.     }
  335.   else if (p == FINGERPRINT_NOTFOUND)
  336.     {
  337.       Serial.println("Did not find a match");
  338.       return p;
  339.     }
  340.   else
  341.     {
  342.       Serial.println("Unknown error");
  343.       return p;
  344.     }   
  345.   
  346.   // found a match!
  347.   Serial.print("Found ID #"); Serial.print(finger.fingerID);
  348.   Serial.print(" with confidence of "); Serial.println(finger.confidence);    //相似度

  349.   return finger.fingerID;
  350. }

  351. // returns -1 if failed, otherwise returns ID #
  352. int getFingerprintIDez()
  353. {
  354.     uint8_t p = finger.getImage();
  355.     if (p != FINGERPRINT_OK)  return -1;
  356.   
  357.     p = finger.image2Tz();
  358.     if (p != FINGERPRINT_OK)  return -1;
  359.   
  360.     p = finger.fingerFastSearch();
  361.     if (p != FINGERPRINT_OK)  return -1;
  362.    
  363.     // found a match!
  364.     if(finger.fingerID==1||finger.fingerID==2)                               //验证指纹的正确与否
  365.       sign2=1;
  366.       mark2=1;
  367.     Serial.print("Found ID #"); Serial.print(finger.fingerID);
  368.     Serial.print(" with confidence of "); Serial.println(finger.confidence);
  369.     return finger.fingerID;
  370. }

复制代码

全部资料51hei下载地址:
核心程序.rar (575.11 KB, 下载次数: 100)
回复

使用道具 举报

ID:258474 发表于 2019-1-16 10:31 | 显示全部楼层
程序编译不通过,无法下载
回复

使用道具 举报

ID:497193 发表于 2019-3-24 12:27 | 显示全部楼层
是少了加载库吧!
回复

使用道具 举报

ID:407114 发表于 2019-4-17 23:30 | 显示全部楼层
这个是用UNO这个板子吗
回复

使用道具 举报

ID:407114 发表于 2019-4-17 23:30 | 显示全部楼层
这个是用UNO的板子吗
回复

使用道具 举报

ID:266108 发表于 2019-6-25 22:03 | 显示全部楼层
这个应该是用arduino2560板的,如果有个小教程就完美了,哈哈
回复

使用道具 举报

ID:437557 发表于 2019-8-12 09:33 | 显示全部楼层
520q 发表于 2019-4-17 23:30
这个是用UNO的板子吗

Nano。。
回复

使用道具 举报

ID:603422 发表于 2019-8-24 19:43 | 显示全部楼层
您好,我最近在做一个用Arduino R3的板子和AS608指纹模块,做一个指纹解锁,但是我不太会,我看到了您发的贴子,想和您交流一下,您能留一下您的联系方式吗?
回复

使用道具 举报

ID:437557 发表于 2019-11-12 10:50 | 显示全部楼层
千之平方 发表于 2019-8-24 19:43
您好,我最近在做一个用Arduino R3的板子和AS608指纹模块,做一个指纹解锁,但是我不太会,我看到了您发的 ...

你加油,我记得那会是有例程得,不是很复杂
回复

使用道具 举报

ID:248343 发表于 2020-4-1 18:39 | 显示全部楼层
看到这篇文章,还是得从一只蝙蝠说起
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表