MFRC522 не обнаруживает карты после первого цикла
Правка: я обнаружил, что что-то не так с кабелями. Я решил проблему. Спасибо всем, кто пытался помочь.
Я работаю над проектом, который в основном должен делать:
- Прочитайте UID карты RFID.
- Получить выбор от пользователя с помощью кнопок.
- Перезапустите код для новых карт.
Проблема в том, что он считывает карту и получает ввод с кнопок. Но после первого цикла он не обнаруживает другие карты (или снова ту же карту). Вот мой код: (я использую библиотеку miguelbalboa MFRC522 и Arduino UNO)
#include <MFRC522Hack.h>
#include <MFRC522Extended.h>
#include <deprecated.h>
#include <MFRC522Debug.h>
#include <require_cpp11.h>
#include <MFRC522.h>
// прототип 1 копия
#include <SPI.h>
// Определяем номера выводов для mfrc522
#define SS_PIN 10
#define RST_PIN 9
#define BLUE_BUT A0
#define RED_BUT A1
// Определяем номера выводов для ЖК-дисплея
const int RS = A0 , EN = A1 , D4 = A5 , D5 = A4 , D6 = A3 , D7 = A2;
int uids[] = {14805 ,25673};
int votedArray[] = {};
String uidNames[] = {"WHITE" , "BLUE"};
// Создаем экземпляры LCD и MFRC522
MFRC522 mfrc522(SS_PIN , RST_PIN);
unsigned long getCardID(int showCardData = 0){
/* this function gets the uid of the rfid card
and returns the uid in unsigned long format */
/* this fn. should be called with argument 1
if printing the card data to the serial monitor
is needed. */
unsigned long UID_unsigned;
UID_unsigned = mfrc522.uid.uidByte[0] << 24;
UID_unsigned += mfrc522.uid.uidByte[1] << 16;
UID_unsigned += mfrc522.uid.uidByte[2] << 8;
UID_unsigned += mfrc522.uid.uidByte[3];
if(showCardData==1){
Serial.println("UID Unsigned int");
Serial.println(UID_unsigned);
String UID_string = (String)UID_unsigned;
long UID_LONG=(long)UID_unsigned;
Serial.println("UID Long :");
Serial.println(UID_LONG);
Serial.println("UID String :");
Serial.println(UID_string); } // вывод данных карты на последовательный монитор
int UID_int = (int) UID_unsigned;
return UID_int;
}
void showCardData(){
/* this fn. calls getCardID function
with argument 1 to print the data to
the serial monitor (kind of shortcut)*/
getCardID(1);
}
int findInList(int uid , int uidArray[]){
/* this fn. returns the index of the uid in the array if found,
returns -1 if not found*/
int numOfElements = sizeof(uidArray)/sizeof(uidArray[0]); // вычислить количество элементов. в массиве
for (int i = 0 ; i <= numOfElements ; i++) {
if(uid == uidArray[i]){
return i; // если элемент найден в массиве, возвращаем true
}
}
return -1;
}
String getCardName(int cardUID){
int UIDIndex = findInList(cardUID , uids);
if(UIDIndex == -1){
return "ERROR";
}
else {
String cardName = uidNames[UIDIndex];
return cardName;
}
}
void printCardName(int cardUID){
String cardName = getCardName(cardUID);
if(cardName == "ERROR"){
Serial.print("ERROR! CARD UID: ");
Serial.println(cardUID);
}
else {
Serial.print("CARD NAME: ");
Serial.println(cardName);
}
}
void setup() {
Serial.begin(9600); // В этом. серийный комм. с ПК
SPI.begin(); // В этом. Шина SPI для MFRC522
mfrc522.PCD_Init(); // В этом. карта MFRC522
pinMode(BLUE_BUT , INPUT);
pinMode(RED_BUT , INPUT);
}
void loop() {
// Ищем новые карты
if ( ! mfrc522.PICC_IsNewCardPresent()){
Serial.println("CARD NOT PRESENT");
return;
}
// Проверяем, был ли прочитан NUID
if ( ! mfrc522.PICC_ReadCardSerial()) {
Serial.println("CARD NOT read");
return; }
int cardUID = getCardID();
Serial.println("CARD UID READ");
printCardName(cardUID);
Serial.println("SELECT WITH BUTTONS");
// получить голос(cardUID);
int blueState = LOW , redState = LOW ;
while(1) {
blueState = digitalRead(BLUE_BUT);
redState = digitalRead(RED_BUT);
if(blueState == HIGH){
Serial.println("BLUE");
break;
}
if(redState == HIGH){
Serial.println("RED");
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
break;
}
}
Serial.println("PROGRAM COMPLETE");
}
Я уже пытался добавить
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
но не помогло.
А вот скриншот Serial Monitor после чтения первой карты и получения кнопки ввода.
Я проверял похожие проблемы, но решения мне не помогли.
@JamCry, 👍0
Обсуждение1 ответ
▲ 1
Я предполагаю, что Кнопки
и считыватель RFID
подключены к контакту 3,3 В на Arduino. Переместите кнопки на 5 В, оставьте RFID только на 3,3 В.
,
@Lucreitus
Смотрите также:
- Как использовать RFID-RC522 с Arduino?
- Как остановить SoftwareSerial от получения данных и повторно включить его в какой-то другой момент?
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- Использование прерываний с RC522
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- rfid_default_keys проверить с помощью RC522
- MFRC522: прошивка неизвестна
- MFRC522 не сканируется карта
Очевидно, он возвращается к одному из двух ifs в начале вашего цикла. Ваша задача выяснить, какие., @Majenko
Спасибо за ответ Маженко, вы правы, я проверил. Я обнаружил, что первый оператор if (PICC_IsNewCardPresent()), вызывающий это. А в чем может быть проблема, почему не видит карты?, @JamCry
Я думаю, подсказкой может быть слово «новая» — она не обнаружит одну и ту же карту дважды (во второй раз она уже не новая, а старая), и, может быть, другие карты имеют один и тот же идентификатор или, может быть, сломаны? Кто знает... Получаете ли вы одинаковый результат независимо от того, какую карту вы попробуете первой?, @Majenko
Я не думаю, что это связано с картами, потому что, когда я запускаю код без части «getVote», он работает нормально: считывает UID карты, печатает имя карты. Что-то в этой части должно воздействовать на читателя. И да, результат один и тот же независимо от порядка карт., @JamCry
Какие контакты КРАСНЫЕ_НО и СИНИЕ_НО?, @Majenko
A0 (синий) и A1 (красный), @JamCry
Я не вижу там ничего, что могло бы вызвать это. Можете ли вы поделиться всем своим скетчем? Может быть что-то, что, по вашему мнению, не связано, но является причиной., @Majenko
Добавил весь скетч в основной пост., @JamCry
Ничто сразу не бросается мне в глаза, хотя мне действительно не нравится ваше обильное использование объектов String повсюду., @Majenko