Вот сегодня столкнулся с проблемой:
встала задача рулить через esp 8релюхами, остальные gpio будут задействованы под кнопки и пару термодатчиков, потому надо экономить ноги, решил делать на сдвиговом регистре 74hc 595
нашел скетч по MQTT, начал допиливать под себя.
и вроде все ничего, но как только количество топиков подписки переваливает за 5 штук - к MQTT мы не можем законектиться
железо нажатие на кнопку отрабатывает, в монитор порта пишет попытка подключения к MQTT
стоит закоментировать client.subscribe(relays_topic6);
и все работает как часы
Ткните пожалуйста носом что не так я делаю?
встала задача рулить через 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();
}
}