请选择 进入手机版 | 继续访问电脑版
查看: 91|回复: 1

[资料分享] 基于arduino的AS608驱动程序

[复制链接]

签到天数: 193 天

[LV.7]化身百千

发表于 2019-2-28 18:18:34 | 显示全部楼层 |阅读模式
#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:ICC_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;
}

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

本版积分规则

关闭

站长推荐上一条 /2 下一条

返回顶部