esp32 门禁系统 RFID-RC522(重要)

交互设计

  硬件准备:

  esp32主板:一块; RFID-RC522 感应主板 :一块 ; IC卡: 两张 ;杜邦线 :7根

  连接电路:

  RST 22SS/SDA 21MISO 27MOSI 26SCK 25IRQ 不用接

  软件编程:

  1、vs code 增加库

  2、代码部分

  #include <Arduino.h>#include <iostream>#include <string.h>#include <MFRC522.h>#include <sstream>#include <SPI.h> //注意上面连接电路 #define RST_PIN 22 //GPIO22#define SS_PIN 21 //GPIO21 SDA#define MISO_PIN 27 //GPIO27 spi 需要引脚#define MOSI_PIN 26 //GPIO26#define SCK_PIN 25 //GIPO25#define blockAddr 4 //For example; if blockAddr is 03h then pages 03h, 04h, 05h, 06h are returned.MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.MFRC522::MIFARE_Key key;void dump_byte_array(byte *buffer, byte bufferSize);bool isData(byte *buffer, byte *oldBuffer);void setup(){ Serial.begin(115200); Serial.println("2222"); SPI.begin(SCK_PIN,MISO_PIN,MOSI_PIN); // Init SPI bus SPI.setDataMode(SPI_MODE3); mfrc522.PCD_Init(); // Init MFRC522 card for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; } byte* b=new byte[4]; b[0]=0xFF; b[1]=0x01; b[2]=0x01; b[3]=0xFF; dump_byte_array(b,4); dump_byte_array(key.keyByte,MFRC522::MF_KEY_SIZE);}void loop(){ if(!mfrc522.PICC_IsNewCardPresent()){ //发现新卡的跳出 return; } if(!mfrc522.PICC_ReadCardSerial()){ //选择一张卡 return; } Serial.println("发现一张新卡"); //获取卡的id Serial.print("新卡id===>"); dump_byte_array(mfrc522.uid.uidByte,mfrc522.uid.size); //开始写入 byte dataBlock[] = { 0x15, 0x02, 0x00, 0x01, // 5, 2, 0, 1, 0x03, 0x01, 0x04, 0x08, // 3, 1, 4, 8, 0x09, 0x0a, 0xff, 0x0b, // 9, 10, 255, 11, 0x0c, 0x0d, 0x0e, 0x10 // 12, 13, 14, 15 }; byte trailerBlock = 7; Serial.print("构造数据:"); dump_byte_array(dataBlock, sizeof(dataBlock)); Serial.println(); //开始身份认证 MFRC522::StatusCode status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; }else{ Serial.println("------>"); } //开始读取数据 byte buffer[18]; //这里必须是长度18 byte size = sizeof(buffer); status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Read() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); }else{ Serial.print(F("MIFARE_Read() ok ")); } Serial.print(F("Data in block ")); dump_byte_array(buffer, sizeof(buffer)); Serial.println("\n==================*********====================="); //判断是否需要写入数据 if(!isData(buffer,dataBlock)){ status = (MFRC522::StatusCode) mfrc522.MIFARE_Write(blockAddr, dataBlock, 16); if (status != MFRC522::STATUS_OK) { Serial.print(F("====================>MIFARE_Write() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); }else{ Serial.println("写入成功"); } Serial.println(); }else{ Serial.println("已经写入过了不能再写入了"); } // Halt PICC mfrc522.PICC_HaltA(); // Stop encryption on PCD mfrc522.PCD_StopCrypto1();}//比较数据是否同样bool isData(byte *buffer, byte *oldBuffer){ bool is=false; if(sizeof(buffer)==sizeof(oldBuffer)){ int lSize=sizeof(buffer); for(int i=0;i<lSize;i++){ if(buffer[i]==oldBuffer[i]){ is=true; }else{ is=false; break; } } }else{ is=false; } return is;}//打印void dump_byte_array(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(" "); Serial.print(buffer[i]); }}显示效果:

  视频加载中...

标签: 交互设计