//  NFC门禁卡识别                 
#include <MFRC522.h>
#include <MFRC522Extended.h>
#include <Servo.h>//舵机头文件
#define SS_PIN 10    //定义SS和RST引脚
#define RST_PIN 9
Servo myservo;  // 定义Servo对象来控制
int pos = 90;    // 角度存储变量=初始角度

MFRC522 rfid(SS_PIN, RST_PIN);     //配置引脚
                                     
long int id[4];  //定义数组id存储读到的ID卡号
long int mm;  //定义密码函数

void setup() //初始化定义引脚
{
  Serial.begin(9600);  //设置波特率为9600
  SPI.begin();  //初始化读卡模块
  rfid.PCD_Init();
  Serial.begin(9600);
  Serial.println("RC522初始化完成...");
  
  pinMode(8, OUTPUT);   //定义引脚8输出，控制蜂鸣器
  myservo.attach(7);  // 控制线连接数字7
  myservo.write(pos);
}

void printDec(byte *buffer, byte bufferSize)  //十进制输出
{
  for (byte i = 0; i < bufferSize; i++) 
    {
      Serial.print(buffer[i] < 0x10 ? " 0" : "");
      Serial.print(buffer[i], DEC);
      id[i] = buffer[i];
    }
}

long int mima()//定义密码规则
{
  long int xmm = 0;

  id[1] = id[1] * 100000;
  id[2] = id[2] * 1000;
  id[3] = id[3] * 1;
  xmm = id[1] + id[2] + id[3];
  return xmm; 
}

void mimadui()
{
   
   for (pos = pos; 0<= pos; pos --) //舵机
    { 
    myservo.write(pos);
    delay(15);  }
    delay(5000); 
    
    for (pos = pos; pos <= 90; pos ++) //舵机
    { 
    myservo.write(pos);
    delay(50);  }
    
          }
          
void mimacuo()
{
  for(int i = 0 ; i < 4 ; i++)
  {
    digitalWrite(8, HIGH);
 
    delay(200);
    digitalWrite(8, LOW);

    delay(200);
    
  }   
}


void loop() {
  if (!rfid.PICC_IsNewCardPresent())                   //搜索新卡
    return;

  if (!rfid.PICC_ReadCardSerial())                    // 验证NUID是否可读
    return;

  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);

  
  printDec(rfid.uid.uidByte, rfid.uid.size);          //调用十进制输出函数
  Serial.println();
  mm = mima ();                                       //调用解密码函数
  Serial.println(mm);

if(mm == 6841151)//密码对，执行动作
  {
    mimadui(); 
  } 

  else
     mimacuo();//密码错，执行动作
 
  rfid.PICC_HaltA();         // 使放置在读卡区的IC卡进入休眠状态，不再重复读卡

  rfid.PCD_StopCrypto1();   // 停止读卡模块编码
}

 
