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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/263907.html
標籤:其他
