HRP-N3 - серия источников питания с максимальной пиковой мощностью в 350% от MEAN WELL
Новичок
 
Регистрация: 28.05.2020
Сообщений: 4
Репутация: 10
0 2
0 0
 
11.10.2020 21:50 #1
Сделал считыватель для СКУД(она на сервере крутится) с использованием 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
Сообщений: 657
Репутация: 124
114 11
5 2
 
29.10.2020 22:24 #2
Здравствуйте!
Сталкивался с подобным, тоже крови попила эта неисправность.
Решение вашей проблемы состоит в периодической выдаче команд
Тестовых. Например опрос состояния RC522,ESP32 и выдача результата теста. У меня вышибало статикой радиоканал. Вход и выход в критические точки контролировать по таймеру.
Что не так перезапуск и иниц. по новой.Как рукой сняло.
Оценка
Новичок
 
Регистрация: 28.05.2020
Сообщений: 4
Репутация: 10
0 2
0 0
 
30.10.2020 00:18 #3
Спасибо! Тоже думал, так сделать. А что значит опрос состояния ESP32? Ведь если он зависнет, то как он сам себя опрашивать будет?
Оценка
Специалист
 
Аватар для antonydublin
 
Регистрация: 22.09.2010
Адрес: г. Донецк
Сообщений: 873
Репутация: 381
372 0
3 0
 
31.10.2020 00:47 #4
У меня аналогичная проблема возникала с NRF24L01 и некоторыми ZigBee модулями. Иногда неделями всё в порядке, иногда за день десять сбоев. Решение - как предложил Sergey57, т.е. переинициализация.

Цитата:
Сообщение от Прапорщик Задов
А что значит опрос состояния ESP32? Ведь если он зависнет, то как он сам себя опрашивать будет?
А разве в ESP32 нет аппаратного и программного watchdog?
Цитата:
Сообщение от 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
Похожие темы
Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход
Электронные компоненты. Бесплатная доставка по России
Часовой пояс GMT +3, время: 15:32.
Обратная связь РадиоЛоцман Вверх