Новичок
Регистрация: 28.05.2020
Сообщений: 4
Репутация: 10
|
Сделал считыватель для СКУД(она на сервере крутится) с использованием 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(); } |
||
Оценка
|
Знаток
Регистрация: 13.07.2007
Сообщений: 666
Репутация: 125
|
Здравствуйте!
Сталкивался с подобным, тоже крови попила эта неисправность. Решение вашей проблемы состоит в периодической выдаче команд Тестовых. Например опрос состояния RC522,ESP32 и выдача результата теста. У меня вышибало статикой радиоканал. Вход и выход в критические точки контролировать по таймеру. Что не так перезапуск и иниц. по новой.Как рукой сняло. |
||
Оценка
|
Новичок
Регистрация: 28.05.2020
Сообщений: 4
Репутация: 10
|
Спасибо! Тоже думал, так сделать. А что значит опрос состояния ESP32? Ведь если он зависнет, то как он сам себя опрашивать будет?
|
||
Оценка
|
Специалист
Регистрация: 22.09.2010
Адрес: г. Донецк
Сообщений: 873
Репутация: 381
|
У меня аналогичная проблема возникала с NRF24L01 и некоторыми ZigBee модулями. Иногда неделями всё в порядке, иногда за день десять сбоев. Решение - как предложил Sergey57, т.е. переинициализация.
Цитата:
Цитата:
Сообщение от System API Reference
The ESP-IDF has support for two types of watchdogs: The Interrupt Watchdog Timer and the Task Watchdog Timer (TWDT).
|
||
Оценка
|
Ответ |
Метки |
esp32, rc522 |
|
|
Обратная связь РадиоЛоцман Вверх |