• Система автоматизации с открытым исходным кодом на базе 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();
   
  }
 
}
 
Сверху Снизу