Запись в ключ RFID 16МГц

Yer
Offline
Зарегистрирован: 12.02.2016

Здравствуйте всем как можно написать скетч чтобы при каждом срабатывание значение в 16 чейке уменшалься


#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN         9           
#define SS_PIN          10          
  byte last=100;
MFRC522 mfrc522(SS_PIN, RST_PIN);   
MFRC522::MIFARE_Key key;

void setup() {
    Serial.begin(9600); 
    while (!Serial);    
    SPI.begin();        
    mfrc522.PCD_Init(); 
 pinMode(6, OUTPUT);
  digitalWrite(6, LOW);
    // Подготовим ключ
    // используем ключ FFFFFFFFFFFFh который является стандартом для пустых карт
    for (byte i = 0; i < 6; i++) {
        key.keyByte[i] = 0xFF;
    }

    Serial.println(F("Scan a MIFARE Classic PICC to demonstrate read and write."));
    Serial.print(F("Using key (for A and B):"));
    dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE);
    Serial.println();
    
    Serial.println(F("BEWARE: Data will be written to the PICC, in sector #1"));
}

void loop() {
    // Ждем новую карту
    if ( ! mfrc522.PICC_IsNewCardPresent())
        return;

    // Выбираем одну из карт
    if ( ! mfrc522.PICC_ReadCardSerial())
        return;

    // Показываем подробности карты
    Serial.print(F("Card UID:"));
    dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
    Serial.println();
    Serial.print(F("PICC type: "));
    byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
    Serial.println(mfrc522.PICC_GetTypeName(piccType));

    // Проверяем совместимость
    if (    piccType != MFRC522::PICC_TYPE_MIFARE_MINI
        &&  piccType != MFRC522::PICC_TYPE_MIFARE_1K
        &&  piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
        Serial.println(F("This sample only works with MIFARE Classic cards."));
        return;
    }

    // В этом примере мы используем первый сектор данных карты, блок 4
    byte sector         = 1;
    byte blockAddr      = 4;
    byte dataBlock[]    = { // Данные, которые мы запишем на карту
        0x64, 0x02, 0x03, 0x04, //  1,  2,   3,  4,
        0x05, 0x06, 0x07, 0x08, //  5,  6,   7,  8,
        0x09, 0x0A, 0x0B, 0x0c, //  9, 10, 11, 12,
        0x0d, 0x0e, 0x0f, last  // 13, 14,  15, 16
      
    };
    byte trailerBlock   = 7;
    byte status;
    byte buffer[18];
    byte size = sizeof(buffer);

    // Аутентификация
    Serial.println(F("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(F("PCD_Authenticate() failed: "));
        Serial.println(mfrc522.GetStatusCodeName(status));
        return;
    }

    // Показываем текущие данные сектора
    Serial.println(F("Current data in sector:"));
    mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
    Serial.println();

    // Читаем данные из блока
    Serial.print(F("Reading data from block ")); Serial.print(blockAddr);
    Serial.println(F(" ..."));
    status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
    if (status != MFRC522::STATUS_OK) {
        Serial.print(F("MIFARE_Read() failed: "));
        Serial.println(mfrc522.GetStatusCodeName(status));
    }
    Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":"));
    dump_byte_array(buffer, 16); Serial.println();
    Serial.println();

    // Аутентификация
    Serial.println(F("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(F("PCD_Authenticate() failed: "));
        Serial.println(mfrc522.GetStatusCodeName(status));
        return;
    }

    // Записываем данные в блок
    Serial.print(F("Writing data into block ")); Serial.print(blockAddr);
    Serial.println(F(" ..."));
    dump_byte_array(dataBlock, 16); Serial.println();
    status = mfrc522.MIFARE_Write(blockAddr, dataBlock, 16);
    if (status != MFRC522::STATUS_OK) {
        Serial.print(F("MIFARE_Write() failed: "));
        Serial.println(mfrc522.GetStatusCodeName(status));
    }
    Serial.println();

    // Читаем данные снова, чтобы проверить, что запись прошла успешно
    Serial.print(F("Reading data from block ")); Serial.print(blockAddr);
    Serial.println(F(" ..."));
    status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
    if (status != MFRC522::STATUS_OK) {
        Serial.print(F("MIFARE_Read() failed: "));
        Serial.println(mfrc522.GetStatusCodeName(status));
    }
    Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":"));
    dump_byte_array(buffer, 16); Serial.println();
       
    Serial.println(F("Checking result..."));
    byte count = 0;
    for (byte i = 0; i < 16; i++) {
        if (buffer[i] == dataBlock[i])
            count++;
    }
    Serial.print(F("Number of bytes that match = ")); Serial.println(count);
    if (count == 16) {
        Serial.println(F("Success :-)"));
        
    } 
    else {
        Serial.println(F("Failure, no match :-("));
        Serial.println(F("  perhaps the write didn't work properly..."));
   
    }
    Serial.println();
        
    // Выводим данные
    Serial.println(F("Current data in sector:"));
    mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
    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);
    }
}

 

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

Yer пишет:

чтобы при каждом срабатывание значение в 16 чейке уменшалься

Чего, чего?

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Yer пишет:

чтобы при каждом срабатывание значение в 16 чейке уменшалься

Чего, чего?

попробую перевести :)

- в строках 59-62 определена структура. Автор хочет, чтобы значение 16-ого поля при каждом приложении нужной карты последовательно уменьшалось.

Повидимо, ТС собирается сделать что-то типа транспортной карты с ограниченным количеством проходов.

Yer
Offline
Зарегистрирован: 12.02.2016

Спасибо что более подробно описали суть проблемы

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

b707 пишет:

- в строках 59-62 определена структура. Автор хочет, чтобы значение 16-ого поля при каждом приложении нужной карты последовательно уменьшалось.

Тогда у автора проблемы. Там определён массив и у него попросту нет 16-го элемента - нечему уменьшаться :(((

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

В той нумерации, что привел ТС в комментиариях, 16-й элемент имеется.

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

andriano пишет:

В той нумерации, что привел ТС в комментиариях, 16-й элемент имеется.

В комментариях или в воспалённой фантазии автора может иметься любой элемент, но с этим на другой форум.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

andriano пишет:

В той нумерации, что привел ТС в комментиариях, 16-й элемент имеется.

и как к нему обратится ? неужели

dataBlock[16]

кол-во их 16, но перый, это нулевой последний 15. 

опять холивар какой то.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

короче авТор, в 104 строку вставляешь

if (dataBlock[15] >0) dataBlock[15] = dataBlock[15] -1;

и не паришься.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

xDriver пишет:

и как к нему обратится ?

Главное - понятно, какой именно элемент автор считает "шестнадцатым". Никто не мешает ему располагаться в массиве хоть на первом месте. В данном случае:

#define sexteenth 15
...
dataBlock[sexteenth]...
// но никто не мешает, например, и:
#define sexteenth 0

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Главное - понятно, что такая охинея не пройдет

#define sexteenth 16

А что там ему "мешает", одному ему известно.

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

xDriver пишет:

опять холивар какой то.

Причём на ровном месте.

То-ли тем достойных поубавилось, то-ли на исчезновение клапауция у народа болезненная реация :(

b707
Offline
Зарегистрирован: 26.05.2017

andriano пишет:

#define sexteenth 15

Андриано. всюду вам СЕКС мерещится :)

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

b707 пишет:

Андриано. всюду вам СЕКС мерещится :)

Нормальный, здоровый мужик! А то блин, развелось тут ... сами знаете :(

Yer
Offline
Зарегистрирован: 12.02.2016

а если будем вставит другой ключ

Yer
Offline
Зарегистрирован: 12.02.2016
104 строке написал 
if (dataBlock[15] >0)
 dataBlock[15] = dataBlock[15] -1;
last=dataBlock[15];	 

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

 

b707
Offline
Зарегистрирован: 26.05.2017

Yer пишет:

104 строке написал 
if (dataBlock[15] >0)
 dataBlock[15] = dataBlock[15] -1;
last=dataBlock[15];	 

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

 

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

Yer
Offline
Зарегистрирован: 12.02.2016

а как читать содержимое текущего ключа чтобы не записать туда старое значение

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Надеваешь очки, и водя пальцами по ключу и шевеля губами, читаешь его содержимое. 

Забыл. К пальцу нада синей изолентой примотать модуль MFRC522. 

b707
Offline
Зарегистрирован: 26.05.2017

Yer пишет:

а как читать содержимое текущего ключа чтобы не записать туда старое значение

странный вопрос. В вашем скетче, начиная со строки 84 - чтение блока ключа.

хотя, судя по вопросу, это не ваш скетч - а скопированный где-то без всякого понимания

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

DetSimen пишет:

Забыл. К пальцу нада синей изолентой примотать модуль MFRC522. 

Так то лучше, а то смотрю - вроде недоработка какая-то.

Yer
Offline
Зарегистрирован: 12.02.2016

правильно заметили скетч где то на форуме скачал, пока не получается с несколькоми ключами работать

так как записывает значение первого ключа на второй ключ.

b707
Offline
Зарегистрирован: 26.05.2017

Yer пишет:

правильно заметили скетч где то на форуме скачал, пока не получается с несколькоми ключами работать

так как записывает значение первого ключа на второй ключ.

совет один - разбирайтесь, как работает этот код. ИМХО, там есть все. что вам нужно

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Думаю, надо сначала более простои пример паматреть. Разобраца.

Yer
Offline
Зарегистрирован: 12.02.2016

немножко трудно разобратся с кодом

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Yer пишет:

немножко трудно разобратся с кодом

А кому легко? Пока не научишься с трудом, но сам  разбираться, так и будешь чужие коды по сети тырить, а потом за изменениями по форумам побираться.

Работай, пользы больше будет.

toc
Offline
Зарегистрирован: 09.02.2013

Yer,

>>Запись в ключ RFID 16МГц

Однако, не 16 МГц, а 13.56 МГц

>> The MFRC522 is a highly integrated reader/writer IC for contactless communication
at 13.56 MHz.

https://www.nxp.com/docs/en/data-sheet/MFRC522.pdf

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Yer пишет:

немножко трудно разобратся с кодом


 

Пьер, как ты находишь мою грудь? С трудом Сюзанна, с трудом...

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ua6em пишет:
Пьер, как ты находишь мою грудь? С трудом Сюзанна, с трудом...
Толерантней надо к людям.  Надо было так написать

Пьер, как ты находишь мою грудь? Немножечко  трудно Сюзанна, совсем немножечко...

Yer
Offline
Зарегистрирован: 12.02.2016

Не подскажите как можно понять код написанной для ключа rfid

b707
Offline
Зарегистрирован: 26.05.2017

Yer пишет:
Не подскажите как можно понять код написанной для ключа rfid

Yer. на такие вопросы вы ничего, кроме стеба, не дождетесь. Напишите, что конкретно в коде - какие операторы, какие строки - вам непонятно, тогда шансов на ответ больше.

Yer
Offline
Зарегистрирован: 12.02.2016

Спасибо что откликнулись мне непонтно вот этот код:

 status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);

фунция dump_byte_array как работает непонятно

Yer
Offline
Зарегистрирован: 12.02.2016

Добрый день пробовал читать данные с блока ячейки вроде получилось но записывает значение к второму ключю.