MFRC522 и светодиод.
- Войдите на сайт для отправки комментариев
Вс, 29/04/2018 - 20:13
Всем привет!
Прежде чем написать, воспользовался поиском по форуму и нечего вразумительного не нашел пл решению своей задачи...
Не могу понять, как написать логику работы следующую:
Если карточка приложена к считывателю, то светодиод не горит, если отсутствует, то горит.
Вроде элементарно, но му в итоге получаем мигающий светодиод, если карта приложена.
Вот базовый код:
#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);
}
А что в сериал выводит?
При поднесенной карточке:
:) пасибки, поржал.. там жеж return натыкан везде где надо и не очень ..
ТС-у:
1. YesCard: строка 31 или 32: пропущено else{, строка 35: соответственно отсутствует }
2. NoCard выводится при приложенной карточке (срабатывает условие), потому что приложенная карточка УЖЕ не является "новой", она "таже самая"..
Ну .. это мне мой ХШ кажет .. врет может быть. ;)
Немного переработал код для читабельности:
#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); }При приложенной карте вообще бред получился в консоле...
Почему Вы считаете что это "бред"? Вижу что как написали - так оно и работает, согласно вашего плану, пардон "программе":
Обнаружена новая карта, успешное чтение карты, карта торчит старая, неудачное ПОВТОРНОЕ чтение с карты.
Последнее действие видимо сбрасывает признак чтения с карты и "цикл" повторяется заново, потому что карта после сброса превратилась снова в "новую". Все согласно программе.
Что Вам надо? Мне кажется что Вам поможет блокировка повторного опроса номера карты, если она "не новая" а таже самая.. но, в таком разе Вам потребуется как-то развести ситуапции "нет карты вовсе" и "не новая карта". Шукайте, смотрите как устроена эта библиотека, есть там что-то в этом направлении или нет. Скорее всего Вы не верно понимаете логику работы этой библиотеки. Сам с ней не работал, и желания лазить в её потроха - увы нет.
Вообщем рабочий код получился такой
#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); }