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

mqtt +ESP изменении топика

Shil

New member
Добрый день! подскажите пожалуйста, две ESP-12E D с почти одинаковым кодом, со временем перестают адекватно реагировать на изменении топика из вне.
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
//#include "Adafruit_Sensor.h" // Adafruit_Sensor
#include <WiFiUdp.h>
#include <ArduinoOTA.h>


const char* ssid = "хххххх"; //Название сети
const char* password = "хххххх"; //пароль
const char* mqtt_server = "192.168.1.181"; //ip брокера mqtt
const char* pir_topic = "/ESPO4/koridor/pir";

const char* Ligth_topic = "/ESPO4/koridor/Ligth";
const char* svet = "/ESPO4/koridor/svet";
const char* svetState = "/ESPO4/koridor/svetState";
const char* dor_topic = "/ESPO4/koridor/dor";
const char* dor_log = "/ESPO4/koridor/dor_log";

const char* Pirinterputcount = "NO";
volatile byte svetState1 ;

int dor = 0; // состояние двери
int prev_dor; // предыдущее состояние состояние двери
const int dorPIN = 5;
int ligt; //переменная значения освещенностиligt
int prev_ligt; //переменная последнего значения освещенности

int valPir = false; //переменная для хранения состояния датчика

int val = 0;
volatile byte Prev_valPir = 0; //переменная для хранения состояния датчика
const int pirPin = 16 ; // Пин прерывание к которому подключен датчик

volatile byte stateInt = LOW;
volatile byte prevstateInt = LOW;
const int svetPIN = 13; // Пин к которому подключен датчик
typedef unsigned char uchar;
typedef unsigned long long ullong;

WiFiClient espClient; //инициализация WiFi клиента
PubSubClient client(espClient); //инициализация MQTT клиента
WiFiServer server(80); // Указываем порт Web-сервера


long last_mls = millis(); //функция времени в милисекундах
long last_mls2 = millis(); //функция времени для датчика движения
long last_mls3 = millis(); //функция времени для отправки топиков
long last_mls4 = millis(); //функция времени для отправки топиков времени
long last_mls5 = millis(); //функция времени для отправки топиков времени

void setup() //Выполняется при запуске 1 раз
{

if (WiFi.getAutoConnect() != true) WiFi.setAutoConnect(true); //on power-on automatically connects to last used hwAP
WiFi.setAutoReconnect(true); //automatically reconnects to hwAP in case it is disconnected
WiFi.mode(WIFI_STA);// говорим что точка работает в режиме клиента
pinMode(pirPin, INPUT);
pinMode(svetPIN, OUTPUT);
pinMode(dorPIN, INPUT);
digitalWrite(svetPIN, LOW);

svetState1 = false;

Serial.begin(115200); //инициализация монитора порта
client.setServer(mqtt_server, 1883); //подключаемся к MQTT
client.setCallback(callback1); //функция получения топиков с брокера
delay(100); //ждем 100 милисекунд

WiFi.begin(ssid, password); //подключаемся к WiFi
delay(5000);
digitalWrite(svetPIN, HIGH);
// Serial.println("настраиваем wifi");//ждем 5 секунд
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println(" connected"); // " подключено "
Serial.println(WiFi.localIP());
server.begin();
delay(5000);
client.connect("ESP04Clientkor");
client.subscribe(svet);

//OTA fubnction start
ArduinoOTA.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH) {
type = "sketch";
} else { // U_SPIFFS
type = "filesystem";
}

// NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
Serial.println("Start updating " + type);
});
ArduinoOTA.onEnd([]() {
Serial.println("\nEnd");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) {
Serial.println("Auth Failed");
} else if (error == OTA_BEGIN_ERROR) {
Serial.println("Begin Failed");
} else if (error == OTA_CONNECT_ERROR) {
Serial.println("Connect Failed");
} else if (error == OTA_RECEIVE_ERROR) {
Serial.println("Receive Failed");
} else if (error == OTA_END_ERROR) {
Serial.println("End Failed");
}
});
ArduinoOTA.begin();
//OTA fubnction end
//
//pinMode (pirPin, INPUT);
//–Задаем функцию blink , которая будет вызвана по внешнему прерыванию.
// attachInterrupt ( digitalPinToInterrupt (pirPin), blink, LOW );
}


// Функция Callback
void callback1(char* topic, byte* payload, unsigned int length)
{
Serial.println("Изменился топик");
Serial.println(topic);
Serial.println("Значение топика");

client.publish(dor_log, "Значение топика изменились"+millis());
//client.publish(dor_log, String(topic).c_str());
byte* p = (byte*)malloc(length);
// Copy the payload to the new buffer
memcpy(p, payload, length);
//for (int i = 0; i < length; i++)
//Serial.print((char)payload);
val = *p - 48;
digitalWrite(svetPIN, val);
Serial.println("Значение топика1");
Serial.println(val);
client.publish(svetState, String(val).c_str());
// Free the memory
free(p);
}


void reconnect_server() //функция проверки подключения
{
WiFi.reconnect();
// WiFi.begin(ssid, password); //подключаемся к WiFi
delay(5000);
Serial.println("функция проверки подключения");

while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".Reconnecting WiFI");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
if (!client.connected()) { //если к сети подключились но к MQTT нет
client.connect("ESP04Clientkor");
Serial.println("Mosquitto connect..."); //выводим в монитор порта что пытаемся подключиться
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("ESP04Clientkor")) {
Serial.println("connected");
client.setCallback(callback1); //функция получения топиков с брокера
client.subscribe(svet);
} else {
Serial.print(client.state());
Serial.print(WiFi.status());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
}



void MQTT() //публикуем топик с состоянием режима
{
if ( millis() - last_mls3 > 3000)
{ valPir = digitalRead(pirPin) ;
if (valPir != 1)
{
last_mls3 = millis();
}
if (valPir != Prev_valPir)
{
client.publish(pir_topic, String(digitalRead(pirPin)).c_str());
Prev_valPir = digitalRead(pirPin);
}

}


// Serial.println("пытаемся опубликовать топик с освещённости");
if (millis() - last_mls > 2000) //периодичность публикации топика освещённости
{ last_mls = millis();
ligt = analogRead(A0) - 10;
if (ligt != prev_ligt) {
prev_ligt = ligt;
// Serial.println(ligt);
client.publish(Ligth_topic, String(ligt).c_str());
}
}
if (millis() - last_mls2 > 1000) //периодичность публикации топика чего то
{ // Проверяем, получили ли данные с датчика.
last_mls2 = millis();
dor = !digitalRead(dorPIN);
if (dor != prev_dor) {
Serial.println("New Value: " + String(dor));
// "Новое значение: "
prev_dor = dor;
client.publish(dor_topic, String(dor).c_str());

}
}

if (millis() - last_mls4 > 10000) //периодичность публикации топика
{
last_mls4 = millis();
}

//публикуем статус и меняем значение для ионизатора
if (prevstateInt != stateInt)

{ // меняем значение на противоположное
client.publish(svetState, String(stateInt).c_str());
Serial.println("топик Света ");
Serial.println(stateInt);
prevstateInt = stateInt;
}
}

void loop()
{
ArduinoOTA.handle();
if (client.connected() != 1 || WiFi.status() != WL_CONNECTED)
{
Serial.println("НЕт подключения");
reconnect_server();
}
else
{

MQTT();
client.loop();

}

}

топик dor_log использую только для отслеживания что колбэк срабатывает, были подозрения что она не отрабатывает .
так вот со временем да же нем странные знаяения
mqtt.png
client.publish(dor_log, "Значение топика изменились"+millis());

пожалуйста расскажите что у меня опять не так.
 
Сверху Снизу