Как выполнить код только один раз, когда есть карта RFID или нет - PullRequest
0 голосов
/ 27 августа 2018

Мой код очень прост, но я не знаю, как выполнить простую задачу.

Каждый раз, когда читается RFID-карта, я хочу, чтобы она однажды инициировала событие.Это работает нормально в отдельности.

Однако я также хочу, чтобы каждый раз происходило другое одноразовое событие при каждом извлечении карты.Этот бит, кажется, все испортил.

Я использую библиотеку MFRC522.

Может кто-нибудь сказать мне метод, чтобы сделать оба в одном и том же коде?Я немного зеленоват во всем этом.

Большое спасибо заранее :) Мой код здесь:

#include <MFRC522.h> 
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.

bool executed = false;


void setup() {
  Serial.begin(9600);   // Initiate a serial communication    
  SPI.begin();      // Initiate  SPI bus
  mfrc522.PCD_Init();   // Initiate MFRC522
}


void loop() { 

  if ( mfrc522.PICC_IsNewCardPresent()) {    
    if ( mfrc522.PICC_ReadCardSerial()) {
      Serial.println("Great!.. each time a card is read and re-read this text will print *ONCE ONLY*");
    }     
  } 

// BELOW I WANT TO EXECUTE A COMMAND *ONCE ONLY* EACH TIME A CARD IS TAKEN AWAY
// WHEN UNCOMMENTED, THE "Oh dear.." PRINTS CONTINUOUSLY 

//  if ( !mfrc522.PICC_IsNewCardPresent()) {  
//    Serial.println("Oh dear... this seems to keep printing... ");  
//  }

  mfrc522.PICC_HaltA();          // Halt PICC
  mfrc522.PCD_StopCrypto1();     // Stop encryption on PCD  
}

Кроме того, исправленный код, который я также попробовал, выглядит следующим образом.Это тоже не сработало.На ней была напечатана настоящая карта, но когда ее забрали, несколько отпечатков непрерывно происходили:

    #include <SPI.h>
#include <MFRC522.h>
#define RST_PIN    9
#define SS_PIN    10

MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance

bool executed = false;

void setup() {
  Serial.begin(9600); // Initialize serial communications with the PC
  SPI.begin(); // Init SPI bus
  mfrc522.PCD_Init(); // Init MFRC522
  Serial.println("Waiting for RFID-chip...");
}

void loop() {
  if ( mfrc522.PICC_IsNewCardPresent()) {    
    if ( mfrc522.PICC_ReadCardSerial()) {
      Serial.println("Great!.. each time a card is read and re-read this text will print *ONCE ONLY*");
      executed = true;
    }     
  } 
  else {  
    if (executed) {
      Serial.println("Oh dear... this seems to keep printing... ");  
      executed = false;
    }
  }
}

1 Ответ

0 голосов
/ 27 августа 2018

Возможно, вместо 2 , если тычинок, вы можете объединить их в оператор if-else .Вы также хотите использовать переменную executed, созданную вверху внутри ваших условий.

Вот как я ее вижу:

if ( mfrc522.PICC_IsNewCardPresent()) {    
  if ( mfrc522.PICC_ReadCardSerial()) {
    Serial.println("Great!.. each time a card is read and re-read this text will print *ONCE ONLY*");
    executed = true;
  }     
} 
else {  
  if (executed) {
    Serial.println("Oh dear... this seems to keep printing... ");  
    executed = false;
  }
}
...