RC522使用NodeMCU向电脑发送卡号
NodeMCU和RC522接线图
项目背景:需要使用一台主机接6-8个RC522读卡器模块,鉴于技术太菜,而且串口通讯偶尔会出现丢包现象,没有选用常用的Arduino Uno+RC522,而是使用Esp8266来进行网络通讯。读卡后直接向电脑发送UDP消息。
按图接好线之后,默认已经安装好NodeMCU和RC522的库了。
这是普通的读取IC卡卡号的代码,这份代码只能读取卡号然后将卡号打印至串口。
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 5 // 配置针脚
#define SS_PIN 4
MFRC522 mfrc522(SS_PIN, RST_PIN); // 创建新的RFID实例
MFRC522::MIFARE_Key key;
void setup() {
Serial.begin(9600); // 设置串口波特率为9600
SPI.begin(); // SPI开始
mfrc522.PCD_Init(); // Init MFRC522 card
Serial.println("test-demo-start");
}
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();
// 检查兼容性
if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI
&& piccType != MFRC522::PICC_TYPE_MIFARE_1K
&& piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println(F("仅仅适合Mifare Classic卡的读写"));
return;
}
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 printHex(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}
关键在于,Serial.print(buffer[i], HEX);这行代码只能在串口监视器上看到,无法获取并使用udp发送。
下面是完整代码
#include <SPI.h>
#include <MFRC522.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#define STASSID "你的wifi账号"
#define STAPSK "你的wifi密码"
//目标IP
IPAddress targetIP(192, 168, 1, 101);//目标IP
unsigned int targetPort = 20000; // 本机端口号和目标的端口号
//Rc522配置
#define RST_PIN 5 // 配置针脚
#define SS_PIN 4
MFRC522 mfrc522(SS_PIN, RST_PIN); // 创建新的RFID实例
MFRC522::MIFARE_Key key;
String Card_UID;
WiFiUDP Udp;
void setup() {
Serial.begin(9600); // 设置串口波特率为9600
//初始化读卡器
SPI.begin(); // SPI开始
mfrc522.PCD_Init(); // Init MFRC522 card
Serial.println("test-demo-start");
//连接Wifi
WiFi.mode(WIFI_STA);
WiFi.begin(STASSID, STAPSK);
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(500);
}
Serial.print("Connected! IP address: ");
Serial.println(WiFi.localIP());
Serial.printf("UDP server on port %d\n", targetPort);
Udp.begin(targetPort);
}
void loop() {
// 寻找新卡
if ( ! mfrc522.PICC_IsNewCardPresent()) {
// Serial.println("没有找到卡");
return;
}
// 选择一张卡
if ( ! mfrc522.PICC_ReadCardSerial()) {
Serial.println("没有卡可选");
return;
}
// 发送卡ID至目标设备
Udp.beginPacket(targetIP, targetPort);
Card_UID = dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
Udp.write(Card_UID.c_str());//String格式转换为char*
Udp.endPacket();
// 检查兼容性
if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI
&& piccType != MFRC522::PICC_TYPE_MIFARE_1K
&& piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println(F("仅仅适合Mifare Classic卡的读写"));
return;
}
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;
}
String dump_byte_array(byte *buffer, byte bufferSize) {
String id;//十进制ID
for (byte i = 0; i < bufferSize; i++) {
id += (buffer[i] / 10);
id += (buffer[i] % 10);
//itoa(buffer[i],hexID,16);可以转成十六进制
}
Serial.println(p);
return id;
}