微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Arduino RFID (MFRC522) 问题 - 一段时间后停止读取标签

如何解决Arduino RFID (MFRC522) 问题 - 一段时间后停止读取标签

有一段时间我想有一个 Arduino 控制的户外灯光开关,几周前我创建了它,但我遇到了问题。

我需要在外面安装一个 RFID 阅读器,当提供适当的标签时,它会打开灯一段时间,并且一切正常,但只能使用一段时间。有时在几个小时后,有时在使用标签功能几天后不再工作,直到我重置整个 Arduino(还安装了一个霍尔传感器,当我的门打开时它会打开灯并且工作得很好)

我的问题是 - 这段代码有什么问题(我怀疑是“rfid.PICC_HaltA(); rfid.PCD_StopCrypto1();”底部,因为我不知道如何使用它以及完全诚实的做法)。我不是程序员,我是个菜鸟,非常感谢您的帮助。

编辑:在油漆中绘制快速表示以显示它的外观IRL:

enter image description here

我没有绘制所有单独的颜色和到 GPIO 的连接,因为它们都很好 - 就像我说的那样,它可以工作,但只有一段时间,直到我重置整个事情。 Arduino 是 Nano(旧引导加载程序),RFID 阅读器是 RC522。磁性霍尔传感器只是一个普通传感器,在其下方的门上安装有磁铁,因此它知道门何时打开/关闭。整个想法是这样的:

开门时-关门后亮起并保持6秒以上

当门关闭显示标签时 - 亮起 15 秒,然后返回检查门是否打开/关闭

#include <SPI.h>
#include <MFRC522.h>

//#define czas_trwania 5000
//blue
const byte UID1[] = {0xA7,0x8C,0x24,0xD9};
//blacks
const byte UID2[] = {0x10,0x84,0xD2,0x2A};
const byte UID3[] = {0xDC,0x46,0xB6,0x91};
const byte UID4[] = {0xB0,0xE8,0xC4,0x2A};
//reds
const byte UID5[] = {0x9E,0xC8,0xEA,0xB3};
const byte UID6[] = {0xFE,0xA5,0xF7,0xB3};
//const byte UID6[] = {0x70,0xBA,0x35,0xA5};

MFRC522 rfid(10,9);
MFRC522::mifare_Key key;
int in1 = 7;
int dooropen = 8;
int state = 0;
int tester = 0;
void setup() {
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();
  pinMode(in1,OUTPUT);
  pinMode(dooropen,INPUT);
  digitalWrite(in1,LOW);
}

void loop() {

  state = digitalRead(dooropen);

  if (state == HIGH) {
    //Serial.println("Door Opened");
    tester = 1;
    digitalWrite(in1,HIGH);
  } else {
    if (tester == 1) {
      delay(6000);
      tester = 0;
    }
    //Serial.println("Door Closed");
    digitalWrite(in1,LOW);

    if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
      if (rfid.uid.uidByte[0] == UID1[0] &&
          rfid.uid.uidByte[1] == UID1[1] &&
          rfid.uid.uidByte[2] == UID1[2] &&
          rfid.uid.uidByte[3] == UID1[3] ||
          rfid.uid.uidByte[0] == UID2[0] &&
          rfid.uid.uidByte[1] == UID2[1] &&
          rfid.uid.uidByte[2] == UID2[2] &&
          rfid.uid.uidByte[3] == UID2[3] ||
          rfid.uid.uidByte[0] == UID3[0] &&
          rfid.uid.uidByte[1] == UID3[1] &&
          rfid.uid.uidByte[2] == UID3[2] &&
          rfid.uid.uidByte[3] == UID3[3] ||
          rfid.uid.uidByte[0] == UID4[0] &&
          rfid.uid.uidByte[1] == UID4[1] &&
          rfid.uid.uidByte[2] == UID4[2] &&
          rfid.uid.uidByte[3] == UID4[3] ||
          rfid.uid.uidByte[0] == UID5[0] &&
          rfid.uid.uidByte[1] == UID5[1] &&
          rfid.uid.uidByte[2] == UID5[2] &&
          rfid.uid.uidByte[3] == UID5[3] ||
          rfid.uid.uidByte[0] == UID6[0] &&
          rfid.uid.uidByte[1] == UID6[1] &&
          rfid.uid.uidByte[2] == UID6[2] &&
          rfid.uid.uidByte[3] == UID6[3]) {
            digitalWrite(in1,HIGH);
            delay(15000);
            digitalWrite(in1,LOW);
          }
          rfid.PICC_HaltA();
          rfid.PCD_StopCrypto1();
        }
      }
    }

我知道这 if 会让你们中的一些人畏缩,但我不知道如何处理其他情况:(

解决方法

我找不到问题,所以我只是重新设计了你的项目,它应该可以工作。我使它比您当前的项目更易于维护和优化。

对于新设计,我创建了一个原理图和代码:

示意图: Schematic For Project

代码:

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9
#define LED_PIN 7

bool toggle = false;

MFRC522 mfrc522(SS_PIN,RST_PIN);

void setup()
{
  Serial.begin(9600);
  SPI.begin();
  mfrc522.PCD_Init();

  pinMode(LED,OUTPUT);
}
void loop()
{
  if (!mfrc522.PICC_IsNewCardPresent())
  {
    return;
  }
  // Select one of the cards
  if (!mfrc522.PICC_ReadCardSerial())
  {
    return;
  }

  // Use this function to serial print your UID.
  checkUID();

  if (content.substring(1) == "[Insert UID Here]")
  {
    Serial.println("LED Toggle");
    toggleLight();
  }
  else
  {
    Serial.println(" Access denied");

  }
}

void toggleLight()
{
  if (toggle)
  {
    toggle = false;
  }
  else
  {
    toggle = true;
  }
}

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

我没有资源来尝试此操作,但如果您遇到任何问题,请务必告诉我,我会帮助您解决问题。

您还需要包含库:

Library

我花了很多时间做这个,所以我很感激你的支持! ?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。