Когда RFID-метка удаляется

После перезаписи и получения хорошего контроля над тем, что я получил в своем эскизе, мне нужна помощь.

Итак, в моем эскизе я могу воспроизвести MP3-трек с определенным тегом, но когда этот тег удален, я не могу запустить процесс затухания.

Итак, для всего, что помогало в предыдущих, где я просто скомпоновал много кода и надеялся на лучшее, у этого должен быть неплохой фундамент.

Но я застрял в той части, которая была прокомментирована.

//RFID

#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN         9  // reset pin 9
#define SS_PIN          10 // sda pin 10
MFRC522 rfid(SS_PIN, RST_PIN); // Create MFRC522 instance

// = 0001.mp3    8C DE 63 A9   uid's for me to relate to mp3 tracks.
// = 0002.mp3    0A 97 F3 16 /
// = 0003.mp3    3A 5F DE 16

//mp3 player
#include<SoftwareSerial.h>
int mp3Pin[2] = { 5, 4 }; //Rx/Rx

// For the checksum to the mp3
#define startByte 0x7E
#define endByte 0xEF
#define versionByte 0xFF
#define dataLength 0x06
#define infoReq 0x01

SoftwareSerial mp3(mp3Pin[0], mp3Pin[1]); // Rx, Tx

void setup() {
  Serial.begin(9600); // Initialize serial communications with the PC
  SPI.begin(); // Init SPI bus
  rfid.PCD_Init(); // Init MFRC522
  rfid.PCD_DumpVersionToSerial(); // Print version of RFID

  //Mp3
  mp3.begin(9600); // Init mp3
  delay(1000);
  sendMP3Command(0x3F, 0, 0); // Send request for initialization parameters
  sendMP3Command(0x06, 0, 20); // Vol set to 30
  sendMP3Command(0x07, 0, 0); // EQ = pop
}

void loop() {
  // Look for new cards
  if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
    //In new card found and new serial
    /*printHex(rfid.uid.uidByte, rfid.uid.size); // Print the Hex uid &
      Serial.println(); // use to get new uids.*/
    {
      String content = "";
      byte letter;
      for (byte i = 0; i < rfid.uid.size; i++) {
        content.concat(String(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "));
        content.concat(String(rfid.uid.uidByte[i], HEX));
      }
      content.toUpperCase();
      if (content.substring(1) == "0A 97 F3 16") {
        //change here the UID of the card/cards that you want to give access
        //Serial.println("hello World");
        Serial.println("0002.mp3");
        sendMP3Command(0x03, 0, 0002); // Play track 0002.mp3
        sendMP3Command(0x19, 0, 0); // Loop track playing
        delay(30);
      }
      /*else !rfid.PICC_IsNewCardPresent();{
        sendMP3Command(0x06, 0, 28); // Reduce vol by 2 and fade out
        delay(30);
        sendMP3Command(0x06, 0, 26);
        delay(30);
        sendMP3Command(0x06, 0, 24);
        delay(30);
        sendMP3Command(0x06, 0, 22);
        delay(30);
        sendMP3Command(0x06, 0, 20);
        delay(30);
        sendMP3Command(0x06, 0, 18);
        delay(30);
        sendMP3Command(0x06, 0, 16);
        delay(30);
        sendMP3Command(0x06, 0, 14);
        delay(30);
        sendMP3Command(0x06, 0, 12);
        delay(30);
        sendMP3Command(0x06, 0, 10);
        delay(30);
        sendMP3Command(0x06, 0, 8);
        delay(30);
        sendMP3Command(0x06, 0, 6);
        delay(30);
        sendMP3Command(0x06, 0, 4);
        delay(30);
        sendMP3Command(0x06, 0, 2);
        delay(30);
        sendMP3Command(0x06, 0, 0);
        //sendMP3Command(0x16, 0, 0); // Stop
        delay(500); // Change value if you want to read cards faster
        }*/
    }
    // Halt PICC
    rfid.PICC_HaltA();
    // Stop encryption on PCD
    rfid.PCD_StopCrypto1();
  }
}

void sendMP3Command(byte Command, byte Param1, byte Param2) {
  // Calculate the checksum
  unsigned int checkSum = -(versionByte + dataLength + Command + infoReq + Param1 + Param2);
  // Construct the command line
  byte commandBuffer[10] = { startByte, versionByte, dataLength, Command, infoReq, Param1, Param2, highByte(checkSum), lowByte(checkSum), endByte };
  for (int cnt = 0; cnt < 10; cnt++) {
    mp3.write(commandBuffer[cnt]);
  } // Delay needed between successive commands delay(30); }
  /*   // Print the Hex uid & use to get new uids.
    void printHex(byte * buffer, byte bufferSize) {
    for (byte i = 0; i < bufferSize; i++) {
      Serial.print(buffer[i] < 0x10 ? " 0" : " ");
      Serial.print(buffer[i], HEX);
    }
    }*/
1 голос | спросил jonboy79 22 AMpSun, 22 Apr 2018 02:31:46 +030031Sunday 2018, 02:31:46

1 ответ


1

В принципе, вы написали этот код:

void loop() 
{
  // Look for new cards
  if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) 
  {
    {
      // ...
      if (content.substring(1) == "0A 97 F3 16") 
      {
        // play
      } else
      {
        // stop
      }
    }
    // ...
  }
}

Попробуйте что-то вроде этого:

bool playing = false;

void loop() 
{
  // Look for new cards
  if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) 
  {
    // ...
    if (content.substring(1) == "0A 97 F3 16") 
    {
      // play
      playing = true;
    }
    // ... 
  }
  if (playing && !anyCardPresent())
  {
    // stop
    playing = false;
  }
}

и для реализации odCardPresent обратитесь к этому обсуждение - если больше последовательных вызовов ошибки PICC_ReadCardSerial, вы можете считать это удаляемой картой

ответил gabonator 22 AMpSun, 22 Apr 2018 10:54:05 +030054Sunday 2018, 10:54:05

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132