|
本帖最后由 一入极客深似海 于 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[i] < 0x10 ? " 0" : " ");
- Serial.print(buffer[i], HEX);
- NumBer+=buffer[i]; //将指针记录的值汇总成一个总值
- }
- 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[h])
- {
- 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 |
-
|