【问题标题】:How to get the UID of RFID in Arduino?如何在 Arduino 中获取 RFID 的 UID?
【发布时间】:2015-09-29 08:34:38
【问题描述】:

我有一个 RFID-RC522 (MF-RC522) 模块,我正在使用 Arduino 草图程序。 为了使用这个 RFID,我下载了 Arduino MFRC522 库。

我运行库的示例代码。

这是代码。

/*
 * MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
 * The library file MFRC522.h has a wealth of useful info. Please read it.
 * The functions are documented in MFRC522.cpp.
 *
 * Based on code Dr.Leong   ( WWW.B2CQSHOP.COM )
 * Created by Miguel Balboa (circuitito.com), Jan, 2012.
 * Rewritten by Søren Thing Andersen (access.thing.dk), fall of 2013 (Translation to English, refactored, comments, anti collision, cascade levels.)
 * Released into the public domain.
 *
 * Sample program showing how to read data from a PICC using a MFRC522 reader on the Arduino SPI interface.
 *----------------------------------------------------------------------------- empty_skull 
 * Aggiunti pin per arduino Mega
 * add pin configuration for arduino mega
 * http://mac86project.altervista.org/
 ----------------------------------------------------------------------------- Nicola Coppola
 * Pin layout should be as follows:
 * Signal     Pin              Pin               Pin
 *            Arduino Uno      Arduino Mega      MFRC522 board
 * ------------------------------------------------------------
 * Reset      9                5                 RST
 * SPI SS     10               53                SDA
 * SPI MOSI   11               51                MOSI
 * SPI MISO   12               50                MISO
 * SPI SCK    13               52                SCK
 *
 * The reader can be found on eBay for around 5 dollars. Search for "mf-rc522" on ebay.com. 
 */

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

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.

void setup() {
    Serial.begin(9600); // Initialize serial communications with the PC
    SPI.begin();            // Init SPI bus
    mfrc522.PCD_Init(); // Init MFRC522 card
    Serial.println("Scan PICC to see UID and type...");
}

void loop() {
    // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
    }

    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
    }

    // Dump debug info about the card. PICC_HaltA() is automatically called.
    mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
}

当我运行此代码并将其中一张卡放入 RFID 阅读器时,Arduino IDE 的串行监视器上会显示很多信息。像这样的东西... (我无法发布图片)

//
Scan PICC to see UID and type...

Card UID : 84 90 6C A7

PICC type : MIFARE 1KB

Sector Block 0 1 2 3 4 5 6 7 ...

15     63   00 00 00 00 ...
//

但我需要的只是卡 UID。本案例为 84 90 6C A7。

其实我有项目。如果我放一张 RFID 卡,我想打开 LED。为此,我需要读取 Card UID 并将其分配给 Arduino 草图程序上的某个变量。

但我不知道在这种情况下如何获取 RFID 标签的 UID(这个库和函数对我来说很复杂)。

如果有人知道怎么做,请帮助我。

【问题讨论】:

    标签: arduino uniqueidentifier rfid serial-number


    【解决方案1】:

    这是一个返回 UID 的函数。

    /**
     * mfrc522.PICC_IsNewCardPresent() should be checked before 
     * @return the card UID
     */
    unsigned long getID(){
      if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
        return -1;
      }
      unsigned long hex_num;
      hex_num =  mfrc522.uid.uidByte[0] << 24;
      hex_num += mfrc522.uid.uidByte[1] << 16;
      hex_num += mfrc522.uid.uidByte[2] <<  8;
      hex_num += mfrc522.uid.uidByte[3];
      mfrc522.PICC_HaltA(); // Stop reading
      return hex_num;
    }
    

    像这样使用它:

    if(mfrc522.PICC_IsNewCardPresent()) {
      unsigned long uid = getID();
      if(uid != -1){
        Serial.print("Card detected, UID: "); Serial.println(uid);
      }
    }
    

    基于 Thomas Matthews 在 similar discussion 中的回答。

    【讨论】:

    • 编译时出现此错误:warning: left shift count &gt;= width of type hex_num = mfrc522.uid.uidByte[0] &lt;&lt; 24
    【解决方案2】:

    这是未经测试的代码,因为我现在没有可用的 Arduino。我希望它有效。

    将示例中的 DumpToSerial 代码替换为类似的代码

    if (mfrc522.uid.uidByte[0] == 0x84 && mfrc522.uid.uidByte[1] == 0x90 && mfrc522.uid.uidByte[2] == 0x6c && mfrc522.uid.uidByte[3] == 0xa7) { // turn your LED on }

    【讨论】:

      【解决方案3】:

      你可以这样做:

      mfrc522.uid.uidByte
      

      它是一个字节[10]

      【讨论】:

        【解决方案4】:

        我找到了另一种方法。

        在库 MFRC522.cpp1391 行

        Serial.print(F("Card UID:"));
        
        for (byte i = 0; i < uid->size; i++)
        

        我用这个函数调用创建了另一个函数:PICC_DumpDetailsToSerialUid(Uid *uid)

        看起来像:

         //This is just for read UID!
         void MFRC522::PICC_DumpDetailsToSerialUid(Uid *uid){
            Serial.print(F("Card JUST UID :"));
            for (byte i = 0; i < uid->size; i++) {
                if(uid->uidByte[i] < 0x10)
                    Serial.print(F(" 0"));
                else
                    Serial.print(F(" "));
                Serial.print(uid->uidByte[i], HEX);
            } 
            Serial.println();
         }
        

        你可以把它放在你需要的任何地方,我只是把它放在大函数附近以知道在哪里。

        添加该函数后,您需要进入 第 409 行MFRC522.h 库并添加

        void PICC_DumpDetailsToSerialUid(Uid *uid);
        

        在该库中进行这两次编辑后,您可以在需要的位置调用函数。

        在 Arduino 中使用:mfrc522.PICC_DumpDetailsToSerialUid(&amp;(mfrc522.uid)); 调用它,并且您只有一个用于 uid 的函数。

        如果您需要其他功能,您可以使用其他功能来做到这一点......祝您好运:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-11-10
          • 1970-01-01
          • 1970-01-01
          • 2019-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-03
          相关资源
          最近更新 更多