Программа Arduino для сканирования двух разных RFID-карт в одной программе? Я использую nodemcu-esp8266, программу чтения rc522 и Firebase.

/*Мой проект — система управления библиотекой с использованием RFID-карт. Я пытаюсь сгенерировать код, в котором пользователь сначала сканирует книгу, а затем запись будет помещена в таблицу Issued_Books в Firebase. Затем пользователь сканирует свой идентификатор, чтобы убедиться, что книга будет выпущена по его/ее идентификатору. Но в моей программе сканируются только id книг. После этого не удается сканировать идентификаторы пользователей. Я новичок, может ли кто-нибудь мне помочь? */

//Мой код цикла следующий:

void loop() {


  if ( !mfrc522.PICC_IsNewCardPresent() ) {
    delay(50);
    return;
  }

  if ( !mfrc522.PICC_ReadCardSerial() ) {
    delay(50);
    return;
  }
String book; 

  for ( byte i = 0; i< mfrc522.uid.size; i++ ) {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
    book.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
    book.concat(String(mfrc522.uid.uidByte[i], HEX));}
    book.toUpperCase();

    Firebase.pushString("Issued_Books/Book_rfid",book);

      Serial.println();

  if ( !mfrc522.PICC_IsNewCardPresent() ) {
    delay(50);
    return;
  }

  if ( !mfrc522.PICC_ReadCardSerial() ) {
    delay(50);
    return;
  }
  String user;

  //Serial.print("Сканируйте свой идентификатор: ");
    for ( byte i = 0; i< mfrc522.uid.size; i++ ) {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
    user.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
    user.concat(String(mfrc522.uid.uidByte[i], HEX));}
    user.toUpperCase();
    //Serial.print(F("UID карты: "));
    Firebase.setString("Issued_Books/Book_rfid/user_rfid",user);

    delay(3000);
}

, 👍0


1 ответ


1

также просмотрите sprintf, чтобы получить шестнадцатеричное форматирование (У меня нет этих библиотек, поэтому я не могу протестировать, все это написано в редакторе stackexchange, поэтому может быть где-то опечатка)

unsigned long startScanTime;
bool GotBookId = false, GotUserId = false;
void loop() {
GotBookId = false;
GotUserId = false;

  if ( !mfrc522.PICC_IsNewCardPresent() ) {
    delay(50);
    return;
  }

  if ( !mfrc522.PICC_ReadCardSerial() ) {
    delay(50);
    return;
  }
String book; 

  for ( byte i = 0; i< mfrc522.uid.size; i++ ) {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
    book.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
    book.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
    book.toUpperCase();
    if(book != "")
       GotBookId = true;


    Serial.println("Got Book");

startScanTime = millis(); // таймаут для получения карты пользователя
  while( !mfrc522.PICC_IsNewCardPresent() && (millis() - startScanTime < SCAN_TIMEOUT) ) {
   // ничего не делаем, но ждем
  }

  if(!mfrc522.PICC_IsNewCardPresent())
  { //не получен идентификатор пользователя, возвращаемся из цикла
      return;
  }
  if ( !mfrc522.PICC_ReadCardSerial() ) {   
    return; //никогда не следует сталкиваться с этим, если библиотека работает правильно
  }
  String user;

  Serial.print("Scan your id: ");
    for ( byte i = 0; i< mfrc522.uid.size; i++ ) {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
    user.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
    user.concat(String(mfrc522.uid.uidByte[i], HEX));}
    user.toUpperCase();
    //Serial.print(F("UID карты: "));
    GotUserId = true;




   if(GotBookId && GotUserId){
       Firebase.pushString("Issued_Books/Book_rfid",book);
       Firebase.setString("Issued_Books/Book_rfid/user_rfid",user);
   }
}
,

Спасибо за ответ, но на самом деле даже этот код сталкивается с той же проблемой. После первого сканирования код в конечном итоге отправляет тот же RFID, что и «книга» и «пользователь» в Firebase, где я хочу, чтобы пользователь отсканировал книгу, RFID которой будет храниться в Firebase, затем пользователь отсканирует свой идентификатор, и идентификатор пользователя будет установлен для этой конкретной книги., @Dhiraj

Каждая книга будет выпущена конкретным пользователем... поэтому идентификатор пользователя должен храниться каждый раз по-разному для этой конкретной книги. Я имею в виду, что у 1 книги RFID будет 1 RFID пользователя. но из-за setString(); каждый раз он обновляет только предыдущий идентификатор. Любое решение вышеуказанных проблем?, @Dhiraj

Я не работал с Firebase, поэтому не знаком с их API, но 10-секундный запрос Google привел меня сюда, в котором указан метод обновления, который вы должны использовать вместо заданной строки. https://firebase.google.com/docs/database/admin/save-data, @Lev

спасибо, но я не понимаю, как это сделать в Firebase arduino. Я имею в виду через программирование на C, @Dhiraj

вы пробовали что-то вроде Firebase.setString(String("Issued_Books/Book_rfid/") + String(book) + String("/user_rfid"),user);, @Lev