• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

странные топики и данные

Shil

New member
Добрый день!
Подскажите пожалуйста куда копать)
почему то опубликованные через константу топики
#define pir_topic "/ESPO4/kitch/pir"
#define temp_topic "/ESPO4/kitch/temp"
#define hum_topic "/ESPO4/kitch/hum"
#define oxyQUA1 "/ESPO4/kitch/oxyQUA"
со временем начинают публиковаться с ошибками как в названии так и в значениях, притом, что публикуемые топики обычными переменными публикуются корректно
код и картинка с ошибочными топиками приложены

Код:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "Adafruit_Sensor.h"                            // Adafruit_Sensor
#include "DHT.h"                                        // Подключаем библиотеку DHT

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

#define pir_topic "/ESPO4/kitch/pir"
#define temp_topic "/ESPO4/kitch/temp"
#define hum_topic "/ESPO4/kitch/hum"
#define oxyQUA1 "/ESPO4/kitch/oxyQUA"
#define DHTPIN 5                                        // Пин к которому подключен датчик 2
//#define DHTPOWPIN 16                                        // Пин к которому подключен датчик 2
#define pirPin 0//4                              //контакт для подключения датчика
#define oxyQUA 16                                   // Пин к которому подключен датчик 2

#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);                               // Инициализируем датчик
WiFiClient espClient;                        //инициализация WiFi клиента
PubSubClient client(espClient);              //инициализация MQTT клиента
WiFiServer server(80);                                  // Указываем порт Web-сервера

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

int calibrationTime = 30;                     //Время калибровки датчика
long unsigned int lowIn;                      //Время, в которое был принят сигнал отсутствия движения(LOW)

boolean lockLow = true;                       //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
boolean takeLowTime;                          //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения

int val = 0;                                  //переменная для хранения состояния датчика
int valoxyQUA = 0;                                    //переменная наличия газа
int gasValue = 0; //переменная для хранения количества газа

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
  pinMode(pirPin, INPUT);
  pinMode(DHTPIN, INPUT);
  pinMode(oxyQUA, INPUT);
  dht.begin();

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

  WiFi.begin(ssid, password);                //подключаемся к WiFi
  delay(5000);                                      // настраиваем wifi ждем 5 секунд

  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" connected"); //  " подключено "
  Serial.println(WiFi.localIP());
  server.begin();
  delay(5000);
  client.connect("ESP04ClientK");             //конектимся с брокером как клиент
}

void reconnect_server()                      //функция проверки подключения
{
  Serial.println("функция проверки подключения");
  if (WiFi.status() != WL_CONNECTED)         //если нет подключения с сети
  {
    WiFi.begin(ssid, password);
    Serial.println("");
    Serial.println("WiFi connect...");       //выводим в монитор порта что пытаемся подключиться
  } 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("ESP04ClientK");    //
    Serial.println("Mosquitto connect..."); //выводим в монитор порта что пытаемся подключиться
  }
}


void MQTT()                                   //публикуем топик с состоянием режима
{

  // Serial.println("пытаемся опубликовать топик с состоянием режима");
  if (millis() - last_mls > 2000)            //периодичность публикации топика
  { val = digitalRead(pirPin);
    last_mls = millis();
    client.publish(pir_topic, String(val).c_str());
    Serial.println(pir_topic);
    Serial.println(val);
  }
  if (millis() - last_mls2 > 2000)            //периодичность публикации топика
  { // Проверяем, получили ли данные с датчика.
    last_mls2 = millis();
    float t = dht.readTemperature();                  // Запрос на считывание температуры
    float h = dht.readHumidity();
    if (isnan(h) || isnan(t)) {
      Serial.println("Данных нет! Останавливаем цикл и запускаем по новой");
      //digitalWrite(DHTPOWPIN,LOW);
      //delay(2000);
      //digitalWrite(DHTPOWPIN,HIGH);
      //delay(2000);
      return;
    }
    client.publish(temp_topic, String(t).c_str());
    client.publish(hum_topic, String(h).c_str());
    Serial.println(temp_topic);
    Serial.println(t);
    Serial.println(hum_topic);
    Serial.println(h);
  }

  if (millis() - last_mls3 > 2000)            //периодичность публикации топика
  {
    last_mls3 = millis();
    valoxyQUA = digitalRead(oxyQUA);   
    //gasValue=
    Serial.println("valoxyQUA");
    Serial.println(valoxyQUA);
    if (digitalRead(oxyQUA) == HIGH) {
      client.publish(oxyQUA1, "1");
    }   
    client.publish(oxyQUA1, "0");
    Serial.println("level");
  Serial.println(analogRead(A0));

  }

}

void loop()
{

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

}
upload_2019-5-13_10-53-40.png
 

Сергей_Ф

Moderator
Команда форума
@Shil строго говоря #define - это макрос препроцессора, а совсем не константа.
Через константы у вас объявлен ssid. Попробуйте также сделать.
А то у вас valoxyQUA вполне может превратиться в val16 и прочие чудеса в коде. #define очень коварен при необдуманном использовании.
 
Последнее редактирование:
  • Like
Реакции: Shil

Сергей_Ф

Moderator
Команда форума
@Shil у вас может ломаться всё что угодно с таким кодом. В #define имена макросов обычно пишут только в верхнем регистре не просто так, а что бы не было влияния на имена в коде. А у вас "сборная солянка". Там что угодно может быть.
 
Сверху Снизу