Как выполнить действие, если обнаружено два UID RFID-метки?

Я использую RFID-RC522 и хочу напечатать в серийный номер текстовую строку, если за определенный период времени были прочитаны две метки RFID.

По сути это:
1. Первый тег прочитан (распечатка в серийный номер: тег 1 прочитан)
2. Подождите 2 секунды
3. Второй тег прочитан (печать в серийный номер: тег 2 прочитан)
4. Печать в серийный номер: тег 1 и тег 2 прочитаны)
5. Бонус: сохраняйте это состояние, а затем при нажатии кнопки (печать в серийный номер: тег 1 и тег 2 завершены)

Я знаю, как прочитать UID и распечатать серийный номер, если он прочитан. Огромное спасибо за вашу помощь, это очень ценно.

Вот мой код:

#include <Adafruit_GFX.h>    // Базовая графическая библиотека
#include <Adafruit_ST7735.h> // Аппаратная библиотека
#include <SPI.h>
#include <MFRC522.h>

// Для пробоя можно использовать любые 2 или 3 контакта
// Эти контакты также подойдут для экрана TFT 1,8 дюйма.
#define sclk 4  // SainSmart: SCL
#define mosi 5  // SainSmart: SDA
#define cs   6  // SainSmart: CS
#define dc   7  // SainSmart: RS/DC
#define rst  8  // SainSmart: RES

Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, mosi, sclk, rst);

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);


float p = 3.1415926;

void setup(void) {
  Serial.begin(9600);
  SPI.begin();
  Serial.print("Starting cornhole leaderboard...");
  mfrc522.PCD_Init(); // Инициализация карты MFRC522
  Serial.println("Scan PICC to see UID and type...");
  // Используйте этот инициализатор, если вы используете 1,8-дюймовый TFT-дисплей
  tft.initR(INITR_BLACKTAB);   // инициализируем чип ST7735S, черная вкладка

  // Используйте этот инициализатор (раскомментируйте), если вы используете 1,44-дюймовый TFT
  //tft.initR(INITR_144GREENTAB); // инициализируем чип ST7735S, черная вкладка

  Serial.println("Initialized");

  uint16_t time = millis();
  tft.fillScreen(ST7735_BLACK);
  time = millis() - time;

  Serial.println(time, DEC);

  // большой блок текста
  tft.fillScreen(ST7735_BLACK);
}

void loop() {

  // Ищем новые карты
    if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
    }

    // Выбираем одну из карт
    if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
    }

    if (mfrc522.uid.uidByte[0] == 0xA4 && 
       mfrc522.uid.uidByte[1] == 0xB8 &&
       mfrc522.uid.uidByte[2] == 0xB8 &&
       mfrc522.uid.uidByte[3] == 0x96) {
          Serial.println("Nate has checked in to the game.");
          tft.fillScreen(ST7735_BLUE);
          tft.setTextSize(2);
          tft.setCursor(0, 0);
          tft.setTextColor(ST7735_YELLOW);
          tft.print("Nate ");
          tft.setTextColor(ST7735_WHITE);
          tft.println("has checked in ");
          tft.setTextSize(2);
          tft.println("to the game.");
          delay(2000);
          tft.fillScreen(ST7735_BLACK);
    }

    if (mfrc522.uid.uidByte[0] == 0x03 && 
       mfrc522.uid.uidByte[1] == 0xFD &&
       mfrc522.uid.uidByte[2] == 0xBC &&
       mfrc522.uid.uidByte[3] == 0x02) {
          Serial.println("Ted has checked in to the game.");
          tft.fillScreen(ST7735_RED);
          tft.setTextSize(2);
          tft.setCursor(0, 0);
          tft.setTextColor(ST7735_CYAN);
          tft.print("Ted ");
          tft.setTextColor(ST7735_WHITE);
          tft.println("has checked in ");
          tft.setTextSize(2);
          tft.println("to the game.");
          delay(2000);
          tft.fillScreen(ST7735_BLACK);

    }


}

, 👍0


2 ответа


1

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

сначала создайте пару переменных

unsigned long swipedTime;
int tag1 = 0;
int tag2 = 0;
int swipeTimeOut = 10000; // сколько времени в MS у вас есть, чтобы провести обе карты

Далее мы перейдем к тому, где вы читаете карты.

      if (mfrc522.uid.uidByte[0] == 0xA4 && 
           mfrc522.uid.uidByte[1] == 0xB8 &&
           mfrc522.uid.uidByte[2] == 0xB8 &&
           mfrc522.uid.uidByte[3] == 0x96) {

               ........

               if (tag2 == 1 && millis() - swipedTime < swipeTimeOut ){
                   // обе метки были считаны, выведите серийное сообщение здесь
                }

                tag1 = 1;
                swipedTime = millis();     
        }

        if (mfrc522.uid.uidByte[0] == 0x03 && 
           mfrc522.uid.uidByte[1] == 0xFD &&
           mfrc522.uid.uidByte[2] == 0xBC &&
           mfrc522.uid.uidByte[3] == 0x02) {

               ........


               if (tag1 == 1 && millis() - swipedTime < swipeTimeOut ){
                   // обе метки были считаны, выведите серийное сообщение здесь
                }
                tag2 = 1;
                swipedTime = millis();     


         }

Вам также захочется придумать систему для сброса tag1 и tag2 до 0 или «их проверки».

,

0

Вы можете попробовать:

byte tag1[] = {0xA4, 0xB8, 0xB8, 0x96}; 
byte tag1_read = 0;    // флаг устанавливается при чтении тега 1
byte tag2[] = {0x3, 0xFD, 0xBC, 0x02}; 
byte tag2_read = 0;    // флаг устанавливается при чтении тега 2

int BUTTON = 3;

void setup(){
    pinMode(BUTTON, INPUT_PULLUP);  //установить кнопку как вход, подтянутый к высокому уровню
    .... // остальная часть вашей настройки()
} 

void loop() {

  // Ищите новые карты
    if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
    }

    // Выберите одну из карт
    if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
    }

    if (tag1_read == 0 && memcmp(mfrc522.uid.uidByte, tag1, 4) == 0){
          Serial.println("Tag 1 has been read.");
          tag1_read = 1;   //тег 1 был прочитан
          //delay(2000); //не уверен, зачем нужна задержка
    }

    if (tag1_read && tag2_read == 0 && memcmp(mfrc522.uid.uidByte, tag2, 4) == 0) {
          Serial.println("Tag 2 has been read.");
          tag2_read = 1;    // тег 2 был прочитан
          Serial.println("Both tags have been read.");
    }

    if (digitalRead(BUTTON) == LOW && tag1_read && tag2_read){
        Serial.println("Both tags are finished.");
        tag1_read = 0; tag2_read = 0;
    }
}

Этот код предполагает, что карты должны быть предъявлены и прочитаны по порядку.

,