RFID-RC522 модуль

Suro
Offline
Зарегистрирован: 03.07.2017

RFID модуль. MFRC522 



работает некорректно не понимаю в чем проблема ,, 



когда нет метки - должен вызвать функцию in(); 

когда первая метка - функцию tas(); 

когда вторая метка - функцию qsan(); 



бывает , что когда есть один из меток но вызывает функцию in(); 

вот и код

void loop() { 
Key = 0; 
if ( ! rfid.PICC_IsNewCardPresent()) {goto empty;}// Поиск нового ключа 
if ( ! rfid.PICC_ReadCardSerial()) {goto empty;}// Выбор ключа 
for (byte i = 0; i < rfid.uid.size; i++){// Выдача серийного № ключа 
KeyTemp = rfid.uid.uidByte[i]; 
Key = Key * 256 + KeyTemp;} 
empty: 
Serial.print("Card №: "); 
Serial.println(Key); // Выводим № ключа в консоль 


if (0 == Key) { // делаем когда метки нет 
in(); 
} 

if( Key == 515280555){ //первая метка 
tas(); 
} 


if( Key == 1459297918){ // вторая метка 
qsan(); 
} 
}

 

что делать? помогите пожалуйста

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Suro пишет:

что делать?

Привести код полностью.

Я, например, не вижу как у Вас описана переменная Key.

Suro
Offline
Зарегистрирован: 03.07.2017
#include <SPI.h>                                                
#include <MFRC522.h>                                     
MFRC522 rfid(10, 9); // пины SDA, RST                       
unsigned long Key, KeyTemp;  // для храниения № ключа       

const int buttonPin = 4; // номер входа, подключенный к кнопке
const int ledPin = 5; // номер выхода светодиода

boolean lastButten = LOW; // предыдущее состояние кнопки
boolean currentButten = LOW; // текущее состояние кнопки
int status = 0;

void setup() {
   
  pinMode(buttonPin, INPUT); 
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600); // скорость порта
  SPI.begin();  //  инициализация SPI
  rfid.PCD_Init();}     // инициализация rfid модуля
   
boolean debvance (boolean last) //убираем дребизг
{
boolean current = digitalRead (buttonPin); // считываем данные с кнопки
if (last != current) // Если текущее состояни еотличететься от предыдущего 
{
delay (5); // Ждем 5 милисек.
current = digitalRead (buttonPin); // Присваеваем текущее состояние кнопки
return current; 
}
}

void in(){
  currentButten = debvance (lastButten); // Передаем функции дребезга значение по умолчанию LOW 
if (lastButten == LOW && currentButten == HIGH) // Проверяем отпускали мы кнопку или нет
{
status = ++status; // инвертируем Статус 
}
lastButten = currentButten; // Переприсваеваем прошлое состояние кнопки

if (status == 10) //если статус 5
{
for (int i=0; i<10; i++){
digitalWrite(ledPin,HIGH); 
delay(1);
digitalWrite(ledPin,LOW); 
delay(50);
}
status = 0;
}
else // усди нажали не 5 раз выключаем светодиод 
{
digitalWrite(ledPin,LOW); 
delay(20); // Ждем
}
}

void tas(){

currentButten = debvance (lastButten); // Передаем функции дребезга значение по умолчанию LOW 
if (lastButten == LOW && currentButten == HIGH) // Проверяем отпускали мы кнопку или нет
{
status = ++status; // инвертируем Статус 
}
lastButten = currentButten; // Переприсваеваем прошлое состояние кнопки

if (status == 10) //если статус 5
{
for (int i=0; i<11; i++){
digitalWrite(ledPin,HIGH); 
delay(1);
digitalWrite(ledPin,LOW); 
delay(50);
}
status = 0;
}
else // усди нажали не 5 раз выключаем светодиод 
{
digitalWrite(ledPin,LOW); 
delay(20); // Ждем
}
}

void qsan(){
 
 currentButten = debvance (lastButten); // Передаем функции дребезга значение по умолчанию LOW 
if (lastButten == LOW && currentButten == HIGH) // Проверяем отпускали мы кнопку или нет
{
status = ++status; // инвертируем Статус 
}
lastButten = currentButten; // Переприсваеваем прошлое состояние кнопки

if (status == 10) //если статус 5
{
for (int i=0; i<12; i++){
digitalWrite(ledPin,HIGH); 
delay(1);
digitalWrite(ledPin,LOW); 
delay(50);
}
status = 0;
}
else // усди нажали не 5 раз выключаем светодиод 
{
digitalWrite(ledPin,LOW); 
delay(20); // Ждем
}
} 


void loop() {
  Key = 0;
  if ( ! rfid.PICC_IsNewCardPresent()) {goto empty;}// Поиск нового ключа

  if ( ! rfid.PICC_ReadCardSerial()) {goto empty;}// Выбор ключа
  
for (byte i = 0; i < rfid.uid.size; i++){// Выдача серийного № ключа
KeyTemp = rfid.uid.uidByte[i];
    Key = Key * 256 + KeyTemp;}
empty:
  Serial.print("Card №: ");
  Serial.println(Key); // Выводим № ключа в консоль

  
if (0 == Key){   // делаем когда метки нет
in();  
} 

if( Key == 515280555){
tas();
}


if( Key == 1459297918){

qsan();
}




 
}

 

Suro
Offline
Зарегистрирован: 03.07.2017

вот и весь код

b707
Онлайн
Зарегистрирован: 26.05.2017

Зачем у Вас из строк 112 и 114 - когда нет никакой метки - сделан переход на вывод номера ключа в консоль? Откуда возьмется номер. если метки нет?

Не говоря уж о том, что использование goto в С - это как признание в импотенции.

Suro
Offline
Зарегистрирован: 03.07.2017

это для того чтобы когда нет метки вывать функцию in();

я новичок,многого не знаю ,,  а как правильно это делать?

b707
Онлайн
Зарегистрирован: 26.05.2017

Suro пишет:

это для того чтобы когда нет метки вывать функцию in();

ну так вывод в Serial-то зачем? Даже с использованием goto было бы логичнее поставить empty: после печати, на строку 123. А можно вообще обойтись без переходов и меток - у вас программа и так пробегает по всем функциям каждый цикл.

 

Suro
Offline
Зарегистрирован: 03.07.2017

а как мне вызвать функцию in(); когда на модуле нет никокой карты?

b707
Онлайн
Зарегистрирован: 26.05.2017

Если я правильно понял, что вы хотите сделать, код loop() можно переписать так:

void loop() {
  Key = 0;
  if ( ! rfid.PICC_IsNewCardPresent()) {
   in();  
   }// Поиск нового ключа

  if ( rfid.PICC_ReadCardSerial()) {
  
    for (byte i = 0; i < rfid.uid.size; i++){// Выдача серийного № ключа
    KeyTemp = rfid.uid.uidByte[i];
    Key = Key * 256 + KeyTemp;}

    Serial.print("Card №: ");
    Serial.println(Key); // Выводим № ключа в консоль


    if( Key == 515280555){
      tas();
    }


    if( Key == 1459297918){
      qsan();
    }
  }
 }

Код не проверял, могут быть случайные ошибки

b707
Онлайн
Зарегистрирован: 26.05.2017

Suro пишет:

а как мне вызвать функцию in(); когда на модуле нет никокой карты?

Применительно к вашему коду из сообщения #2 - если на модуле нет карты,  переменная Key будет равна нулю и условие в строке 124 сработает само - безо всяких goto

Suro
Offline
Зарегистрирован: 03.07.2017

очень спосибо но по вашему примеру не работает и не работает без goto

b707
Онлайн
Зарегистрирован: 26.05.2017

Suro пишет:

очень спосибо но по вашему примеру не работает и не работает без goto

а что именно не работает? - я ж говорю, из вашего кода не вполне понятно. что вы вообще хотите сделать

Suro
Offline
Зарегистрирован: 03.07.2017

у меня то задача немного сложная ,, у меня есть Arduino Uno, RFID module (MFRC522)

моя задача.

1. когда Arduino получает 10 импульсов и на модуле первая метка - отправить на светодиод 11 импульсов.

2. когда Arduino получает 10 импульсов и на модуле вторая метка - отправить на светодиод 12 импульсов.

3. когда на модуле нет метки - отправить на светодиод столько импульсов сколько получил.

 

b707
Онлайн
Зарегистрирован: 26.05.2017

Suro пишет:

у меня то задача немного сложная ,, у меня есть Arduino Uno, RFID module (MFRC522)

моя задача.

1. когда Arduino получает 10 импульсов и на модуле первая метка - отправить на светодиод 11 импульсов.

2. когда Arduino получает 10 импульсов и на модуле вторая метка - отправить на светодиод 12 импульсов.

3. когда на модуле нет метки - отправить на светодиод столько импульсов сколько получил.

 

ладно, давайте по порядку. В моем коде чтения меток что не так работает?

Suro
Offline
Зарегистрирован: 03.07.2017

когда на модуле первая метка и получает 10 импульсов то вызывает функцию in(); то вызывает функцию tas(); 

b707
Онлайн
Зарегистрирован: 26.05.2017

Давайте попробуем временно убрать все функции и оставить только чтение ключа и вывод данных:

void loop() {
  Key = 0;
  if ( ! rfid.PICC_IsNewCardPresent()) {
   Serial.println("No card"); 
   }// Поиск нового ключа

  if ( rfid.PICC_ReadCardSerial()) {
  
    for (byte i = 0; i < rfid.uid.size; i++){// Выдача серийного № ключа
    KeyTemp = rfid.uid.uidByte[i];
    Key = Key * 256 + KeyTemp;}

    Serial.print("Card №: ");
    Serial.println(Key); // Выводим № ключа в консоль


   
  }
 }

Замените loop вот на этот код и посмотрите, что будет валиться (и с какой скоростью) в Serial

UPD - если еще не изменили код - добавьте коротенький delay(50) в самом начале,

Suro
Offline
Зарегистрирован: 03.07.2017

сейчас работает ,, открываю Монитор Порта и когда приближаю метку нормально выводит ключь

b707
Онлайн
Зарегистрирован: 26.05.2017

Suro пишет:

сейчас работает ,, открываю Монитор Порта и когда приближаю метку нормально выводит ключь

 Устойчиво выводит номер? Сообщения "NO card" не проскаивают при приложенной метке?

Suro
Offline
Зарегистрирован: 03.07.2017

проскаивает

Card №: 515280555
No card
Card №: 515280555
No card
...
b707
Онлайн
Зарегистрирован: 26.05.2017

Suro пишет:

проскаивает

Card №: 515280555
No card
Card №: 515280555
No card
...

Думаю, это и есть причина. почему у вас первый скетч не работал. У вас происходит "дребезг" чтения карты. аналогично дребезгу контактов кнопки при нажатии.  Пока вы прикладываете карту, цикл loop успевает выполнится тысячи раз и столько же раз пытается считать карту, а RFID не всегда читает ее верно, особенно когда вы ее только подносите или когда снимаете со считывателя.

И кроме того, пока карта на считывателе - ваши процедуры qsan() и tas() тоже будут запускаться бесконечно - кмк. это не то, что вы хотели.

Надо сделать так - после того, как считыватель принял сигнал о прикладывании карты - ждем 20-50 мс и считываем снова. Если ключ карты тот же - значит это не ошибка и карта действительно приложена - выполняем процедуры. Если на выходе ноль - ничего не делаем.

 И вообще, опрашивать считыватель вряд ли стоит чаще 5-10 раз в секунду.

Suro
Offline
Зарегистрирован: 03.07.2017

смотрите ,, у меня импульсы передает монетоприемник CH-924 и дребезгов нет + у меня там функция debvance который убирает дребизг))

и знаете интересно то что когда я убираю условие 124 строки,все четко работает:
когда на считывателе первая метка - получает 10 импульсов отправляет 11
когда на считывателе вторая метка - получает 10 импульсов отправляет 12  

как и есть в функциях.

 

b707
Онлайн
Зарегистрирован: 26.05.2017

Suro пишет:

смотрите ,, у меня импульсы передает монетоприемник CH-924 и дребезгов нет + у меня там функция debvance который убирает дребизг))

и знаете интересно то что когда я убираю условие 124 строки,все четко работает:

Я имею в виду дребезг чтения RFID - и он у вас безусловно есть.  Когда вы убираете условие строки 124 - вы просто перестаете получать сообщения об этом дребезге, но сам дребезг никуда не девается.

Это как предложить больному не делать анализы, чтобы не расстраиватся...

Дело ваше - делайте как хотите. Куда двигаться. чтобы решить проблему - я предложил.

Suro
Offline
Зарегистрирован: 03.07.2017

аааа да понял ,, а где правильно дабавить delay(50); ?
так?

void loop() {
  delay(50);
  Key = 0;
  if ( ! rfid.PICC_IsNewCardPresent()) {Serial.println("No card"); }// Поиск нового ключа
  delay(50);
  if ( rfid.PICC_ReadCardSerial()) {
  
    for (byte i = 0; i < rfid.uid.size; i++){// Выдача серийного № ключа
    KeyTemp = rfid.uid.uidByte[i];
    Key = Key * 256 + KeyTemp;}

    Serial.print("Card №: ");
    Serial.println(Key); // Выводим № ключа в консоль


   
  }
 }

 

Suro
Offline
Зарегистрирован: 03.07.2017

???

 

b707
Онлайн
Зарегистрирован: 26.05.2017

Suro пишет:

аааа да понял ,, а где правильно дабавить delay(50); ?
так?

да, можно тут

Suro
Offline
Зарегистрирован: 03.07.2017

все же не есть дребезг((

но я знаю другое решение вопроса можете помочь??

Suro
Offline
Зарегистрирован: 03.07.2017

??

 

p985850
Offline
Зарегистрирован: 07.07.2017

Народ уточнить бы такие моменты..понятно что авторизация по номеру карты лажа полная, т.к. она читается всеми и всяко разно кому не лень... но вот тут возникает вопрос касательно чтения как раз запороленых данных. Вот это меня и интересует чтение изапись данных запороленых ключем А и/или Б. Статей конечно почитал и кой что знаю но пока уверености нет вот и хотелось бы спросить тех кто все же умеет их записывать, ставить ключ и читать...короче спецов.

Начнем вот с чего: что мне все же не удалось выяснить -  Вощьмем к примеру 15 сектор будет достаточно для понимания: 

[Сек][Бло№][Байты 1, 2, 3-                                            15][Флаги защиты]

15     63   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ]

         62   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ]

         61   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ]

         60   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 

 

p985850
Offline
Зарегистрирован: 07.07.2017

Из некоторых личных соображений не удалось понять следующие - ключ А и Б на ходятся в каждом блоке или они распространяются только на целый сектор в котором 4 блока? Понятно что ключ А имеет адрес 0-5 а ключ Б 10-15

p985850
Offline
Зарегистрирован: 07.07.2017

Похже удалось найти такую информацию которая меня повергла в замешательство с примером из среды..если посмотреть на таблицу выше то там есть флаги защиты а тут такая инфа: 

Сектор

Блок

Порядковый номер блока

Функция

       

0

0

0

UID и информация завода-изготовителя чипа

0

1

1

Данные

0

2

2

Данные

0

3

3

Sector Trailer (Ключ A, условие доступа, Ключ B)

...

...

...

...

15

0

60

Данные

15

1

61

Данные

15

2

62

Данные

15

3

63

Sector Trailer (Ключ A, условие доступа, Ключ B)

 

p985850
Offline
Зарегистрирован: 07.07.2017

Напрягает это: Sector Trailer (Ключ A, условие доступа, Ключ B)

b707
Онлайн
Зарегистрирован: 26.05.2017

p985850, вы бы новую тему начали? А то непонятно, к чему ваш вопрос и какое он имеет отношение к предыдущему обсуждению.

Suro
Offline
Зарегистрирован: 03.07.2017

b707 вопрос решился ,, вот и код

 

void loop() {
  static uint32_t past = 0;
  if ( rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
    past = millis();
    Key = 0;
    for (byte i = 0; i < rfid.uid.size; i++) { // Выдача серийного № ключа
      KeyTemp = rfid.uid.uidByte[i];
      Key = Key * 256 + KeyTemp;
    }
    Serial.println();
    Serial.print("Card №: ");
    Serial.print(Key); // Выводим № ключа в консоль
    if (Key == 515280555) tas();
    if (Key == 1459297918) qsan();
  }
  if (millis() - past >= 50) {
    Serial.println();
    Serial.print("0");  // Поиск нового ключа
    in();
  }
}

 

b707
Онлайн
Зарегистрирован: 26.05.2017

Suro, так в чем проблема была?

p985850
Offline
Зарегистрирован: 07.07.2017

Автор меня интересует как записать информацию на карту и защитить паролем и потом вводя пароль читать данные. Вы знаете как? Рассматрев библию оказалось сожновато что то понять

b707
Онлайн
Зарегистрирован: 26.05.2017

p985850 пишет:

Автор меня интересует как записать информацию на карту и защитить паролем и потом вводя пароль читать данные. Вы знаете как? Рассматрев библию оказалось сожновато что то понять

ОК, значит вопрос к автору темы.

Я бы все-таки советовал создать новую тему, если вы хотите, чтобы ваш вопрос прочитали больше 1-2х человек. И четче сформулировать вопрос.

Suro
Offline
Зарегистрирован: 03.07.2017

p985850 этого я не знаю извените )

Suro
Offline
Зарегистрирован: 03.07.2017

b707 не помните??
мы пытались сделать так, чтобы устойчиво выводил номер карты ,, сообщение "No Card" не проскаивался при приложенной метке

p985850
Offline
Зарегистрирован: 07.07.2017

Вот инетересный код надыбал 

#include
#include

#define RST_PIN 9 // Configurable, see typical pin layout above
#define SS_PIN 10 // Configurable, see typical pin layout above

MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.

MFRC522::MIFARE_Key key;

/**
* Initialize.
*/
void setup() {
Serial.begin(9600); // Initialize serial communications with the PC
while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card

// Prepare the key (used both as key A and as key B)
// using FFFFFFFFFFFFh which is the default at chip delivery from the factory
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF;
}

Serial.println("Scan a MIFARE Classic PICC to demonstrate read and write.");
Serial.print("Using key (for A and B):");
dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE);
Serial.println();

Serial.println("BEWARE: Data will be written to the PICC, in sector #1");
}

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

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

// Show some details of the PICC (that is: the tag/card)
Serial.print("Card UID:");
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
Serial.println();
Serial.print("PICC type: ");
byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
Serial.println(mfrc522.PICC_GetTypeName(piccType));

// Check for compatibility
if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI
&& piccType != MFRC522::PICC_TYPE_MIFARE_1K
&& piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println("This sample only works with MIFARE Classic cards.");
return;
}

// In this sample we use the second sector,
// that is: sector #1, covering block #4 up to and including block #7
byte sector = 1;
byte blockAddr = 4;
byte dataBlock[] = {
0x9B, 0x83, 0x7B, 0xB5, // 1, 2, 3, 4,
0xC3, 0x5D, 0xF6, 0xC9, // 5, 6, 7, 8,
0xFE, 0x31, 0x32, 0x30, // 9, 10, 255, 12,
0x34, 0xFF, 0x00, 0x00 // 13, 14, 15, 16
};
byte trailerBlock = 7;
byte status;
byte buffer[18];
byte size = sizeof(buffer);
// Authenticate using key A
Serial.println("Authenticating using key A...");
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;
}

// Show the whole sector as it currently is
Serial.println("Current data in sector:");
mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
Serial.println();

// Read data from the block
Serial.print("Reading data from block "); Serial.print(blockAddr);
Serial.println(" ...");
status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
if (status != MFRC522::STATUS_OK) {
Serial.print("MIFARE_Read() failed: ");
Serial.println(mfrc522.GetStatusCodeName(status));
}
Serial.print("Data in block "); Serial.print(blockAddr); Serial.println(":");
dump_byte_array(buffer, 16); Serial.println();
Serial.println();

// Authenticate using key B
Serial.println("Authenticating again using key B...");
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;
}

// Write data to the block
Serial.print("Writing data into block "); Serial.print(blockAddr);
Serial.println(" ...");
dump_byte_array(dataBlock, 16); Serial.println();
status = mfrc522.MIFARE_Write(blockAddr, dataBlock, 16);
if (status != MFRC522::STATUS_OK) {
Serial.print("MIFARE_Write() failed: ");
Serial.println(mfrc522.GetStatusCodeName(status));
}
Serial.println();

// Read data from the block (again, should now be what we have written)
Serial.print("Reading data from block "); Serial.print(blockAddr);
Serial.println(" ...");
status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
if (status != MFRC522::STATUS_OK) {
Serial.print("MIFARE_Read() failed: ");
Serial.println(mfrc522.GetStatusCodeName(status));
}
Serial.print("Data in block "); Serial.print(blockAddr); Serial.println(":");
dump_byte_array(buffer, 16); Serial.println();

// Check that data in block is what we have written
// by counting the number of bytes that are equal
Serial.println("Checking result...");
byte count = 0;
for (byte i = 0; i < 16; i++) {
// Compare buffer (= what we've read) with dataBlock (= what we've written)
if (buffer[i] == dataBlock[i])
count++;
}
Serial.print("Number of bytes that match = "); Serial.println(count);
if (count == 16) {
Serial.println("Success :-)");
} else {
Serial.println("Failure, no match :-(");
Serial.println(" perhaps the write didn't work properly...");
}
Serial.println();

// Dump the sector data
Serial.println("Current data in sector:");
mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
Serial.println();

// Halt PICC
mfrc522.PICC_HaltA();
// Stop encryption on PCD
mfrc522.PCD_StopCrypto1();
}

/**
* Helper routine to dump a byte array as hex values to Serial.
*/
void dump_byte_array(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}

p985850
Offline
Зарегистрирован: 07.07.2017

Вот таким образом можно писать данные в карту 

//=================================================================================
// Запись информации на карту
//=================================================================================
// Запись информации производится тока если (Wr истина, флаг включения записи)
// Т.к. это специальная процедура то она выполняется тока при инициализации
// и аппаратной настройки.
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// МЕТОДИКА ЗАПИСИ КАРТЫ:
//
// 1) Определить параметры карты ()
// 2) Указать место записи
// 3) Ввести ключ А
// 4) Ввести ключ Б
// 5) Записать инфорацию
// 6)
void RFID_Write(bool Wr) {
  // Определим начальный ключ для доступа к сектору, это по умолчанию заводской ключ
  // если его не ввести то карта пошлет нахуй
  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }
  if ( ! mfrc522.PICC_IsNewCardPresent())
    return;
 
  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial())
    return;
  // Определим параметры записи, что и куда записывваем.
  byte sector         = 1;                          // куда записываем (Это сектор)
  byte blockAddr      = 4;                          // куда записываем (Это блок) см. даташит
  byte dataBlock[]    = {                           // А тут что записываем 16 байтов
    0x9B, 0x83, 0x7B, 0xB5, //  1,  2,   3,  4,
    0xC3, 0x5D, 0xF6, 0xC9, //  5,  6,   7,  8,
    0xFE, 0x31, 0x32, 0x30, //  9, 10, 255, 12,
    0x34, 0xFF, 0x00, 0x00  // 13, 14,  15, 16
  };
  byte trailerBlock   = 7; // Это блок трелер (в него записываются ключи, флаги доступа к целому сектору!!!)
  byte status;
  byte buffer[18];
  byte size = sizeof(buffer);
 
 
  // попробуем авторизаватся на карточке (в трелере №7 с клечем key) это ключ А, в случае успеха вернет STATUS_OK
  // а если что то другое значит пароль не правильный.
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
  if (status != MFRC522::STATUS_OK) {
    Serial.print("Авторизация с паролем А правильная");
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
 
  //Она как бы в память читает с карты все жданные
  mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
 
  // Прочитаем данные с этого блока которые сейчас там записаны. если нормально прочиталось вернет STATUS_OK
  // если что то другое то ошибка
  status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
  if (status != MFRC522::STATUS_OK) {
    Serial.print("Данные с карты прочитаны успещно");
    Serial.println(mfrc522.GetStatusCodeName(status));
  }
 
  // Выведим что сейчас есть на карте.
  Serial.print("Data in block "); Serial.print(blockAddr); Serial.println(":");
  dump_byte_array(buffer, 16); Serial.println();
  Serial.println();
 
  // Авторизовываемся по ключу Б, если все ок вернет STATUS_OK, если что то другое жопа..
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
  if (status != MFRC522::STATUS_OK) {
    Serial.print("Авторизация по ключу Б успешна");
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
 
  // Дальше тупа запишем данные которые мы подготовили ранее в место которое тоже подготовлили!
  Serial.print("Запись данных в блок:"); Serial.print(blockAddr);
  Serial.println(" ...");
  dump_byte_array(dataBlock, 16); Serial.println();  // эта страка на запись принимает массив из 16 элементов.пишет в 16 рич сис.сч.
  status = mfrc522.MIFARE_Write(blockAddr, dataBlock, 16); // сама запись, если успешно все запишется то вернет как всегда статус_ок
  if (status != MFRC522::STATUS_OK) {
    Serial.print("Данные были записаны на карту успешно!");
    Serial.println(mfrc522.GetStatusCodeName(status));
  }
  Serial.println();
 
  // Дальше прочитаем данные которые мы записали по сути повторяем предыдущий блок..
 
  Serial.print("Читаем блок:"); Serial.print(blockAddr);
  Serial.println(" ...");
  status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
  if (status != MFRC522::STATUS_OK) {
    Serial.print("Данные из блока прочитаны успешно!");
    Serial.println(mfrc522.GetStatusCodeName(status));
  }
  Serial.print("Выводим информацию в монитор:"); Serial.print(blockAddr); Serial.println(":");
  dump_byte_array(buffer, 16); Serial.println();
 
 
 
 
 
 
 
 
 
  // Выключаем карту
  mfrc522.PICC_HaltA();
  // Отключаем шифрование
  mfrc522.PCD_StopCrypto1();
 
 
}
 
 
 
 
 
 
 
void dump_byte_array(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
}
 
b707
Онлайн
Зарегистрирован: 26.05.2017

p985850 - вы ж вроде давно на форуме, несколько тем создали, а код так и научились выкладывать? - в таком виде, какой бы он ни был "интересный", смотреть его вряд ли кто захочет