rfid

иришечка
Offline
Зарегистрирован: 15.06.2016

Помогите пожалуйста времени нету, у меня не правильно читает rfid карту само устройство, вот вам рисунок и код помогите кто как и чем может буду вам благодарна!!!

/*
 -----------------------------------------------------------------------------
 * 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
 *
 *  
 */

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

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

/*
Users
*/
int countUsers = 2;
byte Users[2][16] = {{1,2,3,4, 5,6,7,8, 9,10,255,12, 13,14,15,16},
                              {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1}};

void setup() {
        Serial.begin(9600);    // Инициализируем монитор последовательного порта
        pinMode(8, INPUT);     //button open/close door
        pinMode(7, OUTPUT);    //load transistor
        digitalWrite(7, LOW);
        pinMode(5, OUTPUT);    //LED open/close door
        myservo.attach(6);
        SPI.begin();           // Инициализируем SPI шину
        mfrc522.PCD_Init();
}

void loop() {
      // Подготовим ключ
    // используем ключ FFFFFFFFFFFFh который является стандартом для пустых карт  
        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 (doorOpen)
           // {
              //delay(10000);
             // myservo.write(80);
             // doorOpen = false;
             // Serial.println("CLOSED!");
             // digitalWrite(5, HIGH);
           // }
         // else
            {
             myservo.write(2);
             //doorOpen = true;
            Serial.println("OPENED!");
            digitalWrite(5, LOW);
            delay(10000);
            myservo.write(80);
            //doorOpen = false;
            Serial.println("CLOSED!");
            digitalWrite(5, HIGH);
            }
            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;
        }
// В этом примере мы используем первый сектор данных карты, блок 4
        byte sector         = 1;
        byte valueBlockA    = 4;
        byte valueBlockB    = 5;
        byte valueBlockC    = 6;
        byte trailerBlock   = 7;
        MFRC522::StatusCode status;
 // Аутентификация
        status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
        if (status != MFRC522::STATUS_OK) {
                Serial.print("PCD_Authenticate() failed: ");
                Serial.println(mfrc522.GetStatusCodeName(status));
                return;
        }

        status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
        if (status != MFRC522::STATUS_OK) {
                Serial.print("PCD_Authenticate() failed: ");
                Serial.println(mfrc522.GetStatusCodeName(status));
                return;
        }
 
        byte buffer[18];
        byte size = sizeof(buffer);

        status = mfrc522.MIFARE_Read(valueBlockA, buffer, &size);
        Serial.print(buffer[0]);
        Serial.print("\r\n");
        Serial.print(buffer[1]);
        Serial.print("\r\n");
        Serial.print(buffer[2]);
        Serial.print("\r\n");
        Serial.print(buffer[3]);
        Serial.print("\r\n");
        Serial.print(buffer[4]);
        Serial.print("\r\n");
        Serial.print(buffer[5]);
        Serial.print("\r\n");
        Serial.print(buffer[6]);
        Serial.print("\r\n");
        Serial.print(buffer[7]);
        Serial.print("\r\n");
        Serial.print(buffer[8]);
        Serial.print("\r\n");
        Serial.print(buffer[9]);
        Serial.print("\r\n");
        Serial.print(buffer[10]);
        Serial.print("\r\n");
        Serial.print(buffer[11]);
        Serial.print("\r\n");
        Serial.print(buffer[12]);
        Serial.print("\r\n");
        Serial.print(buffer[13]);
        Serial.print("\r\n");
        Serial.print(buffer[14]);
        Serial.print("\r\n");
        Serial.print(buffer[15]);
        Serial.print("\r\n");
//Читаем данные снова, чтобы проверить, что запись прошла успешно
        byte trueBytes = 0;
        boolean acceptUser = false;
        for (int i = 0; i < countUsers; i++) {
          if (!acceptUser) {
            for (int j = 0; j < 16; j++) {
              if (buffer[j] == Users[i][j]) {
                trueBytes++;
              }
            }
          }
          if (trueBytes == 16) {
            digitalWrite(7, HIGH);
            delay(500);
           //if (doorOpen)
            //{
              //delay(10000);
             // myservo.write(80);
             // doorOpen = false;
             // Serial.println("CLOSED!");
             // digitalWrite(5, HIGH);
           // }
         // else
            {
             myservo.write(2);
             //doorOpen = true;
            Serial.println("OPENED!");
            digitalWrite(5, LOW);
            delay(10000);
            myservo.write(80);
            //doorOpen = false;
            Serial.println("CLOSED!");
            digitalWrite(5, HIGH);
            }
            delay(500);
            digitalWrite(7, LOW);
            acceptUser = true;
            trueBytes = 0;
          } else trueBytes = 0;
        }
          // Выводим данные
        mfrc522.PICC_HaltA();

        mfrc522.PCD_StopCrypto1();
        
        
}

так выглядит на мониторе

!
 56 2F FC 11
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

ну всё правильно. У тебя создается пустой массив:

 byte buffer[18];

Далее тупо поэлементно выводится содержимое ячеек массива:

Serial.print(buffer[0]);

А сам массив нигде не заполняется, поэтому и нули.

Zeka
Offline
Зарегистрирован: 03.02.2017

Помогите пожалуйста сделать проверку в моем коде как в коде выше. У самого не получается не как.


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

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);

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

void setup() {
  Serial.begin(9600); 
  SPI.begin();   
  mfrc522.PCD_Init();    
  mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);
  Serial.println("Waiting for card...");

  pinMode(7, OUTPUT);  //LED  
  pinMode(6, OUTPUT);  //LED
  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;
    }

    if ((uidDec == 117,24,42,119,48) && (switchOn == false))
    {
      digitalWrite(4, HIGH);
      digitalWrite(7, HIGH);  
      switchOn = true;
      Serial.println("Switched On");
      Serial.println(uidDec);
//      tone(3, 2000); // Делаем звуковой сигнал.
      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;
    }
  } 
}
Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

uidDec - это одно число, а не четыре.

Рассчитывается по формуле из строки 39, т.е. ((((0 * 256) + a) * 256 + b) * 256 + c) * 256 + d)

Zeka
Offline
Зарегистрирован: 03.02.2017

Не мне надо чтоб проверка была по 

В этом примере мы используем первый сектор данных карты, блок 4
        byte sector         = 1;
        byte valueBlockA    = 4;
        byte valueBlockB    = 5;
        byte valueBlockC    = 6;
        byte trailerBlock   = 7;

а не по UID. 

Zeka
Offline
Зарегистрирован: 03.02.2017

На картах и ключах UID не меняется он защищен от записи я же хочу изменяя блок 4 в катре исползовать любую .

byte Users[2][16] = {{1,2,3,4, 5,6,7,8, 9,10,255,12, 13,14,15,16}, прописав в этой строке один раз его.

Подскажите пожалуйста как это сделать. Tomasina