• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 имена макросов обычно пишут только в верхнем регистре не просто так, а что бы не было влияния на имена в коде. А у вас "сборная солянка". Там что угодно может быть.
 
Сверху Снизу