ESP32 с RC522 зависает

Прапорщик Задов
Offline
Зарегистрирован: 28.05.2020

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

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

}

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Вставить код согласно правилам для начала?

Прапорщик Задов
Offline
Зарегистрирован: 28.05.2020

Каким образом?

b707
Offline
Зарегистрирован: 26.05.2017

Прапорщик Задов пишет:

Каким образом?

где вам скетчи писать, если вв в правилах форума разобраться не можете...

Прапорщик Задов
Offline
Зарегистрирован: 28.05.2020

Очень важная информация. Тебе заняться нечем кроме как тему засерать? Меня твое мнение не особо интересует, если что. Так что я бы был очень тебе признателен, если ты кому-то другому оценки пошел давать.

mixail844
Offline
Зарегистрирован: 30.04.2012

ок , вот вам альтенативное мнение : вставте код как следует

читать здесь http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/pesochnitsa-dl...

Прапорщик Задов
Offline
Зарегистрирован: 28.05.2020

Спасибо. Я прошу прощения за глупый вопрос, но я так и не понял как при создании темы код вставлять, только при создании комментария вижу соответствующую кнопку?

b707
Offline
Зарегистрирован: 26.05.2017

Прапорщик Задов пишет:

только при создании комментария вижу соответствующую кнопку?

ну так если видишь, что мешает ей воспользоваться сейчас?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Прапорщик Задов пишет:

Спасибо. Я прошу прощения за глупый вопрос, но я так и не понял...

Присоединяюсь к мнению, высказанному в сообщении №3.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Семь шагов к счастью :)

1.Включите выдачу полного лога на ESP (Инструменты-Core debug level- Verbose)

2. залейте прошивку с включеным логом

3 поставьте считыватель с подключенным компьютером для логирования

4 дождитесь зависания системы

5 проанализируйте лог

6 если сам не разберетесь - покажите лог здесь.

7.Если не сможете сделать выше описанные операции - ищите исполнителя за деньги.

Прапорщик Задов
Offline
Зарегистрирован: 28.05.2020

b707 пишет:

Прапорщик Задов пишет:

только при создании комментария вижу соответствующую кнопку?

ну так если видишь, что мешает ей воспользоваться сейчас?

Мне казалось, что некрасиво будет дублировать уже имеющийся код. Ну если ты считаешь, что так правильно, то вот.



#include <SPI.h>
#include <MFRC522.h>
#include <WiFi.h>
#include "esp32-hal-ledc.h"

#define RST_PIN 22 
#define SS_PIN 21 

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

}

 

 

b707
Offline
Зарегистрирован: 26.05.2017

а в строчказ 1-3 что должно быть?

Прапорщик Задов
Offline
Зарегистрирован: 28.05.2020

Прошу прощения, что-то не вставил. Поправил.

Прапорщик Задов
Offline
Зарегистрирован: 28.05.2020

brokly пишет:

Семь шагов к счастью :)

1.Включите выдачу полного лога на ESP (Инструменты-Core debug level- Verbose)

2. залейте прошивку с включеным логом

3 поставьте считыватель с подключенным компьютером для логирования

4 дождитесь зависания системы

5 проанализируйте лог

6 если сам не разберетесь - покажите лог здесь.

7.Если не сможете сделать выше описанные операции - ищите исполнителя за деньги.

Там смотри какая фигня, виснет именно RC522, ESP32 при этом работает нормально. При чем, не помогает не только программная перезагрузка RC522, но и аппаратная перезагрузка ESP32. Помогает только если отключить и включить питание от ESP32 или отдельно от RC522. Имеет смысл в таком случае ковыряться с логами? Говорят, вроде, что это из-за проблем с питанием.

 

b707
Offline
Зарегистрирован: 26.05.2017

Ну если известно, в чем проблема (с питанием), тогда в чем вопрос. Питание в любом случае надо привести в порядок, а потом уже проверять

Прапорщик Задов
Offline
Зарегистрирован: 28.05.2020

Хотелось бы понять как это можно решить? Блок питания какой-то нужен особый или в схеме какие-то доработки нужны? Я использую блоки питания от телефонов, три разных пробовал, со всеми виснет.

sadman41
Offline
Зарегистрирован: 19.10.2016

От каких телефонов?

Прапорщик Задов
Offline
Зарегистрирован: 28.05.2020

Один от Nokia 6, другой от Doogee X5 Max Pro и еще один какая-то китайская фигня.

sadman41
Offline
Зарегистрирован: 19.10.2016

Так это не блоки питания, а зарядные устройства так-то. Они, по-моему,  не сильно-то обязаны выдавать точное напряжение. Хотя, конечно, стандарт USB им это и предписывает, но хрен его знает... Не для такого типа работ они разработаны.

Прапорщик Задов
Offline
Зарегистрирован: 28.05.2020

Я вот такой штукой проверял напряжение от всех зарядных устройств, 5 вольт с копейками показывает всегда.

Подскажи тогда что лучше использовать?

 

b707
Offline
Зарегистрирован: 26.05.2017

так откуда вообще известно, что это "проблемы с питанием"?

Прапорщик Задов
Offline
Зарегистрирован: 28.05.2020

Да не известно это. Я ж написал, что «вроде» когда про это говорил. Просто предположение такое, на другом форуме высказали такую теорию.

sadman41
Offline
Зарегистрирован: 19.10.2016

Эта штука не показывает провалы, spikes, шумы на выходе. Ну, если на выходе вообще треш с преобладающим значением 2V - то да, диагностировать можно и ею, безусловно.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Прапорщик Задов пишет:

Хотелось бы понять как это можно решить? Блок питания какой-то нужен особый или в схеме какие-то доработки нужны? Я использую блоки питания от телефонов, три разных пробовал, со всеми виснет.

У телефонов не бывает блоков питания. У телефонов бывают только зарядные устройства. Для работы в качестве блоков питания они в общем случае непригодны. Воспользуйтесь для проверки хотя бы лабораторным блоком питания. Или хотя бы блоком питания 5V 20A.

Прапорщик Задов
Offline
Зарегистрирован: 28.05.2020

Можешь подсказать какой блок питания 5V 20A лучше купить для таких целей?

sadman41
Offline
Зарегистрирован: 19.10.2016

andriano пишет:

У телефонов не бывает блоков питания. У телефонов бывают только зарядные устройства. 

Не заради флейма, но справедливости ради - у ряда телефонов таки есть БП. На 5V и с током в ампер-два.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Прапорщик Задов пишет:

Можешь подсказать какой блок питания 5V 20A лучше купить для таких целей?

20А не много ли? Мне для моих самоделок на ардуино и «навесного» хватает вот такого плана БП: 

https://aliexpress.ru/item/1005001573025946.html

Прапорщик Задов
Offline
Зарегистрирован: 28.05.2020

Благодарю. Попробую.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

BOOM пишет:

20А не много ли? Мне для моих самоделок на ардуино и «навесного» хватает вот такого плана БП: 

https://aliexpress.ru/item/1005001573025946.html

Если речь идет об ESP, 2 Ампера - это на пределе. А чтобы быть уверенным, нужен запас. Желательно - многократный. 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Это не из-за питания. Но вопрос с питанием решается просто. У 522 есть нога ресет, читай версию 522 скажем раз в 10 секунд, как только ответа нет дерни ресет и проинициализируй nfc снова. Только проблема не в этом. Сними лог.

Не нужно еспшке 2 ампера, правда, не смог я ее в такие потребления загнать, разве что все ноги на землю замкнуть... Максимум , по моему 0.75 ампера получается.

Да и давайте вспомним, какая понижайка на плате с усб установлена ? Не нужен нам блок питаний на 5 вольт, нам нужно на 3.3. Кстати, а к какому питанию подключено 522

 
Прапорщик Задов
Offline
Зарегистрирован: 28.05.2020

Да я сейчас без проверок, просто каждые 10 секунд делаю:

    mfrc522.PCD_Reset();
    mfrc522.PCD_Init();

Не помогает.

 

Прапорщик Задов
Offline
Зарегистрирован: 28.05.2020

Я, кстати, у себя максимальный ток потребления 0.15 А наблюдал.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Прапорщик Задов пишет:

Да я сейчас без проверок, просто каждые 10 секунд делаю:

    mfrc522.PCD_Reset();
    mfrc522.PCD_Init();

Не помогает.

 

Если будешь плохо читать, то что я пишу, я перестану писать в эту тему. НОГУ РЕСЕТ ПОДКЛЮЧИ. И дергай ее перед инициализацией. Только твоя проблема не в этом. Сам дергай а не библиотекой. Или проверь есть ли там ресет в реале.

void MFRC522::PCD_Reset() {
	PCD_WriteRegister(CommandReg, PCD_SoftReset);	// Issue the SoftReset command.
	// The datasheet does not mention how long the SoftRest command takes to complete.
	// But the MFRC522 might have been in soft power-down mode (triggered by bit 4 of CommandReg) 
	// Section 8.8.2 in the datasheet says the oscillator start-up time is the start up time of the crystal + 37,74μs. Let us be generous: 50ms.
	uint8_t count = 0;
	do {
		// Wait for the PowerDown bit in CommandReg to be cleared (max 3x50ms)
		delay(50);
	} while ((PCD_ReadRegister(CommandReg) & (1 << 4)) && (++count) < 3);
} // End PCD_Reset()

Покажи мне, где тут дергается нога ресета ?

Прапорщик Задов
Offline
Зарегистрирован: 28.05.2020

Думал, дергается, в код не додумался посмотреть. Спасибо. А как проверить есть ли там ресет в реале?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Прапорщик Задов пишет:

Думал, дергается, в код не додумался посмотреть. Спасибо. А как проверить есть ли там ресет в реале?

Вы не поверите!

Для этого нужно заглянуть в код.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

andriano пишет:

Вы не поверите!

Для этого нужно заглянуть в код.

C этим просто невозможно не согласиться ! И другого ответа нет.

Ресет там дергается, только не там, а в функции INIT, но библиотека писалась под AVR, у вас ESP32. Нога ресет у 522 не совсем вход и процедура, которая написана для AVR, на есп работает не корректно. Ибо выходы у ЕСП вовсе не такие как на AVR. И раз вам хочется разобраться и что то узнать, то сначала посмотрите код процедуры, потом перечитайте мой поток мысли, возможно что то поймете. 

ПОВТОРЮ. ВАША ПРОБЛЕММА НЕ В ЭТОМ.