Устройство открывания гаражных ворот RFID выходит из строя через некоторое время
Я разрабатывал надстройку для устройства открывания гаражных ворот, которое позволит открывать их снаружи с помощью действительного токена RFID или изнутри с помощью кнопок.
Это работает, как и ожидалось, при первом подключении, но через несколько часов компонент RFID перестает реагировать на прикосновения. Кнопки по-прежнему позволяют открывать, закрывать или останавливать дверь во время действия.
Я не уверен, является ли это проблемой электрического оборудования или ошибкой кода, но любая помощь приветствуется.
#include <AddicoreRFID.h>
#include <SPI.h>
#define uchar unsigned char
#define uint unsigned int
uchar fifobytes;
uchar fifoValue;
AddicoreRFID myRFID; // создаем объект AddicoreRFID для управления модулем RFID
// ------------
// Открыть/закрыть дверь гаража
// ------------
/*-------------
Every program based on Wiring (programming language used by Arduino, and Particle devices) has two essential parts:
setup - runs once at the beginning of your program
loop - runs continuously over and over
-------------*/
// Сначала мы создадим несколько переменных.
// Это наше "сокращение", которое мы будем использовать в программе:
int re1 = 8 ; // Реле IN1 Синий
int re2 = 7; // Реле IN2 Фиолетовый
int re3 = 6; // Реле IN3 Оранжевый
int re4 = 5; // Реле IN4 Желтое
int btn1 = 3;
int btn2 = 4;
int btn3 = 2;
int OpenButtonState = 0;
int CloseButtonState = 0;
int StopButtonState = 0;
int doorstate = 0; // 0 = "Закрыто", 1 = "Открыто"
//--пины для RFID
const int chipSelectPin = 10;
const int NRSTPD = 9;
//Максимальная длина массива
#define MAX_LEN 16
//Конец конфигурации контакта RFID
void setup() {
Serial.begin(9600); // открываем последовательный порт на скорости 9600 бит/с:
// устанавливаем контакты на выходное напряжение
pinMode(re1, OUTPUT);
pinMode(re2, OUTPUT);
pinMode(re3, OUTPUT);
pinMode(re4, OUTPUT);
pinMode(btn1, INPUT);
pinMode(btn2, INPUT);
pinMode(btn3, INPUT);
// запускаем библиотеку SPI:
SPI.begin();
pinMode(chipSelectPin,OUTPUT); // Установите цифровой контакт 10 как ВЫХОД, чтобы соединить его с контактом RFID/ENABLE
digitalWrite(chipSelectPin, LOW); // Активировать считыватель RFID
pinMode(NRSTPD,OUTPUT); // Установить цифровой контакт 9, без сброса и отключения питания
digitalWrite(NRSTPD, HIGH);
myRFID.AddicoreRFID_Init();
//настройка функций веб-вызова
//Particle.function("netopen", R1ON);
//Particle.function("netclose", R2ON);
//Particle.function("netstop", R3ON);
digitalWrite(re1, HIGH); //выключить реле
digitalWrite(re2, HIGH); //выключить реле
digitalWrite(re3, HIGH); //выключить реле
digitalWrite(re4, HIGH); //выключить реле
}
// Эта процедура повторяется снова и снова, как можно быстрее и столько раз, сколько возможно, после вызова функции установки.
// Примечание. Код, который блокируется слишком долго (например, более 5 секунд), может привести к странным вещам (например, разрыву сетевого соединения). Встроенная функция задержки, показанная ниже, безопасно чередует необходимую фоновую активность, поэтому можно безопасно делать сколь угодно длительные задержки, если они вам нужны.
void loop() {
//Петля для RFID ------------------------------------------------------------ -------------------------
uchar i, tmp, checksum1;
uchar status;
uchar str[MAX_LEN];
uchar RC_size;
uchar blockAddr; //Выбор адреса блока операций от 0 до 63
String mynum = "";
str[1] = 0x4400;
//Находим теги, возвращаем тип тега
status = myRFID.AddicoreRFID_Request(PICC_REQIDL, str);
if (status == MI_OK)
{
Serial.println("RFID tag detected");
}
//Антиколлизия, возвращаемый серийный номер тега 4 байта
status = myRFID.AddicoreRFID_Anticoll(str);
if (status == MI_OK)
{
checksum1 = str[0] ^ str[1] ^ str[2] ^ str[3];
Serial.print("The tag's number is:\t");
Serial.print(str[0]);
Serial.print(" , ");
Serial.print(str[1]);
Serial.print(" , ");
Serial.print(str[2]);
Serial.print(" , ");
Serial.println(str[3]);
//проверяем допустимую комбинацию карт
if((str[0] == 333) && (str[1] == 444) && (str[2] == 555) && (str[3] == 666) ) // Вы можете изменить это на первый байт вашего тега, найдя идентификатор карты через Serial Monitor
{
Serial.println("\nKey fob identifed - Josh\n");
if(doorstate == 1) {
//дверь уже открыта так близко
// Закрыть дверь гаража
R2ON(""); // включаем реле
doorstate = 0;
Serial.print("Relay 2 on") ;
Serial.println("");
delay(1000); // ждем 1 секунду
R2OFF(); //выключить реле
Serial.print("Relay 2 off") ;
Serial.println("");
delay(1000); // ждем 1 секунду
Serial.print("Close State Button HIGH - Finished Closing Garage Door") ;
Serial.println("");
} else {
//дверь закрыта так что открывай
//Открыть дверь гаража
R1ON(""); // включаем реле
doorstate = 1;
Serial.print("Relay 1 on") ;
Serial.println("");
delay(1000); // ждем 1 секунду
R1OFF(); //выключить реле
Serial.print("Relay 1 off") ;
Serial.println("");
delay(1000); // ждем 1 секунду
Serial.print("Open State Button HIGH - Finished Opening Garage Door") ;
Serial.println("");
}
} else if((str[0] == 111) && (str[1] == 2222) && (str[2] == 333) && (str[3] == 444) ) { // Вы можете изменить это на первый байт вашего тега, найдя идентификатор карты через Serial Monitor
Serial.println("\nCar Charge Card Identified - Josh\n");
if(doorstate == 1) {
//дверь уже открыта так близко
// Закрыть дверь гаража
R2ON(""); // включаем реле
doorstate = 0;
Serial.print("Relay 2 on") ;
Serial.println("");
delay(1000); // ждем 1 секунду
R2OFF(); //выключить реле
Serial.print("Relay 2 off") ;
Serial.println("");
delay(1000); // ждем 1 секунду
Serial.print("Close State Button HIGH - Finished Closing Garage Door") ;
Serial.println("");
} else {
//дверь закрыта так что открывай
//Открыть дверь гаража
R1ON(""); // включаем реле
doorstate = 1;
Serial.print("Relay 1 on") ;
Serial.println("");
delay(1000); // ждем 1 секунду
R1OFF(); //выключить реле
Serial.print("Relay 1 off") ;
Serial.println("");
delay(1000); // ждем 1 секунду
Serial.print("Open State Button HIGH - Finished Opening Garage Door") ;
Serial.println("");
}
} else if((str[0] == 000) && (str[1] == 11) && (str[2] == 22) && (str[3] == 333) ) { // Вы можете изменить это на первый байт вашего тега, найдя идентификатор карты через Serial Monitor
Serial.println("\nCar Garage Card Identified - Charlotte\n");
if(doorstate == 1) {
//дверь уже открыта так близко
// Закрыть дверь гаража
R2ON(""); // включаем реле
doorstate = 0;
Serial.print("Relay 2 on") ;
Serial.println("");
delay(1000); // ждем 1 секунду
R2OFF(); //выключить реле
Serial.print("Relay 2 off") ;
Serial.println("");
delay(1000); // ждем 1 секунду
Serial.print("Close State Button HIGH - Finished Closing Garage Door") ;
Serial.println("");
} else {
//дверь закрыта так что открывай
//Открыть дверь гаража
R1ON(""); // включаем реле
doorstate = 1;
Serial.print("Relay 1 on") ;
Serial.println("");
delay(1000); // ждем 1 секунду
R1OFF(); //выключить реле
Serial.print("Relay 1 off") ;
Serial.println("");
delay(1000); // ждем 1 секунду
Serial.print("Open State Button HIGH - Finished Opening Garage Door") ;
Serial.println("");
}
}
Serial.println();
delay(1000);
}
myRFID.AddicoreRFID_Halt(); //Командный тег в спящий режим
//Конец цикла для RFID ----------------------------------------------------------- --------------------------
OpenButtonState = digitalRead(btn1);
CloseButtonState = digitalRead(btn2);
StopButtonState = digitalRead(btn3);
if (OpenButtonState == HIGH) {
Serial.print("Open State Button HIGH - Opening Garage Door") ;
Serial.println("");
//Открыть дверь гаража
R1ON(""); // включаем реле
doorstate = 1;
Serial.print("Relay 1 on") ;
Serial.println("");
delay(1000); // ждем 1 секунду
R1OFF(); //выключить реле
Serial.print("Relay 1 off") ;
Serial.println("");
delay(1000); // ждем 1 секунду
Serial.print("Open State Button HIGH - Finished Opening Garage Door") ;
Serial.println("");
}
if (CloseButtonState == HIGH) {
Serial.print("Close State Button HIGH - Closing Garage Door") ;
Serial.println("");
// Закрыть дверь гаража
R2ON(""); // включаем реле
doorstate = 0;
Serial.print("Relay 2 on") ;
Serial.println("");
delay(1000); // ждем 1 секунду
R2OFF(); //выключить реле
Serial.print("Relay 2 off") ;
Serial.println("");
delay(1000); // ждем 1 секунду
Serial.print("Close State Button HIGH - Finished Closing Garage Door") ;
Serial.println("");
}
if (StopButtonState == HIGH) {
Serial.print("Stop State Button HIGH - Stopping Garage Door") ;
Serial.println("");
// Останавливаться
R3ON(""); // включаем реле
doorstate = 1;
Serial.print("Relay 3 on") ;
Serial.println("");
delay(1000); // ждем 1 секунду
R3OFF(); //выключить реле
Serial.print("Relay 3 off") ;
Serial.println("");
delay(1000); // ждем 1 секунду
Serial.print("Stop State Button HIGH - Finished Stopping Garage Door") ;
Serial.println("");
}
// И повторить!
}
int R1ON(String command) {
digitalWrite(re1, LOW); // включаем реле
//Particle.publish("Реле 1 включено - дверь открыта");
delay(1000); // ждем 1 секунду
digitalWrite(re1, HIGH); //выключить реле
//Particle.publish("Реле 1 выключено");
}
void R1OFF() {
digitalWrite(re1, HIGH); //выключить реле
// задержка (1000); // ждем 1 секунду
}
int R2ON(String command) {
digitalWrite(re2, LOW); // включаем реле
//Particle.publish("Реле 2 включено - дверь закрывается");
delay(1000); // ждем 1 секунду
digitalWrite(re2, HIGH); //выключить реле
//Particle.publish("Реле 2 выключено");
}
void R2OFF() {
digitalWrite(re2, HIGH); // включаем реле
// задержка (1000); // ждем 1 секунду
}
int R3ON(String command) {
digitalWrite(re3, LOW); // включаем реле
//Particle.publish("Реле 3 включено - дверь остановлена");
delay(1000); // ждем 1 секунду
digitalWrite(re3, HIGH); //выключить реле
//Particle.publish("Реле 3 выключено");
}
void R3OFF() {
digitalWrite(re3, HIGH); // включаем реле
// задержка (1000); // ждем 1 секунду
}
void R4ON() {
digitalWrite(re4, LOW); // включаем реле
// задержка (1000); // ждем 1 секунду
}
void R4OFF() {
digitalWrite(re4, HIGH); // включаем реле
// задержка (1000); // ждем 1 секунду
}
Обновленный код 7/7/19 @20:53
#include <AddicoreRFID.h>
#include <SPI.h>
//#определить беззнаковый символ unsigned char
#define uint unsigned int
unsigned char fifobytes;
unsigned char fifoValue;
AddicoreRFID myRFID; // создаем объект AddicoreRFID для управления модулем RFID
// ------------
// Открыть/закрыть дверь гаража
// ------------
/*-------------
Every program based on Wiring (programming language used by Arduino, and Particle devices) has two essential parts:
setup - runs once at the beginning of your program
loop - runs continuously over and over
-------------*/
// Сначала мы создадим несколько переменных.
// Это наше "сокращение", которое мы будем использовать в программе:
int re1 = 8 ; // Реле IN1 Синий
int re2 = 7; // Реле IN2 Фиолетовый
int re3 = 6; // Реле IN3 Оранжевый
int re4 = 5; // Реле IN4 Желтое
int btn1 = 3;
int btn2 = 4;
int btn3 = 2;
int OpenButtonState = 0;
int CloseButtonState = 0;
int StopButtonState = 0;
int doorstate = 0; // 0 = "Закрыто", 1 = "Открыто"
//--пины для RFID
const int chipSelectPin = 10;
const int NRSTPD = 9;
//Максимальная длина массива
#define MAX_LEN 16
//Конец конфигурации контакта RFID
void setup() {
Serial.begin(9600); // открываем последовательный порт на скорости 9600 бит/с:
// устанавливаем контакты на выходное напряжение
pinMode(re1, OUTPUT);
pinMode(re2, OUTPUT);
pinMode(re3, OUTPUT);
pinMode(re4, OUTPUT);
pinMode(btn1, INPUT);
pinMode(btn2, INPUT);
pinMode(btn3, INPUT);
// запускаем библиотеку SPI:
SPI.begin();
pinMode(chipSelectPin,OUTPUT); // Установите цифровой контакт 10 как ВЫХОД, чтобы соединить его с контактом RFID/ENABLE
digitalWrite(chipSelectPin, LOW); // Активировать считыватель RFID
pinMode(NRSTPD,OUTPUT); // Установить цифровой контакт 9, без сброса и отключения питания
digitalWrite(NRSTPD, HIGH);
myRFID.AddicoreRFID_Init();
//настройка функций веб-вызова
//Particle.function("netopen", R1ON);
//Particle.function("netclose", R2ON);
//Particle.function("netstop", R3ON);
digitalWrite(re1, HIGH); //выключить реле
digitalWrite(re2, HIGH); //выключить реле
digitalWrite(re3, HIGH); //выключить реле
digitalWrite(re4, HIGH); //выключить реле
}
// Эта процедура повторяется снова и снова, как можно быстрее и столько раз, сколько возможно, после вызова функции установки.
// Примечание. Код, который блокируется слишком долго (например, более 5 секунд), может привести к странным вещам (например, разрыву сетевого соединения). Встроенная функция задержки, показанная ниже, безопасно чередует необходимую фоновую активность, поэтому можно безопасно делать сколь угодно длительные задержки, если они вам нужны.
void loop() {
//Петля для RFID ------------------------------------------------------------ -------------------------
// unsigned char checksum1;
unsigned char status;
unsigned char str[MAX_LEN];
//беззнаковый символ RC_size;
// беззнаковый символ blockAddr; //Выбор адреса блока операций от 0 до 63
// Строка mynum = "";
str[1] = 0x4400;
//Находим теги, возвращаем тип тега
status = myRFID.AddicoreRFID_Request(PICC_REQIDL, str);
if (status == MI_OK)
{
Serial.println("RFID tag detected");
}
//Антиколлизия, возвращаемый серийный номер тега 4 байта
status = myRFID.AddicoreRFID_Anticoll(str);
if (status == MI_OK)
{
// контрольная сумма1 = строка[0] ^ строка[1] ^ строка[2] ^ строка[3];
Serial.print("The tag's number is:\t");
Serial.print(str[0]);
Serial.print(" , ");
Serial.print(str[1]);
Serial.print(" , ");
Serial.print(str[2]);
Serial.print(" , ");
Serial.println(str[3]);
//проверяем допустимую комбинацию карт
if((str[0] == 333) && (str[1] == 444) && (str[2] == 555) && (str[3] == 666) ) // Вы можете изменить это на первый байт вашего тега, найдя идентификатор карты через Serial Monitor
{
Serial.println("\nKey fob identifed - Josh\n");
if(doorstate == 1) {
//дверь уже открыта так близко
// Закрыть дверь гаража
R2ON(); // включаем реле
doorstate = 0;
Serial.print("Relay 2 on") ;
Serial.println("");
delay(1000); // ждем 1 секунду
R2OFF(); //выключить реле
Serial.print("Relay 2 off") ;
Serial.println("");
delay(1000); // ждем 1 секунду
Serial.print("Close State Button HIGH - Finished Closing Garage Door") ;
Serial.println("");
} else {
//дверь закрыта так что открывай
//Открыть дверь гаража
R1ON(); // включаем реле
doorstate = 1;
Serial.print("Relay 1 on") ;
Serial.println("");
delay(1000); // ждем 1 секунду
R1OFF(); //выключить реле
Serial.print("Relay 1 off") ;
Serial.println("");
delay(1000); // ждем 1 секунду
Serial.print("Open State Button HIGH - Finished Opening Garage Door") ;
Serial.println("");
}
} else if((str[0] == 222) && (str[1] == 333) && (str[2] == 444) && (str[3] == 555) ) { // Вы можете изменить это на первый байт вашего тега, найдя идентификатор карты через Serial Monitor
Serial.println("\nCar Charge Card Identided - Josh\n");
if(doorstate == 1) {
//дверь уже открыта так близко
// Закрыть дверь гаража
R2ON(); // включаем реле
doorstate = 0;
Serial.print("Relay 2 on") ;
Serial.println("");
delay(1000); // ждем 1 секунду
R2OFF(); //выключить реле
Serial.print("Relay 2 off") ;
Serial.println("");
delay(1000); // ждем 1 секунду
Serial.print("Close State Button HIGH - Finished Closing Garage Door") ;
Serial.println("");
} else {
//дверь закрыта так что открывай
//Открыть дверь гаража
R1ON(); // включаем реле
doorstate = 1;
Serial.print("Relay 1 on") ;
Serial.println("");
delay(1000); // ждем 1 секунду
R1OFF(); //выключить реле
Serial.print("Relay 1 off") ;
Serial.println("");
delay(1000); // ждем 1 секунду
Serial.print("Open State Button HIGH - Finished Opening Garage Door") ;
Serial.println("");
}
} else if((str[0] == 111) && (str[1] == 222 && (str[2] == 333) && (str[3] == 444) ) { // Вы можете изменить это на первый байт вашего тега, найдя идентификатор карты через Serial Monitor
Serial.println("\nCar Garage Card Identided - Charlotte\n");
if(doorstate == 1) {
//дверь уже открыта так близко
// Закрыть дверь гаража
R2ON(); // включаем реле
doorstate = 0;
Serial.print("Relay 2 on") ;
Serial.println("");
delay(1000); // ждем 1 секунду
R2OFF(); //выключить реле
Serial.print("Relay 2 off") ;
Serial.println("");
delay(1000); // ждем 1 секунду
Serial.print("Close State Button HIGH - Finished Closing Garage Door") ;
Serial.println("");
} else {
//дверь закрыта так что открывай
//Открыть дверь гаража
R1ON(); // включаем реле
doorstate = 1;
Serial.print("Relay 1 on") ;
Serial.println("");
delay(1000); // ждем 1 секунду
R1OFF(); //выключить реле
Serial.print("Relay 1 off") ;
Serial.println("");
delay(1000); // ждем 1 секунду
Serial.print("Open State Button HIGH - Finished Opening Garage Door") ;
Serial.println("");
}
}
Serial.println();
delay(1000);
}
myRFID.AddicoreRFID_Halt(); //Командный тег в спящий режим
//Конец цикла для RFID ----------------------------------------------------------- --------------------------
OpenButtonState = digitalRead(btn1);
CloseButtonState = digitalRead(btn2);
StopButtonState = digitalRead(btn3);
if (OpenButtonState == HIGH) {
Serial.print("Open State Button HIGH - Opening Garage Door") ;
Serial.println("");
//Открыть дверь гаража
R1ON(); // включаем реле
doorstate = 1;
Serial.print("Relay 1 on") ;
Serial.println("");
delay(1000); // ждем 1 секунду
R1OFF(); //выключить реле
Serial.print("Relay 1 off") ;
Serial.println("");
delay(1000); // ждем 1 секунду
Serial.print("Open State Button HIGH - Finished Opening Garage Door") ;
Serial.println("");
}
if (CloseButtonState == HIGH) {
Serial.print("Close State Button HIGH - Closing Garage Door") ;
Serial.println("");
// Закрыть дверь гаража
R2ON(); // включаем реле
doorstate = 0;
Serial.print("Relay 2 on") ;
Serial.println("");
delay(1000); // ждем 1 секунду
R2OFF(); //выключить реле
Serial.print("Relay 2 off") ;
Serial.println("");
delay(1000); // ждем 1 секунду
Serial.print("Close State Button HIGH - Finished Closing Garage Door") ;
Serial.println("");
}
if (StopButtonState == HIGH) {
Serial.print("Stop State Button HIGH - Stopping Garage Door") ;
Serial.println("");
// Останавливаться
R3ON(); // включаем реле
doorstate = 1;
Serial.print("Relay 3 on") ;
Serial.println("");
delay(1000); // ждем 1 секунду
R3OFF(); //выключить реле
Serial.print("Relay 3 off") ;
Serial.println("");
delay(1000); // ждем 1 секунду
Serial.print("Stop State Button HIGH - Finished Stopping Garage Door") ;
Serial.println("");
}
// И повторить!
}
void R1ON() {
digitalWrite(re1, LOW); // включаем реле
//Particle.publish("Реле 1 включено - дверь открыта");
delay(1000); // ждем 1 секунду
digitalWrite(re1, HIGH); //выключить реле
//Particle.publish("Реле 1 выключено");
}
void R1OFF() {
digitalWrite(re1, HIGH); //выключить реле
// задержка (1000); // ждем 1 секунду
}
void R2ON() {
digitalWrite(re2, LOW); // включаем реле
//Particle.publish("Реле 2 включено - дверь закрывается");
delay(1000); // ждем 1 секунду
digitalWrite(re2, HIGH); //выключить реле
//Particle.publish("Реле 2 выключено");
}
void R2OFF() {
digitalWrite(re2, HIGH); // включаем реле
// задержка (1000); // ждем 1 секунду
}
void R3ON() {
digitalWrite(re3, LOW); // включаем реле
//Particle.publish("Реле 3 включено - дверь остановлена");
delay(1000); // ждем 1 секунду
digitalWrite(re3, HIGH); //выключить реле
//Particle.publish("Реле 3 выключено");
}
void R3OFF() {
digitalWrite(re3, HIGH); // включаем реле
// задержка (1000); // ждем 1 секунду
}
void R4ON() {
digitalWrite(re4, LOW); // включаем реле
// задержка (1000); // ждем 1 секунду
}
void R4OFF() {
digitalWrite(re4, HIGH); // включаем реле
// задержка (1000); // ждем 1 секунду
}
@user2916488, 👍0
Обсуждение2 ответа
За 50 с лишним лет решения проблем с аппаратным/программным обеспечением я обнаружил, что проблема почти никогда не связана с аппаратным обеспечением. Таким образом, ваша проблема, скорее всего, связана с программным обеспечением.
Начнем с того, что в вашем коде есть несколько серьезных проблем:
- Вы используете тип unsigned char для представления целых значений > 256; так не пойдет. Когда я попытался скомпилировать ваш код, одним из многих сообщений об ошибках было «StackOvrFl.ino: 107:8: предупреждение: большое целое число неявно усечено до беззнакового типа [-Woverflow]» в строке «str[1] = 0x4400;» Вам нужно объявить 'str' как 'unsigned int str[MAX_LEN];'.
- Использовать «псевдонимы» («ухары») для типов — это дурной тон; Если кому-то еще нужно поддерживать или изменять ваш код (или помогать вам с этим, как в этом случае), он споткнется об это и выдаст вам слова из 4 букв.
- Включите предупреждения и ошибки компилятора и не прекращайте отладку, пока все такие предупреждения/ошибки не будут устранены. Компилятор — ваш друг; пусть это поможет вам.
- Если бы вы включили предупреждения/ошибки компилятора, вы бы обнаружили, что идентификатор 'MI_OK' никогда не объявлялся и поэтому при проверке может иметь ЛЮБОЕ ЗНАЧЕНИЕ.
Сочетание целочисленного переполнения и проблем с необъявленными символами почти наверняка приведет к неопределенному поведению, но могут быть и другие проблемы. Очистите свой код, обратите внимание на предупреждения компилятора, а затем посмотрите, что произойдет.
Удачи!
Фрэнк
Спасибо за ваш ответ Фрэнк. Я взял код, использованный в этом разделе, из примера производителей, поэтому был уверен, что он подойдет. # 2 Я удалил короткую руку, как вы предложили. # 3 Я настроил компилятор так, чтобы в настройках отображалось «больше». # 4 Опять же, это взято из примера, но я попытался объявить его, а затем компиляция не удалась. Возможно ли, что это объявлено внутри include? # 1 Я попытался изменить ваше предложение, и это вырвало:, @user2916488
нет функции сопоставления для вызова «AddicoreRFID:: AddicoreRFID_Request (int, unsigned int [16])», @user2916488
Эта ошибка говорит о том, что вызов «AddicoreRFID_Request(int, unsigned int [16])» в вашем коде имеет список аргументов, который НЕ ТОЧНО совпадает со списком аргументов для определения этой функции. Сравните их очень внимательно, и вы найдете проблему, @user3765883
Предположительно, потому что тип изменился с char на int в вызывающем коде, но не в вызываемой функции? Я предполагаю, что это означает обновление функции и всего, что она делает. Было бы полезно также опубликовать код из включения здесь?, @user2916488
Я не тратил много времени на внимательное изучение кода после того, как заметил проблемы с определением типа и необъявленными переменными. Я думаю, вам нужно тщательно проработать код, исправив ВСЕ проблемы, прежде чем продолжить. Вы можете рассмотреть возможность радикального упрощения кода для начала и добавления функциональности только тогда, когда то, что у вас есть, работает как задумано., @user3765883
Рассмотрите возможность удаления типа String из кода, включая удаление String используется для передачи формальных значений некоторым функциям. Кажется, ничего не делать. И если компилятор не оптимизирует его, он может фактически потреблять то немногое ОЗУ, которое содержит встроенный процессор.
Тип String загружает все виды справки, которые могут вам понадобиться или не понадобиться. Как правило, String — плохая идея для встроенных процессоров, потому что Sting потребляет большое количество ресурсов для поддержки всех функций String. И иногда эти ресурсы не возвращаются. Обычно это называется утечкой памяти. Вкратце, это когда ОЗУ встроенного процессора считается используемым программой, но на самом деле не используется программистом.
Спасибо, я внес несколько комбинированных поправок и перепрошил код... Я проверю утром и сообщу вам, сработало ли это :), @user2916488
Мне любопытно. Перестает ли RFID работать через определенное время? Или после определенного количества операций с гаражными воротами?, @st2000
Я не смог определить точную точку, в которой он остановился, но могу подтвердить, что он остановился снова. Я вставлю исправленный код ниже. Хотола может быть прав, хотя мне, возможно, придется разбить его, чтобы понять, что вызывает проблему., @user2916488
Я отредактировал вопрос, чтобы показать изменения до сих пор., @user2916488
У вас все еще происходят странные вещи. Вы говорите, что скопировали код из рабочего проекта? Но я вижу такие вещи, как "unsigned char str[MAX_LEN];" за которым следует «str[1] = 0x4400;». Но обычно беззнаковый char имеет размер 8 бит. Это 2^8 или максимум 256 или 0x00FF. Но 0x4400 намного больше. Так что это не сработает., @st2000
https://www.addicore.com/v/vspfiles/downloadables/Product%20Downloadables/RFID_RC522/AddicoreRFID.zip, @user2916488
Да, я нашел код в сети и тоже был сбит с толку. У меня сейчас нет времени. Я мог бы посмотреть на это позже. Тем временем было бы хорошо, если бы вы последовали предложению jsotola и сократили свой код до более простых компонентов или начали все сначала, но добавляли только одну функцию за раз. И не добавляйте того, чего не понимаете. Это должно уберечь вещи, которые вам не нужны, такие как «String», из ваших последних усилий., @st2000
- Использование прерываний с RC522
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- rfid_default_keys проверить с помощью RC522
- MFRC522: прошивка неизвестна
- MFRC522 не сканируется карта
- RFID-RC522 не работает, горит красный светодиод
- Считывание одновременно RFID-МЕТКИ с помощью нескольких RFID-считывателей [MFRC522]
- Arduino Uno - Как записать персональные данные в NTAG213 с помощью RFID-RC522
Что должна делать строка
str[1] = 0x4400;
? В настоящее время это просто не имеет смысла, @chrislДобро пожаловать в С++. Похоже, вы хотели вызвать функцию AddicoreRFID_Request(int,unsigned int). Но вместо этого сделал вызов AddicoreRFID_Request(int,unsigned char). Увидеть разницу? Компилятор сделал. Это вызов Overloaded в C++. Продолжайте, очистите свой код. Но держу пари, что у тебя утечка памяти., @st2000
Что касается строки 0x4400, я не совсем уверен, это было из примера кода RFID, и я думаю, что это может иметь какое-то отношение к FRAM через включенные библиотеки. Но не уверен!, @user2916488
уменьшите свой код, чтобы только считывать метку RFID и распечатывать, что она была обнаружена .... если это продолжает работать, затем добавьте код для распечатки данных с карты и снова проверьте .... продолжайте добавлять код и тестировать, @jsotola
Можете дать ссылку на пример кода? Записывать int в char не имеет смысла, так что там точно что-то не так. Вы можете попробовать другую совместимую библиотеку RFID. например [этот] (https://github.com/miguelbalboa/rfid), ссылка на который была размещена на сайте производителя., @chrisl