Добрый день. Прошу помочь/объяснить в моей проблеме. Есть RC522 и UNO. Хотел бы считывать карты и выводить их к примеру в сериал. Но после считывания мастеркарты при поднесении следующей карты включать светодиод. Спойлер: CODE Код (C++): #include <SPI.h> #include <MFRC522.h> // Ридер SCK 13, MOSI 11, MISO 12 #define SS_PIN 10 //SDA RFID #define RST_PIN 9 //RST RFID MFRC522 mfrc522(SS_PIN, RST_PIN); unsigned long uidDec, uidDecTemp; void setup() { Serial.begin(9600); SPI.begin(); mfrc522.PCD_Init(); pinMode(4, OUTPUT); } void loop() { if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } if ( ! mfrc522.PICC_ReadCardSerial()) { return; } uidDec = 0; for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; } if (uidDec!=504630971) { Serial.println(uidDec); // Просто выводим UID метки в консоль. }else { if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } if ( ! mfrc522.PICC_ReadCardSerial()) { return; } uidDec = 0; for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; } Serial.println(uidDec); // Выводим UID метки в консоль. digitalWrite(4, HIGH); //Зажигаем delay(2000); digitalWrite(4, LOW); //Тушим } } И вот все хорошо только после прочтения мастеркарты я возвращаюсь в начало loop. Т.е. все что после Serial.println(uidDec); // Просто выводим UID метки в консоль. }else { Не выполняется. Как заставить повторно считать карту после поднесения мастеркарты?
чуть переработать архитектуру скетча. После опознания мастер-метки запоминаем этот факт и при повторном чтении карты вспоминаем что перед этим была мастер-метка. Код (C++): #include <SPI.h> #include <MFRC522.h> // Ридер SCK 13, MOSI 11, MISO 12 #define SS_PIN 10 //SDA RFID #define RST_PIN 9 //RST RFID #define ID_MASTER 504630971 // номер мастер-метки #define TIMEOUT 10000 // интервал перед сбросом флага мастер-метки MFRC522 mfrc522(SS_PIN, RST_PIN); unsigned long uidDec; boolean isMasterID = false; // флаг того, что была поднесена мастер-метка void setup() { Serial.begin(9600); SPI.begin(); mfrc522.PCD_Init(); pinMode(4, OUTPUT); } unsigned long readRFID() // функция чтения RFID { unsigned long id, uidDecTemp; if ( ! mfrc522.PICC_IsNewCardPresent()) // нет карты { return 0; } if ( ! mfrc522.PICC_ReadCardSerial()) // карта не читается { return 0; } for (byte i = 0; i < mfrc522.uid.size; i++) // карта читается, возвращаем ее ID { uidDecTemp = mfrc522.uid.uidByte[i]; id = id * 256 + uidDecTemp; } return id; } void loop() { static unsigned long timestamp; uidDec = readRFID(); // запрашиваем ридер Serial.println(uidDec); // выводим UID метки в консоль. if (uidDec == ID_MASTER) // поднесли мастер-метку { isMasterID = true; timestamp = millis(); // запомнили текущее время } else { isMasterID = false; } if (uidDec > 0) // поднесли любую карту { if (isMasterID = true && uidDec =! ID_MASTER) // если до этого была мастер-карта, то включаем LED { digitalWrite(4, HIGH); //Зажигаем isMasterID = false; // сбрасываем флаг delay(2000); digitalWrite(4, LOW); //Тушим } } if (millis() - timestamp > TIMEOUT) // если за 10 сек не поднесли другую метку, флаг мастер-метки аннулируется { isMasterID = false; } }
Странно но не работает и ваш пример. На любую карту он зажигает диод. Почему нельзя считать повторно карту так как в моем коде написано что мешает?
Это 99.99% будет та же самая карта. Никто не успеет её заменить. return; из функции loop() тут же запускает её снова.