MFRC522 Не получается обработать.

pix_l
Offline
Зарегистрирован: 19.02.2017

Приветствую.

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

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

для начала попробуйте написать это по русски в стиле "если - то". А то пока не понятно

kost82
Offline
Зарегистрирован: 30.11.2015

В библиотеке есть функция PICC_IsNewCardPresent() которая возвращает true если поднести карту к считывателю, а затем блокирует все обращения к карте пока карту не уберешь и не поднесешь заново. Карту поднесли, проверка сработала, читаем серийный номер карты (PICC_ReadCardSerial()) и запоминаем его на необходимое время. Если за это время произошло повторное считывание - игнорируем его. Если время прошло - "забываем" номер карты. Если поднесли другую за это время - записываем другую в эту же переменную.

pix_l
Offline
Зарегистрирован: 19.02.2017

Я именно так и описал. Если вам  не понятно - не стоит пытаться "помогать".

pix_l
Offline
Зарегистрирован: 19.02.2017

Да, есть такое. В оригинальном коде есть следующее:

void loop()
{
if ( ! mfrc522.PICC_IsNewCardPresent())
return;
if ( ! mfrc522.PICC_ReadCardSerial())
return;
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
delay(1000);
}

В итоге, если карту держать - каждую секунду она выводится в лог. Но ничего не блокируется и вообще не понятен код - isNewCardPresent - это не то, что поднесена именно НОВАЯ карта, а просто если что то поднесено.

kost82
Offline
Зарегистрирован: 30.11.2015

pix_l пишет:

Я именно так и описал. Если вам  не понятно - не стоит пытаться "помогать".

Тогда опишите по-нормальному что требуется, я раза на три прочитал абзац и ничонепонял.

В исходниках библиотеки написано, что перед PICC_ReadCardSerial() нужно вызвать одну из функций: PICC_IsNewCardPresent(), PICC_RequestA() или PICC_WakeupA(). Если вызвать PICC_IsNewCardPresent() или PICC_RequestA() - то считывание происходит только один раз. Для повторного считывания надо убрать карту и поднести заново. А если вызвать PICC_WakeupA() - то считывание не блокируется и поднесенная карта считывается каждый раз при вызове этих двух функций. В чем проблема считывать постоянно серийник и в зависимости от того старый он или новый производить действия: запоминать его, забывать через 5 секунд или проверять новая карта пришла или старая?

pix_l
Offline
Зарегистрирован: 19.02.2017

kost82 пишет:

Если вызвать PICC_IsNewCardPresent() или PICC_RequestA() - то считывание происходит только один раз. Для повторного считывания надо убрать карту и поднести заново.

Я привел выше код и чтение происходит через каждую секунду! 

kost82 пишет:

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

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

pix_l
Offline
Зарегистрирован: 19.02.2017

Отбой, кое как сделал, что хотел:

String newCardCode="", lastCardCode="";
long previousMillis = 0;
long interval = 5000;
...
void loop()
{
    unsigned long currentMillis = millis();
    if(currentMillis - previousMillis > interval) {    
    previousMillis = currentMillis;
    newCardCode = "";
    lastCardCode = "";
    }
  if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
    return;
  } else {
    newCardCode ="";
    dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
    previousMillis = currentMillis;
    }
}

 

 

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

pix_l пишет:

Отбой, кое как сделал, что хотел:

String newCardCode="", lastCardCode="";
long previousMillis = 0;
long interval = 5000;
...
void loop()
{
    unsigned long currentMillis = millis();
    if(currentMillis - previousMillis > interval) {    
    previousMillis = currentMillis;
    newCardCode = "";
    lastCardCode = "";
    }
  if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
    return;
  } else {
    newCardCode ="";
    dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
    previousMillis = currentMillis;
    }
}

 

либо потеряли половину кода при копировании на форум, либо выложенный код абсолютно ничего не делает. Зачем, например, проверка интервала в строке 8, если единственное, что при этой проверке делается - очищаются старый и новый коды карт. которые и так (судя по коду) - всегда пустые?