Arduino RFID-RC522模块控制
#实现功能:
利用RFID-SimpleHexDec分别读取卡片信息,并利用所记录的卡片信息点亮其所对应的LED灯
【图中为我实验时所举的例子,你可以选择不同的LED进行点亮】
#原理图:原理图这里线路布线有交叉,但是是没有实心圆点,所以是可以的)接线图:
#在这里插入代码片
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9//重置
#define light_B 8
#define light_A 7
#define light_O 6
MFRC522 rfid(SS_PIN, RST_PIN); //实例化类
// 初始化数组用于存储读取到的NUID
byte nuidPICC[4];
void setup() {
Serial.begin(9600);
SPI.begin(); // 初始化SPI总线
rfid.PCD_Init(); // 初始化 MFRC522
pinMode(light_A,OUTPUT);
pinMode(light_B,OUTPUT);
pinMode(light_O,OUTPUT);
}
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];
}
if(nuidPICC[0]==0xBA&&nuidPICC[1]==0xC7&&nuidPICC[2]==0x74&&nuidPICC[3]==0x15)
{
//print(“读到蓝卡蓝灯亮”);
digitalWrite(light_A, HIGH);
digitalWrite(light_B, LOW);
digitalWrite(light_O,LOW);
delay(1000);
digitalWrite(light_A, LOW);
}
else if(nuidPICC[0]==0x59&&nuidPICC[1]==0xD6&&nuidPICC[2]==0xE7&&nuidPICC[3]==0x8C)
{
//print(“读到白卡黄灯亮”);
digitalWrite(light_B, HIGH);
digitalWrite(light_A, LOW);
digitalWrite(light_O,LOW);
delay(1000);
digitalWrite(light_B, LOW);
}
else
{
//print(“读到其它卡,绿灯亮”)
digitalWrite(light_O,HIGH);
digitalWrite(light_A,LOW);
digitalWrite(light_B,LOW);
delay(1000);
digitalWrite(light_O, LOW);
}
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);
}
}
#本实验注意事项:
1.当RFID读不出来卡片信息时,检查一下焊接好的RFID是不是坏掉了
2.当把十六进制读入数组内判断是否为所刷卡片时,代码出现了问题,整个十六进制没有被完全放入数组中,产生了错误,因为一个byte占8位,两个十六进制数,所以检查代码是否错误。
3.与LED灯结合,实现了刷不同卡片点亮不同LED灯,读到蓝卡蓝灯亮,读到白卡黄灯亮,读到其它卡,绿灯亮的实验效果。