如何解决Arduino RFID (MFRC522) 问题 - 一段时间后停止读取标签
有一段时间我想有一个 Arduino 控制的户外灯光开关,几周前我创建了它,但我遇到了问题。
我需要在外面安装一个 RFID 阅读器,当提供适当的标签时,它会打开灯一段时间,并且一切正常,但只能使用一段时间。有时在几个小时后,有时在使用标签功能几天后不再工作,直到我重置整个 Arduino(还安装了一个霍尔传感器,当我的门打开时它会打开灯并且工作得很好)
我的问题是 - 这段代码有什么问题(我怀疑是“rfid.PICC_HaltA(); rfid.PCD_StopCrypto1();”底部,因为我不知道如何使用它以及完全诚实的做法)。我不是程序员,我是个菜鸟,非常感谢您的帮助。
我没有绘制所有单独的颜色和到 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 会让你们中的一些人畏缩,但我不知道如何处理其他情况:(
解决方法
我找不到问题,所以我只是重新设计了你的项目,它应该可以工作。我使它比您当前的项目更易于维护和优化。
对于新设计,我创建了一个原理图和代码:
代码:
#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));
}
}
我没有资源来尝试此操作,但如果您遇到任何问题,请务必告诉我,我会帮助您解决问题。
您还需要包含库:
我花了很多时间做这个,所以我很感激你的支持! ?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。