Как выполнить действие, если обнаружено два 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);
}
}
@N S , 👍0
2 ответа
Вы можете сохранять текущее время при каждом считывании карты, а затем при считывании другой карты проверять, сколько времени прошло с момента считывания последней карты
сначала создайте пару переменных
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 или «их проверки».
Вы можете попробовать:
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;
}
}
Этот код предполагает, что карты должны быть предъявлены и прочитаны по порядку.
- Как остановить SoftwareSerial от получения данных и повторно включить его в какой-то другой момент?
- Код датчика RFID+отпечатков пальцев
- ЖК-дисплей с байтовым массивом
- Вывести 2 числа, хранящиеся в 24-битном формате, в десятичном формате.
- как заставить последовательные данные ждать, пока не будет достигнута определенная длина
- Сопоставление входящих данных с переменной
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?