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

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