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 |
GND | GND |
3.3 | 3.3 |
D10 | SDA |
D11 | MOSI |
D12 | MISO |
D13 | SCK |
屏幕SDA-A4、SCL-A5,继电器IN-D9,蜂鸣器IO-D8。