Устройство открывания гаражных ворот 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 секунду

}

, 👍0

Обсуждение

Что должна делать строка 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


2 ответа


2

За 50 с лишним лет решения проблем с аппаратным/программным обеспечением я обнаружил, что проблема почти никогда не связана с аппаратным обеспечением. Таким образом, ваша проблема, скорее всего, связана с программным обеспечением.

Начнем с того, что в вашем коде есть несколько серьезных проблем:

  1. Вы используете тип unsigned char для представления целых значений > 256; так не пойдет. Когда я попытался скомпилировать ваш код, одним из многих сообщений об ошибках было «StackOvrFl.ino: 107:8: предупреждение: большое целое число неявно усечено до беззнакового типа [-Woverflow]» в строке «str[1] = 0x4400;» Вам нужно объявить 'str' как 'unsigned int str[MAX_LEN];'.
  2. Использовать «псевдонимы» («ухары») для типов — это дурной тон; Если кому-то еще нужно поддерживать или изменять ваш код (или помогать вам с этим, как в этом случае), он споткнется об это и выдаст вам слова из 4 букв.
  3. Включите предупреждения и ошибки компилятора и не прекращайте отладку, пока все такие предупреждения/ошибки не будут устранены. Компилятор — ваш друг; пусть это поможет вам.
  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


1

Рассмотрите возможность удаления типа 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