1.开发板

Arduino nano(168p)

 2.模块

带i2c转接板的lcd1602

继电器 

蜂鸣器 

rc522读卡器 

3. 代码

注意在这里修改你的卡号,这里使用的是十六进制的卡号。

nuidPICC[0]==0xd1&&nuidPICC[1]==0x8f&&nuidPICC[2]==0xfa&&nuidPICC[3]==0x24

如果你不知道卡号可以先使用这个程序,然后打开串口助手,刷卡就可以看到卡号了。

读卡号程序 

#include <SPI.h>
#include <MFRC522.h>

 
MFRC522 rfid(10, 9); //实例化类

 
// 初始化数组用于存储读取到的NUID 
byte nuidPICC[4];
 
void setup() { 
  Serial.begin(9600);
  SPI.begin(); // 初始化SPI总线
  rfid.PCD_Init(); // 初始化 MFRC522
}
 
void loop() {
 
  // 找卡
  if ( ! rfid.PICC_IsNewCardPresent())
    return;
 
  // 验证NUID是否可读
  if ( ! rfid.PICC_ReadCardSerial())
    return;
 
  MFRC522::PICC_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;
  }
  
  // 将NUID保存到nuidPICC数组
  for (byte i = 0; i < 4; i++) {
    nuidPICC[i] = rfid.uid.uidByte[i];
  }   
  Serial.print("十六进制UID:");
  printHex(rfid.uid.uidByte, rfid.uid.size);
  Serial.println();
  
  Serial.print("十进制UID:");
  printDec(rfid.uid.uidByte, rfid.uid.size);
  Serial.println();
  
  // 使放置在读卡区的IC卡进入休眠状态,不再重复读卡
  rfid.PICC_HaltA();
 
  // 停止读卡模块编码
  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);
  }
}
 
void printDec(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : "");
    Serial.print(buffer[i], DEC);
  }
}

主程序 

#include <SPI.h>
#include <MFRC522.h>
#include <LCD_I2C.h>

LCD_I2C lcd(0x27, 16, 2);
const int relayPin=2; 
int buzzerpin=8;
MFRC522 rfid(10, 9);
byte nuidPICC[4];
 
void setup() {
  lcd.begin(); // If you are using more I2C devices using the Wire library use lcd.begin(false)
  lcd.backlight();
  pinMode(relayPin,OUTPUT);
  pinMode(buzzerpin, OUTPUT);
  SPI.begin(); // 初始化SPI总线
  rfid.PCD_Init(); // 初始化 MFRC522
}
 
void loop() {
  lcd.print("     WAIT"); 
  if ( ! rfid.PICC_IsNewCardPresent())
    return;
  if ( ! rfid.PICC_ReadCardSerial())
    return;
 
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
 
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&  
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    return;
  }
  
  for (byte i = 0; i < 4; i++) {
    nuidPICC[i] = rfid.uid.uidByte[i];
  }   
  
  rfid.PICC_HaltA();
 
  rfid.PCD_StopCrypto1();
  lcd.clear();
  if (nuidPICC[0]==0xd1&&nuidPICC[1]==0x8f&&nuidPICC[2]==0xfa&&nuidPICC[3]==0x24)
  {
    lcd.print("     OPEN");
    digitalWrite(buzzerpin,HIGH);
    delay(300);
    digitalWrite(buzzerpin,LOW); 
    digitalWrite(relayPin,HIGH);//输出高电平
    delay(3000);//延时1秒
    digitalWrite(relayPin,LOW);//输出低电平    
    lcd.clear();
    return 0;
}
    else lcd.print("     ERROR");
    digitalWrite(buzzerpin,HIGH);
    delay(2000);
    digitalWrite(buzzerpin,LOW);   
    lcd.clear();
  }

4.接线

开发板与读卡器接线如表格,其他没有标出的不接。

开发板rc522
GNDGND
3.33.3
D10SDA
D11MOSI
D12MISO
D13SCK

屏幕SDA-A4、SCL-A5,继电器IN-D9,蜂鸣器IO-D8。

5.视频演示

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐