MFRC522 не обнаруживает карты после первого цикла

Правка: я обнаружил, что что-то не так с кабелями. Я решил проблему. Спасибо всем, кто пытался помочь.

Я работаю над проектом, который в основном должен делать:

  1. Прочитайте UID карты RFID.
  2. Получить выбор от пользователя с помощью кнопок.
  3. Перезапустите код для новых карт.

Проблема в том, что он считывает карту и получает ввод с кнопок. Но после первого цикла он не обнаруживает другие карты (или снова ту же карту). Вот мой код: (я использую библиотеку 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 после чтения первой карты и получения кнопки ввода. Последовательный монитор

Я проверял похожие проблемы, но решения мне не помогли.

, 👍0

Обсуждение

Очевидно, он возвращается к одному из двух ifs в начале вашего цикла. Ваша задача выяснить, какие., @Majenko

Спасибо за ответ Маженко, вы правы, я проверил. Я обнаружил, что первый оператор if (PICC_IsNewCardPresent()), вызывающий это. А в чем может быть проблема, почему не видит карты?, @JamCry

Я думаю, подсказкой может быть слово «новая» — она не обнаружит одну и ту же карту дважды (во второй раз она уже не новая, а старая), и, может быть, другие карты имеют один и тот же идентификатор или, может быть, сломаны? Кто знает... Получаете ли вы одинаковый результат независимо от того, какую карту вы попробуете первой?, @Majenko

Я не думаю, что это связано с картами, потому что, когда я запускаю код без части «getVote», он работает нормально: считывает UID карты, печатает имя карты. Что-то в этой части должно воздействовать на читателя. И да, результат один и тот же независимо от порядка карт., @JamCry

Какие контакты КРАСНЫЕ_НО и СИНИЕ_НО?, @Majenko

A0 (синий) и A1 (красный), @JamCry

Я не вижу там ничего, что могло бы вызвать это. Можете ли вы поделиться всем своим скетчем? Может быть что-то, что, по вашему мнению, не связано, но является причиной., @Majenko

Добавил весь скетч в основной пост., @JamCry

Ничто сразу не бросается мне в глаза, хотя мне действительно не нравится ваше обильное использование объектов String повсюду., @Majenko


1 ответ


1

Я предполагаю, что Кнопки и считыватель RFID подключены к контакту 3,3 В на Arduino. Переместите кнопки на 5 В, оставьте RFID только на 3,3 В.

,