ESP32 с RC522 зависает
- Войдите на сайт для отправки комментариев
Сделал считыватель для СКУД(она на сервере крутится) с использованием 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();
}
Вставить код согласно правилам для начала?
Каким образом?
Каким образом?
где вам скетчи писать, если вв в правилах форума разобраться не можете...
Очень важная информация. Тебе заняться нечем кроме как тему засерать? Меня твое мнение не особо интересует, если что. Так что я бы был очень тебе признателен, если ты кому-то другому оценки пошел давать.
ок , вот вам альтенативное мнение : вставте код как следует
читать здесь http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/pesochnitsa-dl...
Спасибо. Я прошу прощения за глупый вопрос, но я так и не понял как при создании темы код вставлять, только при создании комментария вижу соответствующую кнопку?
только при создании комментария вижу соответствующую кнопку?
ну так если видишь, что мешает ей воспользоваться сейчас?
Спасибо. Я прошу прощения за глупый вопрос, но я так и не понял...
Семь шагов к счастью :)
1.Включите выдачу полного лога на ESP (Инструменты-Core debug level- Verbose)
2. залейте прошивку с включеным логом
3 поставьте считыватель с подключенным компьютером для логирования
4 дождитесь зависания системы
5 проанализируйте лог
6 если сам не разберетесь - покажите лог здесь.
7.Если не сможете сделать выше описанные операции - ищите исполнителя за деньги.
только при создании комментария вижу соответствующую кнопку?
ну так если видишь, что мешает ей воспользоваться сейчас?
Мне казалось, что некрасиво будет дублировать уже имеющийся код. Ну если ты считаешь, что так правильно, то вот.
а в строчказ 1-3 что должно быть?
Прошу прощения, что-то не вставил. Поправил.
Семь шагов к счастью :)
1.Включите выдачу полного лога на ESP (Инструменты-Core debug level- Verbose)
2. залейте прошивку с включеным логом
3 поставьте считыватель с подключенным компьютером для логирования
4 дождитесь зависания системы
5 проанализируйте лог
6 если сам не разберетесь - покажите лог здесь.
7.Если не сможете сделать выше описанные операции - ищите исполнителя за деньги.
Там смотри какая фигня, виснет именно RC522, ESP32 при этом работает нормально. При чем, не помогает не только программная перезагрузка RC522, но и аппаратная перезагрузка ESP32. Помогает только если отключить и включить питание от ESP32 или отдельно от RC522. Имеет смысл в таком случае ковыряться с логами? Говорят, вроде, что это из-за проблем с питанием.
Ну если известно, в чем проблема (с питанием), тогда в чем вопрос. Питание в любом случае надо привести в порядок, а потом уже проверять
Хотелось бы понять как это можно решить? Блок питания какой-то нужен особый или в схеме какие-то доработки нужны? Я использую блоки питания от телефонов, три разных пробовал, со всеми виснет.
От каких телефонов?
Один от Nokia 6, другой от Doogee X5 Max Pro и еще один какая-то китайская фигня.
Так это не блоки питания, а зарядные устройства так-то. Они, по-моему, не сильно-то обязаны выдавать точное напряжение. Хотя, конечно, стандарт USB им это и предписывает, но хрен его знает... Не для такого типа работ они разработаны.
Я вот такой штукой проверял напряжение от всех зарядных устройств, 5 вольт с копейками показывает всегда.
Подскажи тогда что лучше использовать?
так откуда вообще известно, что это "проблемы с питанием"?
Да не известно это. Я ж написал, что «вроде» когда про это говорил. Просто предположение такое, на другом форуме высказали такую теорию.
Эта штука не показывает провалы, spikes, шумы на выходе. Ну, если на выходе вообще треш с преобладающим значением 2V - то да, диагностировать можно и ею, безусловно.
Хотелось бы понять как это можно решить? Блок питания какой-то нужен особый или в схеме какие-то доработки нужны? Я использую блоки питания от телефонов, три разных пробовал, со всеми виснет.
Можешь подсказать какой блок питания 5V 20A лучше купить для таких целей?
У телефонов не бывает блоков питания. У телефонов бывают только зарядные устройства.
Не заради флейма, но справедливости ради - у ряда телефонов таки есть БП. На 5V и с током в ампер-два.
Можешь подсказать какой блок питания 5V 20A лучше купить для таких целей?
20А не много ли? Мне для моих самоделок на ардуино и «навесного» хватает вот такого плана БП:
https://aliexpress.ru/item/1005001573025946.html
Благодарю. Попробую.
20А не много ли? Мне для моих самоделок на ардуино и «навесного» хватает вот такого плана БП:
https://aliexpress.ru/item/1005001573025946.html
Это не из-за питания. Но вопрос с питанием решается просто. У 522 есть нога ресет, читай версию 522 скажем раз в 10 секунд, как только ответа нет дерни ресет и проинициализируй nfc снова. Только проблема не в этом. Сними лог.
Не нужно еспшке 2 ампера, правда, не смог я ее в такие потребления загнать, разве что все ноги на землю замкнуть... Максимум , по моему 0.75 ампера получается.
Да и давайте вспомним, какая понижайка на плате с усб установлена ? Не нужен нам блок питаний на 5 вольт, нам нужно на 3.3. Кстати, а к какому питанию подключено 522
Да я сейчас без проверок, просто каждые 10 секунд делаю:
Не помогает.
Я, кстати, у себя максимальный ток потребления 0.15 А наблюдал.
Да я сейчас без проверок, просто каждые 10 секунд делаю:
Не помогает.
Если будешь плохо читать, то что я пишу, я перестану писать в эту тему. НОГУ РЕСЕТ ПОДКЛЮЧИ. И дергай ее перед инициализацией. Только твоя проблема не в этом. Сам дергай а не библиотекой. Или проверь есть ли там ресет в реале.
Покажи мне, где тут дергается нога ресета ?
Думал, дергается, в код не додумался посмотреть. Спасибо. А как проверить есть ли там ресет в реале?
Думал, дергается, в код не додумался посмотреть. Спасибо. А как проверить есть ли там ресет в реале?
Для этого нужно заглянуть в код.
Вы не поверите!
Для этого нужно заглянуть в код.
C этим просто невозможно не согласиться ! И другого ответа нет.
Ресет там дергается, только не там, а в функции INIT, но библиотека писалась под AVR, у вас ESP32. Нога ресет у 522 не совсем вход и процедура, которая написана для AVR, на есп работает не корректно. Ибо выходы у ЕСП вовсе не такие как на AVR. И раз вам хочется разобраться и что то узнать, то сначала посмотрите код процедуры, потом перечитайте мой поток мысли, возможно что то поймете.
ПОВТОРЮ. ВАША ПРОБЛЕММА НЕ В ЭТОМ.