MFRC522 и светодиод.

AndreyGAM
Offline
Зарегистрирован: 29.04.2018

Всем привет!

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

Не могу понять, как написать логику работы следующую:

Если карточка приложена к считывателю, то светодиод не горит, если отсутствует, то горит.

Вроде элементарно, но му в итоге получаем мигающий светодиод, если карта приложена.

Вот базовый код:

 

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

const int RST_PIN = 0; // пин RST
const int SS_PIN = 15; // пин SDA (SS)

int bluePin = D4; // D-это GPIO4 (D2)

MFRC522 mfrc522(SS_PIN, RST_PIN); // создаём объект MFRC522

void setup() {
  Serial.begin(115200); // инициализация послед. порта
  SPI.begin(); // инициализация шины SPI
  mfrc522.PCD_Init(); // инициализация считывателя RC522
  pinMode(bluePin, OUTPUT);
}

void loop() {
  delay(100);
  // Ожидание прикладывания новой RFID-метки:
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    Serial.println("NoCard");
     digitalWrite(bluePin, LOW);
    return; // выход, если не приложена новая карта
    
  }

  // Считываем серийный номер:
  if ( ! mfrc522.PICC_ReadCardSerial()) {
        return; // выход, если невозможно считать сер. номер
    }

    Serial.println("YesCard");
    digitalWrite(bluePin, HIGH);
    
  
}

 

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

А что в сериал выводит?

AndreyGAM
Offline
Зарегистрирован: 29.04.2018

При поднесенной карточке:

YesCard
NoCard
YesCard
NoCard
....
....
 
При отсутствующей карточке:
 
NoCard
NoCard
NoCard
NoCard
NoCard
NoCard
NoCard
NoCard
NoCard
NoCard
NoCard
 

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

:) пасибки, поржал.. там жеж return натыкан везде где надо и не очень ..

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

ТС-у:

1. YesCard: строка 31 или 32: пропущено else{, строка 35: соответственно отсутствует }

2. NoCard выводится при приложенной карточке (срабатывает условие), потому что приложенная карточка УЖЕ не является "новой", она "таже самая"..

Ну .. это мне мой ХШ кажет .. врет может быть. ;)

AndreyGAM
Offline
Зарегистрирован: 29.04.2018

Немного переработал код для читабельности:

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

const int RST_PIN = 0; // пин RST
const int SS_PIN = 15; // пин SDA (SS)

int bluePin = D4; // D-это GPIO4 (D2)

MFRC522 mfrc522(SS_PIN, RST_PIN); // создаём объект MFRC522

void setup() {
  Serial.begin(115200); // инициализация послед. порта
  SPI.begin(); // инициализация шины SPI
  mfrc522.PCD_Init(); // инициализация считывателя RC522
  pinMode(bluePin, OUTPUT);
}

void loop() {
  delay(250);
  // Ожидание прикладывания новой RFID-метки:
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    Serial.println("Yes:OldCard");
  }
   else
  {
    Serial.println("Yes:NewCard");
  }

  // Считываем серийный номер:
  if ( ! mfrc522.PICC_ReadCardSerial()) 
  {
      HIGHLED("NoCard:ErrorRead");
   // return; // выход, если невозможно считать сер. номер    
  }

  else
   {
   LOWLED("OK:YesCard");
   }
   
}


void HIGHLED(String OUTPrint)
{
 digitalWrite(bluePin, HIGH);
 Serial.println(OUTPrint);
}


void LOWLED(String OUTPrint)
{
 digitalWrite(bluePin, LOW);
 Serial.println(OUTPrint);
}

 

 

 

При приложенной карте вообще бред получился в консоле...

Yes:NewCard
OK:YesCard
Yes:OldCard
NoCard:ErrorRead
Yes:NewCard
OK:YesCard
Yes:OldCard
NoCard:ErrorRead
Yes:NewCard
OK:YesCard
Yes:OldCard
NoCard:ErrorRead
Yes:NewCard
OK:YesCard
Yes:OldCard
NoCard:ErrorRead
Yes:NewCard
OK:YesCard
Yes:OldCard
NoCard:ErrorRead
Yes:NewCard
OK:YesCard
 
Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Почему Вы считаете что это "бред"? Вижу что как написали - так оно и работает, согласно вашего плану, пардон "программе":

Обнаружена новая карта, успешное чтение карты, карта торчит старая, неудачное ПОВТОРНОЕ чтение с карты.

Последнее действие видимо сбрасывает признак чтения с карты и "цикл" повторяется заново, потому что карта после сброса превратилась снова в "новую". Все согласно программе.

Что Вам надо? Мне кажется что Вам поможет блокировка повторного опроса номера карты, если она "не новая" а таже самая.. но, в таком разе Вам потребуется как-то развести ситуапции "нет карты вовсе" и "не новая карта". Шукайте, смотрите как устроена эта библиотека, есть там что-то в этом направлении или нет. Скорее всего Вы не верно понимаете логику работы этой библиотеки. Сам с ней не работал, и желания лазить в её потроха - увы нет.

AndreyGAM
Offline
Зарегистрирован: 29.04.2018

Вообщем рабочий код получился такой

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

const int RST_PIN = 0; // пин RST
const int SS_PIN = 15; // пин SDA (SS)

int bluePin = D4; // D-это GPIO4 (D2)
 boolean NoCard; // Флаг карты
 int NumCicle=0; // Номер цикла

 int AccumNewCard; // накопление переменной новой карты
 
MFRC522 mfrc522(SS_PIN, RST_PIN); // создаём объект MFRC522

void setup() {
  Serial.begin(115200); // инициализация послед. порта
  SPI.begin(); // инициализация шины SPI
  mfrc522.PCD_Init(); // инициализация считывателя RC522
  pinMode(bluePin, OUTPUT);
 
}

void loop() {
  delay(250);
  NumCicle++;
  
if (AccumNewCard<=0)
    {
      HIGHLED(String(NumCicle)+"NoCard");
    }
    else
    
    {
       LOWLED(String(NumCicle)+"YesCard");
    }
    
  
  // Ожидание прикладывания новой RFID-метки:
  if (mfrc522.PICC_IsNewCardPresent()==true) 
  {
    AccumNewCard=2;
  }


  else

  {
    AccumNewCard--;
    return;
    
  }
  



   
}


void HIGHLED(String OUTPrint)
{
 digitalWrite(bluePin, HIGH);
 Serial.println(String(NumCicle)+":HIGHLED:"+OUTPrint);
}


void LOWLED(String OUTPrint)
{
 digitalWrite(bluePin, LOW);
 Serial.println(String(NumCicle)+":LOWLED:"+OUTPrint);
}