ESP32 с RC522 зависает

Обсуждаем Arduino, Raspberry Pi и другие электронные компоненты и проекты DIY
Ответить
Прапорщик Задов
Сообщения: 4
Зарегистрирован: 28 май 2020, 02:19

ESP32 с RC522 зависает

Сообщение Прапорщик Задов »

ESP32 с RC522 зависает



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

Вот код:

Код: Выделить всё

#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();

}


Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: ESP32 с RC522 зависает

Сообщение Mr.Kubikus »

Привет!

Чтобы определить где зависает система - можно дополнить код отладочным выводом через Serial.println().
С уважением, Григорий
GitHub FB ВК
Прапорщик Задов
Сообщения: 4
Зарегистрирован: 28 май 2020, 02:19

Re: ESP32 с RC522 зависает

Сообщение Прапорщик Задов »

Виснет именно RC522, ESP32 при этом работает нормально. При чем, не помогает не только программная перезагрузка RC522, но и аппаратная перезагрузка ESP32. Помогает только если отключить и включить питание от ESP32 или отдельно от RC522.
Может кто знает что тут можно сделать? Может как-то питание доработать, конденсатор какой-нибудь куда-то приделать?
Ответить