Объясните новичку по RFID.

Тема в разделе "Arduino & Shields", создана пользователем zenj, 7 фев 2017.

  1. zenj

    zenj Нерд

    Привет. Помогите.
    Нужно сделать чтобы проверка была по блоку 4,5 из сектора 1 а не по uid.
    Собирал из кусков, кое че сам дописывал не получается сделать поверку по id блоку 4,5 из сектора 1 .
    Все это работает на arduino nano и rfid-rc522

    Код (C++):
    #include <SPI.h>
    #include <SPI.h>
    #include <MFRC522.h>

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

       

    unsigned long uidDec, uidDecTemp;
    boolean switchOn = false;
    boolean cardRead = false;

    void setup() {
      Serial.begin(9600);     // Initialize serial communications with the PC
      SPI.begin();                    // Init SPI bus
      mfrc522.PCD_Init();     // Init MFRC522 card
      mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);
      Serial.println("Waiting for card...");

      pinMode(7, OUTPUT);
      pinMode(6, OUTPUT);
      pinMode(4, OUTPUT);
      digitalWrite(7, LOW);
      digitalWrite(6, LOW);

    }

    void loop() {
      byte status;
      byte byteCount;
      byte buffer[2]; // длинa мaccивa (16 бaйт + 2 бaйтa кoнтрoльнaя cуммa)

      byteCount = sizeof(buffer);
      uidDec = 0;
      status = mfrc522.PICC_RequestA(buffer, &byteCount);
      if (mfrc522.PICC_ReadCardSerial()) {
        for (byte i = 0; i < mfrc522.uid.size; i++)
        {
          uidDecTemp = mfrc522.uid.uidByte[i];
          uidDec = uidDec * 256 + uidDecTemp;
        }

        //Serial.println(uidDec);
        //mfrc522.PICC_HaltA(); // Stop reading

        if ((uidDec == 117,24,42,119,48) && (switchOn == false))
        {
          digitalWrite(4, HIGH);
          digitalWrite(7, HIGH);   // Turn on red LED
          switchOn = true;
          Serial.println("Switched On");
          Serial.println(uidDec);
          tone(3, 3000); // Делаем звуковой сигнал, Открытие
          delay(3000);
          digitalWrite(7, LOW);
          digitalWrite(6, HIGH);
        }
        mfrc522.PICC_ReadCardSerial();

      } else {
        if (switchOn == true) {
          Serial.println("Switched Off");
          digitalWrite(4, LOW);
          digitalWrite(7, LOW);
          digitalWrite(6, LOW);
          tone(3, 500,300); // Делаем звуковой сигнал, Закрытие
          switchOn = false;
        }
      }
    }
     
     
    Последнее редактирование: 7 фев 2017
  2. zenj

    zenj Нерд

    byte sector = 1;
    byte valueBlockA = 4;. Вроде так написал.
     
  3. Neilon

    Neilon Нерд

    что за блок и сектор? возьми пример MFRC522->cardRead, там всё разложено по полочкам.
     
  4. zenj

    zenj Нерд

    Sektor 0 первая строчка это UID карты и он не меняется.Все остальное можно переписать.
    Организация памяти чипа MIFARE 1K (16 секторов, по 4 блока в каждом секторе, по 16 байт каждый блок (в секторе 0, блоке 0 содержится информация завода-изготовителя).
    if((uidDec ==117,24,42,119,48) это он
    [​IMG]
    [​IMG]

    а мне надо вот этот кусок, он работает как мне надо как раз первые две строки и там дальше.
    Код (C++):
    int countUsers = 2;
    byte Users[2][16] = {{1,2,3,4, 5,6,7,8, 9,16,255,11,12, 13,14,15},
                         {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1}};

    void setup() {
      Serial.begin(9600);     // Initialize serial communications with the PC
      SPI.begin();                    // Init SPI bus
      mfrc522.PCD_Init();     // Init MFRC522 card
      mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);
      Serial.println("Waiting for card...");

      pinMode(7, OUTPUT);
      pinMode(6, OUTPUT);
      pinMode(4, OUTPUT);
      pinMode(5, OUTPUT);
      digitalWrite(7, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      }

    void loop() {
               MFRC522::MIFARE_Key key;
            for (byte i = 0; i < 6; i++) {
                    key.keyByte[i] = 0xFF;
            }

            if ( ! mfrc522.PICC_IsNewCardPresent()) {
               if (digitalRead(8) == HIGH) {
                digitalWrite(7, HIGH);
                delay(500);
                if (switchOn)
                {
                  switchOn = false;
                  Serial.println("CLOSED!");
                  digitalWrite(6, HIGH);
                }
                else
                {
                  switchOn = true;
                  Serial.println("OPENED!");
                  digitalWrite(6, LOW);
             
                }
                delay(500);
                digitalWrite(7, LOW);
              }
                return;
            }


            if ( ! mfrc522.PICC_ReadCardSerial()) {
                    return;
            }

            Serial.print("!");
            Serial.print("\r\n");

            for (byte i = 0; i < mfrc522.uid.size; i++) {
                    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
                    Serial.print(mfrc522.uid.uidByte[i], HEX);
            }
            Serial.print("\r\n");

            byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
            //Serial.print(mfrc522.PICC_GetTypeName(piccType));
            //Serial.print("\r\n");
            if (        piccType != MFRC522::PICC_TYPE_MIFARE_MINI
                    &&        piccType != MFRC522::PICC_TYPE_MIFARE_1K
                    &&        piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
                    return;
            }

            byte sector         = 1;
            byte valueBlockA    = 4;
            byte valueBlockB    = 5;
            byte valueBlockC    = 6;
            byte trailerBlock   = 7;
            MFRC522::StatusCode status;
     
    Последнее редактирование: 8 фев 2017
    Neilon нравится это.