Страница 1 из 2

ESP32 перестает работать mqtt

Добавлено: Вс сен 22, 2019 8:22 pm
Forth
Столкнулся с 2 проблемами при использовании ESP32:
1- проблема с питанием модуля ESP32, подключил 5V и 3,3V, но модуль работает только если подключено питание по USB. Пришлось дополнительно подать питание от 5V через разъем USB, очень странно, это еще при том, что данный модуль вообще имеет функцию прошивки через WiFi.
2- через пару минут после перезагрузки модуля ESP32 кнопкой EN перестает работать передача данных через mqtt, хотя при нажатии кнопки реле срабатывает, может модуль засыпает или частично зависает.
Думал модуль неисправен, но нет, так ведут и другие 2 модуля.

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

// Блок [Подключение библиотек] ************************************************
#include <WiFi.h>
#include <PubSubClient.h>
// END Блок [Подключение библиотек] ********************************************

// Блок [Подключение к сети WI-FI] *********************************************
const char* ssid = "*******";               // Имя WI-FI сети
const char* password = "*****";         // Пароль WI-FI сети
const char* mqtt_server = "****";      // IP адрес MQTT сервер
// END Блок [Подключение к сети WI-FI] *****************************************

#define RELE_1 13                               // Реле №1
#define BUTTON_1 26                             // Кнопочный выключатель №1
#define relays_topic1 "ESP32-01/RELE_1"            // Топик реле №1
 
WiFiClient espClient;
PubSubClient client(espClient);
 
long last_mls = millis();
char msg[50];
boolean rState1 = false;
boolean btnPress1 = false;
boolean lastbtnStat1 = false;

void setup() {
  pinMode(RELE_1, OUTPUT);
  pinMode(BUTTON_1, INPUT);
  digitalWrite(RELE_1, rState1);
  Serial.begin(115200);
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
 
  delay(100);
  WiFi.begin(ssid, password);
  delay(6000);
  client.connect("ESP32-01Client");
  client.subscribe(relays_topic1);
  lastbtnStat1 = digitalRead(BUTTON_1);
  }

void reconnect_server() {
 
  if (WiFi.status() != WL_CONNECTED){
    WiFi.begin(ssid, password);
    Serial.println("");
    Serial.println("WiFi connect...");
  } else {
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
    Serial.print("");
  }
 
  if(!client.connected() && WiFi.status() == WL_CONNECTED){
    if (client.connect("ESP32-01Client")) {
      Serial.println("Mosquitto connect...");
  client.subscribe(relays_topic1);
    } else {
      Serial.print("failed connect Mosquitto, rc=");
      Serial.print(client.state());
      Serial.println("");
    }
  }
}
// Блок [обратная связь] ****************************************************
void callback(char* topic, byte* payload, unsigned int length) {
    Serial.print("Message arrived [");
    Serial.print(topic);
    Serial.print("] ");
    String strTopic = String(topic);
    String strPayload = String((char*)payload);
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
// Блок [Управление Реле 1 из MajorDomo] ************************************
if (strTopic == "ESP32-01/RELE_1") {
    if ((char)payload[0] == '1') {
        rState1 = true;
        digitalWrite(RELE_1, rState1);
    }
    else {
        rState1 = false;
        digitalWrite(RELE_1, rState1);
    }
}
// END Блок [Управление Реле 1 из MajorDomo] ********************************
} // для блока обратная связь тест 

// Блок [Управление Реле 1 с кнопки] ****************************************
void button_1(){
  btnPress1 = digitalRead(BUTTON_1);
 
  if (btnPress1 && !lastbtnStat1){
    delay(100); // защита от дребезга (100 мсек.)
    btnPress1 = digitalRead(BUTTON_1);
 
    if(btnPress1){
      rState1 = !rState1;
      digitalWrite(RELE_1, rState1);
      client.publish(relays_topic1, String(rState1).c_str(), true); // Публикуем состояние реле 1 на MQTT
    }
  }
  lastbtnStat1 = btnPress1;
}
// END Блок [Управление Реле 1 с кнопки] ************************************

// Блок [Управление Реле 4 с кнопки] ****************************************
void button_4(){
  btnPress4 = digitalRead(BUTTON_4);
 
  if (btnPress4 && !lastbtnStat4){
    delay(300); // защита от дребезга (300 мсек.)
    btnPress4 = digitalRead(BUTTON_4);
 
    if(btnPress4){
      rState4 = !rState4;
      digitalWrite(RELE_4, rState4);
      client.publish(relays_topic4, String(rState4).c_str(), true); // Публикуем состояние реле 4 на MQTT
    }
  }
  lastbtnStat4 = btnPress4;
}
// END Блок [Управление Реле 4 с кнопки] ************************************
 
void loop() {
 
// Блок [Проверка подключения] **********************************************
if (millis() - last_mls > 60000) { // Проеверка подключения к сети (раз в 60 сек.)
    last_mls = millis();
    reconnect_server();
}
// END Блок [Проверка подключения] ******************************************
 
  button_1(); // Функция кнопки №1 и публикация статуса реле 1 на MQTT
}

Re: ESP32 перестает работать mqtt

Добавлено: Вс сен 22, 2019 8:59 pm
Aven
MQTT подключение может разрываться, надо восстанавливать.
Пишите лог в Serial и смотрите.
Питание 5V подавайте на VIN.

Re: ESP32 перестает работать mqtt

Добавлено: Вс сен 22, 2019 9:36 pm
Forth
Aven писал(а):
Вс сен 22, 2019 8:59 pm
MQTT подключение может разрываться, надо восстанавливать.
Пишите лог в Serial и смотрите.
Питание 5V подавайте на VIN.
Если не сложно подскажите, что именно выводить в монитор порта? Очень буду благодарен, если добавите код в моем скетче.
В монитор порта выводит, что подключение к WiFi есть "WiFi connected IP address: 192.168.3.77"
Да, 5V подаю на VIN.

Re: ESP32 перестает работать mqtt

Добавлено: Вс сен 22, 2019 9:41 pm
Aven
состояние client.connected() как минимум

Re: ESP32 перестает работать mqtt

Добавлено: Вс сен 22, 2019 9:56 pm
Forth
Aven писал(а):
Вс сен 22, 2019 9:41 pm
состояние client.connected() как минимум
В монитор порта выводится:
WiFi connected
IP address: 192.168.3.77

А при следующем коде думаю еще должно выводится "Mosquitto connect..."

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

void reconnect_server() {
 
  if (WiFi.status() != WL_CONNECTED){
    WiFi.begin(ssid, password);
    Serial.println("");
    Serial.println("WiFi connect...");
  } else {
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
    Serial.print("");
  }
 
  if(!client.connected() && WiFi.status() == WL_CONNECTED){
    if (client.connect("ESP32-01Client")) {
      Serial.println("Mosquitto connect...");
      client.subscribe(relays_topic1);
    } else {
      Serial.print("failed connect Mosquitto, rc=");
      Serial.print(client.state());
      Serial.println("");
    }
  }
}

Re: ESP32 перестает работать mqtt

Добавлено: Пн сен 23, 2019 6:44 pm
Forth
Прошу оказать консультацию по решению данной проблемы, как настроить стабильное подключение mqtt?
Есть работающий скетч?

Re: ESP32 перестает работать mqtt

Добавлено: Вт сен 24, 2019 6:04 am
Forth
Может кто подскажет с чем может быть связана ошибка сокета и отключение клиента?

Re: ESP32 перестает работать mqtt

Добавлено: Вт сен 24, 2019 7:48 am
ZyaK
90% что проблема по питанию. вешайте конденсаторы на 5 вольт и на 3.3 как электролиты так и керамику, до кучи я поставил еще и танталы.
пол года полет нормальный ни одного дисконекта. и это на 8266, 32 то поболее жрет, по тому очень требовательна к питанию.

Re: ESP32 перестает работать mqtt

Добавлено: Вт сен 24, 2019 10:11 am
Forth
ZyaK писал(а):
Вт сен 24, 2019 7:48 am
90% что проблема по питанию. вешайте конденсаторы на 5 вольт и на 3.3 как электролиты так и керамику, до кучи я поставил еще и танталы.
пол года полет нормальный ни одного дисконекта. и это на 8266, 32 то поболее жрет, по тому очень требовательна к питанию.
Какого объема мкФ будет достаточно, тант.чип конд.220 мкФ х 6.3В типC 10 хватит?
На сколько электролиты, керамику?
Для питания использую следующие модули питания, мне их рекомендовали как стабильные и хорошего качества:
AC-DC 220 V 5
AMS1117 3,3 В модуль питания
Может другие модули питания порекомендуете для ESP32?

Re: ESP32 перестает работать mqtt

Добавлено: Вт сен 24, 2019 2:21 pm
ZyaK
Электролиты по 100 микрофарад один прям на ноги ЕСПи, второй по входу 5 вольт, третий по выходу 3.3. Тантал у меня тоже на 100 микрофарад параллельно ногам ЕСПи, ну и керамика по 0.1
кстати каждую ЕСПи я запитываю через диод, чтоб исключить просадки по 5 вольтовой линии на остальные устройства.
блок питания у меня 5 вольт 5 ампер хрен знает от чего, но и малина 2-я на нем же висит и все сенсорные выключатели.
вот как то так плата выглядит