esp8266+frc522点亮led-Arduino中文社区 - Powered by Discuz! Archiver

一入极客深似海 发表于 2021-1-20 20:12

esp8266+frc522点亮led

本帖最后由 一入极客深似海 于 2021-1-21 12:02 编辑

刷卡点亮led,改一下就是控制门的开关,这里给大家提供一种简单的思路。只是一个方法,正所谓条条大路通北京。
此程序是在CSDN上一位博主的示例程序基础上修改的,这是他的地址 https://blog.csdn.net/qq_31878883/article/details/88971935


/*
* 此例程为ESP8266(ESP12-Module)连接FRC522
*
* 引脚接线图
* SEP8266       FRC522
* ---------------------------
*   D1            RST
*   D2            SDA
*   D5            SCK
*   D6            MSOI
*   D7            MOSI
*   GND         GND
*   3.3V          3.3V
*               RQ (不接)   *   
*/
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN         5         // 配置针脚
#define SS_PIN          4
#define LED D4                //定义刷卡正确控制引脚
#define LED_err D8            //定义刷卡错误控制引脚


MFRC522 mfrc522(SS_PIN, RST_PIN);   // 创建新的RFID实例
MFRC522::MIFARE_Key key;

int NfcNum[]={733,887,539,664,692,836};//存储 需刷卡的值

int NumBer ;                            //定义全局变量,将存储卡的总值

void setup() {
Serial.begin(9600); // 设置串口波特率为9600
SPI.begin();      // SPI开始
mfrc522.PCD_Init(); // Init MFRC522 card

/*引脚初始化*/

pinMode(LED,OUTPUT);
pinMode(LED_err,OUTPUT);
digitalWrite(LED_err,0);
digitalWrite(LED,1);
   Serial.println();
   Serial.println("初始化完成");
}


void loop() {
// 寻找新卡
if ( ! mfrc522.PICC_IsNewCardPresent()) {
    //Serial.println("没有找到卡");
    return;
}

// 选择一张卡
if ( ! mfrc522.PICC_ReadCardSerial()) {
    Serial.println("没有卡可选");
    return;
}

// 显示卡片的详细信息
Serial.print(F("卡片 UID:"));
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
Serial.println();
Serial.print(F("卡片类型: "));
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
Serial.println(mfrc522.PICC_GetTypeName(piccType));

MFRC522::StatusCode status;
if (status != MFRC522::STATUS_OK) {
    Serial.print(F("身份验证失败?或者是卡链接失败"));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
}
//停止 PICC
mfrc522.PICC_HaltA();
//停止加密PCD
mfrc522.PCD_StopCrypto1();

return;
}

/**
   将字节数组转储为串行的十六进制值
*/
void dump_byte_array(byte *buffer, byte bufferSize) {

//byte num;
for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer < 0x10 ? " 0" : " ");
    Serial.print(buffer, HEX);
   NumBer+=buffer;                //将指针记录的值汇总成一个总值               
}
Serial.println();
    Serial.print("NumBer全值:");    //待上个循环完成后,打印NumBer的值
      Serial.println(NumBer);

         diandeng();
         NumBer=0;                // diandeng()完成后将NumBer的值清零,不然影响下次刷卡的计算
}

/*对NumBer和NfcNum[]数组的值进行对比,相同则开门,不同则报错 */

void diandeng(){

unsigned char NFC_OK=0;   
unsigned char h=0;

for( h=0;h<6;h++)
{
      if(NumBer==NfcNum)
      {
      NFC_OK=1;
      break;
      }
      else
      {
      NFC_OK=0;
      }
}
   if(NFC_OK==1)
    {
       digitalWrite(LED,0);
       Serial.println("刷卡正确:开门");
       Serial.println("5秒倒计时");
       delay(5000);
       Serial.println("关门");
       digitalWrite(LED,1);
    }
   else
   {
       Serial.println("卡不对,请重试");
       Serial.println("请在灯闪灭后重试");
       for(char i=0;i<3;i++)
       {
          digitalWrite(LED_err,1);
          delay(500);
          digitalWrite(LED_err,0);
          delay(500);
       }
    }
}视频链接,https://www.bilibili.com/video/BV1ez4y1S7CB
页: [1]
查看完整版本: esp8266+frc522点亮led