• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Esp8266 12E +MQTT не может подписаться на топики >5 штук

ZyaK

New member
Вот сегодня столкнулся с проблемой:
встала задача рулить через esp 8релюхами, остальные gpio будут задействованы под кнопки и пару термодатчиков, потому надо экономить ноги, решил делать на сдвиговом регистре 74hc 595
нашел скетч по MQTT, начал допиливать под себя.
и вроде все ничего, но как только количество топиков подписки переваливает за 5 штук - к MQTT мы не можем законектиться
железо нажатие на кнопку отрабатывает, в монитор порта пишет попытка подключения к MQTT
стоит закоментировать client.subscribe(relays_topic6);
и все работает как часы
Ткните пожалуйста носом что не так я делаю?
Код:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = "MikroTik"; //Название сети
const char* password = "csn941601";           //пароль
const char* mqtt_server = "192.168.1.216";    //ip брокера mqtt
#define RELAY_1 2                            //Выход на реле или светодиод
#define BUTTON_1 5                           //Кнопка
#define relays_topic1 "ESP01/r_1"
#define relays_topic2 "ESP01/r_2"
#define relays_topic3 "ESP01/r_3"
#define relays_topic4 "ESP01/r_4"
#define relays_topic5 "ESP01/r_5"
#define relays_topic6 "ESP01/r_6"

WiFiClient espClient;                        //инициализация WiFi клиента
PubSubClient client(espClient);              //инициализация MQTT клиента

long last_mls = millis();                    //функция времени в милисекундах
long last_mls2 = millis();

boolean Status1 = true;                       //объявляем статус реле в 0
boolean btnPress1 = false;                    //объявляем что кнопка не нажата 0
boolean lastbtnStat1 = false;                 //временная переменная для хранения статуса
boolean Status2 = true;
boolean Status3 = true;
boolean Status4 = true;
boolean Status5 = true;
boolean Status6 = true;

int regim1 = 0;                               //режим по умолчанию при включении
int regim2 = 0;
int regim3 = 0;
int regim4 = 0;
int regim5 = 0;
int regim6 = 0;

void setup(){
  pinMode(RELAY_1, OUTPUT);                  //Выход на реле или светодиод
  pinMode(BUTTON_1, INPUT);                  //Кнопка
  digitalWrite(RELAY_1, Status1);             //устанавливаем на выходе статус реле

  Serial.begin(115200);
  WiFi.begin(ssid, password);                //подключаемся к WiFi
  delay(5000);
  client.setServer(mqtt_server, 1883);       //подключаемся к MQTT
  client.setCallback(callback);              //функция получения топиков с брокера
  delay(100);
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  client.connect("ESP01Client");             //конектимся с брокером как клиент
  delay(100);
  client.subscribe(relays_topic1);            //подписываемся на топик
  client.subscribe(relays_topic2);            //подписываемся на топик
  client.subscribe(relays_topic3);            //подписываемся на топик
  client.subscribe(relays_topic4);            //подписываемся на топик
  client.subscribe(relays_topic5);            //подписываемся на топик
  client.subscribe(relays_topic6);
  
}

void callback(char* topic, uint8_t* payload, unsigned int length){
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("  ");
  String strTopic = String(topic);
  String strPayload = String((char*)payload);
  for (unsigned int i = 0; i < length; i++) {
  Serial.print((char)payload[i]);
  }
  Serial.println();
  if (strTopic == "ESP01/r_1") {
    if ((char)payload[0] == '0') {
      Status1 = true;
      regim1 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status1 = false;
      regim1 = 1;
    }
 
  if (strTopic == "ESP01/r_2") {
    if ((char)payload[0] == '0') {
      Status2 = false;
      regim2 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status2 = true;
      regim2 = 1;
    }
  }
  if (strTopic == "ESP01/r_3") {
    if ((char)payload[0] == '0') {
      Status3 = false;
      regim1 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status3 = true;
      regim1 = 1;
    }
  }
  if (strTopic == "ESP01/r_4") {
    if ((char)payload[0] == '0') {
      Status4 = false;
      regim1 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status4 = true;
      regim1 = 1;
    }
  }
  if (strTopic == "ESP01/r_5") {
    if ((char)payload[0] == '0') {
      Status5 = false;
      regim1 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status5 = true;
      regim1 = 1;
    }
  }
  if (strTopic == "ESP01/r_6") {
    if ((char)payload[0] == '0') {
      Status6 = false;
      regim1 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status6 = true;
      regim1 = 1;
    }
  }
}
}

void button1()
{
  btnPress1 = digitalRead(BUTTON_1);
  Status1 = digitalRead(RELAY_1);
  if (btnPress1 == LOW && lastbtnStat1 == false)
  {
    delay(5); // защита от дребезга
    regim1++;
    lastbtnStat1 = true;
    if (regim1 > 1)
    {
      regim1 = 0;
    }
  }
  if (btnPress1 == HIGH && lastbtnStat1 == true)
  {
    lastbtnStat1 = false;
  }

  if (regim1 == 0)
  {
    Status1 = true;
    digitalWrite(RELAY_1, Status1);
  }
  if (regim1 == 1)
  {
    Status1 = false;
    digitalWrite(RELAY_1, Status1);
  }
}

void MQTT()                                   //публикуем топик с состоянием режима
{
  if (millis() - last_mls2 > 3000)            //периодичность публикации топика
  { last_mls2 = millis();
    client.publish(relays_topic1, String(regim1).c_str());
    client.publish(relays_topic2, String(regim2).c_str());
    client.publish(relays_topic3, String(regim1).c_str());
    client.publish(relays_topic4, String(regim1).c_str());
    client.publish(relays_topic5, String(regim1).c_str());
    client.publish(relays_topic6, String(regim1).c_str());
    Serial.println("Отправка данных MQTT");
   }
}
void reconnect_server()                      //функция проверки подключения
{
  if (WiFi.status() != WL_CONNECTED)         //если нет подключения с сети
  {
    WiFi.begin(ssid, password);
    Serial.println("");
    Serial.println("WiFi попытка подключения reconnect");       //выводим в монитор порта что пытаемся подключиться
  } else {
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
  }
  if (!client.connected() &&  WiFi.status() == WL_CONNECTED  ) { //если к сети подключились но к MQTT нет
     client.connect("ESP01Client");             //конектимся с брокером как клиент
     delay(100);
     client.subscribe(relays_topic1);            //подписываемся на топик
     client.subscribe(relays_topic2);            //подписываемся на топик
     client.subscribe(relays_topic3);            //подписываемся на топик
     client.subscribe(relays_topic4);
     client.subscribe(relays_topic5);
     client.subscribe(relays_topic6);
     Serial.println("Mosquitto попытка подключения"); //выводим в монитор порта что пытаемся подключиться
  }
}
void loop()
{
  client.loop();
  MQTT();
  button1();
  //button2();
  //button3();
  //delay(200);
  if (millis() - last_mls > 15000)     //проверка подключений раз в 60 сек
  {
   last_mls = millis();
   reconnect_server();
   
  }
 
}
 
Сверху Снизу