Esp32 с rc522 зависает

Тема в разделе "Посоветуйте детальки", создана пользователем Прапорщик Задов, 11 окт 2020.

Метки:
  1. Сделал считыватель для СКУД(она на сервере крутится) с использованием ESP32 и RC522. Все работает как надо, только периодически устройство зависает(может несколько дней работать, а потом зависнуть, а бывает, что несколько раз на день зависает), не реагирует на поднесение RFID-меток. При этом Wi-Fi соединение остается активным в роутере. До этого такое же устройство собирал на Arduino + W550 + RC522 - симптомы абсолютно такие же, все работает, но периодически виснет. Пробовал несколько экземпляров контроллеров и датчиков, со всеми такая история. Я подозреваю, что тут какая-то проблема с RC522. Подскажите, пожалуйста как можно решить эту проблему?

    Вот код:

    Код (C++):
    #include <SPI.h>
    #include <MFRC522.h>
    #include <WiFi.h>
    #include "esp32-hal-ledc.h"

    #define RST_PIN         22         // Configurable, see typical pin layout above
    #define SS_PIN          21         // Configurable, see typical pin layout above

    const char* ssid     = "TP-LINK";
    const char* password = "password";
    const char* host = "site.com";
    const char* idBranch = "1";
    const char* rfid = "123";

    MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance
    unsigned long uidDec, uidDecTemp; // для храниения номера метки в десятичном формате

    //Реле
    int in1 = 5;
    //Синий. Готовность к работе.
    int inputReady = 13;
    //Зеленый. Есть доступ.
    int inputAccessAllowed = 2;
    //Красный. Нет доступа.
    int inputAccessDenied = 4;
    //Динамик
    int buzzer = 12;

    void setup() {
      SPI.begin(); // инициализация SPI / Init SPI bus.
      delay(10);
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
      }
      mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card.

      //Реле
      pinMode(in1, OUTPUT);
      digitalWrite(in1, LOW);

      //Синий. Готовность к работе.
      pinMode(inputReady, OUTPUT);
      //Зеленый. Есть доступ.
      pinMode(inputAccessAllowed, OUTPUT);
      //Красный. Нет доступа.
      pinMode(inputAccessDenied, OUTPUT);
      //Динамик
      pinMode(buzzer, OUTPUT);

      ledcSetup(0, 50, 8);
      ledcAttachPin(buzzer, 0);

      digitalWrite(inputReady, HIGH);
    }

    void loop() {
      //Если Wi-Fi отвалился, то перезагружаемся
      if (WiFi.status() != WL_CONNECTED) {
        ESP.restart();
      }
      // Поиск метки
      if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
      }
      // Считывание метки
      if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
      }
     
      uidDec = 0;
      // Выдача серийного номера метки.
      for (byte i = (mfrc522.uid.size); i > 0; i--)
      {
        uidDecTemp = mfrc522.uid.uidByte[i-1];
        uidDec = uidDec * 256 + uidDecTemp;
      }
     
      // Use WiFiClient class to create TCP connections
      WiFiClient client;
      const int httpPort = 80;
      if (!client.connect(host, httpPort)) {
          return;
      }

      String url = "/person/visit";
      url += "?id=";
      url += idBranch;
      url += "&rfid=";
      url += uidDec;

      client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                   "Host: " + host + "\r\n" +
                   "Connection: close\r\n\r\n");
      unsigned long timeout = millis();
      while (client.available() == 0) {
          if (millis() - timeout > 5000) {
              client.stop();
              return;
          }
      }

      String line;
      while(client.available()) {
          line = client.readStringUntil('\n');
      }

      if(line=="1"){
          digitalWrite(in1, HIGH);
          digitalWrite(inputAccessAllowed, HIGH);
          delay(500);
          digitalWrite(in1, LOW);
          digitalWrite(inputAccessAllowed, LOW);
      }
      else{
        digitalWrite(inputAccessDenied, HIGH);
        ledcWrite(0, 255);
       
        //Чтоб часто не слать
        if(uidDec){
          delay(1000);
        }
        digitalWrite(inputAccessDenied, LOW);
        ledcWrite(0, 0);
      }

      client.stop();

    }