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

IoT Manager - архив обсуждений

Статус
В этой теме нельзя размещать новые ответы.
. почитайте про [inline]pull request[/inline] если есть желание научиться, если нет - скажите я залью сам...
Я почитаю, обязательно, и скорее всего научусь. Но пока Вы сами залете...
.Только вот библиотеку лучше со ссылкой на автора (для обновлений)
тут проблема, я её нашел на этом сайте, без каких либо ссылок на авторство...
Код:
/***************************************************
  This is an example for the BMP085 Barometric Pressure & Temp Sensor

  Designed specifically to work with the Adafruit BMP085 Breakout
  ----> https://www.adafruit.com/products/391

  These displays use I2C to communicate, 2 pins are required to 
  interface
  Adafruit invests time and resources providing this open source code,
  please support Adafruit and open-source hardware by purchasing
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries. 
  BSD license, all text above must be included in any redistribution
****************************************************/

.Да, разумеется. Если нужно в чем-то мое участие - без проблем, с удовольствием помогу.
Будет нужна помощь - попрошу обязательно, а сейчас нужно, что-то интересное придумать. Вы не отвлекайтесь и добавляйте новые виджеты (ну там графики допустим, очень полезно будет для отображения изменения атмосферного давления).
 
@Victor добрый день! Возникли сложности, может быть вы сможете помочь...
Проблема в следующем: делаю свои скетчи на основе примера4, Всё хорошо. Компилируется, заливается в IoT manager данные отображаются, но после 4-5 минут работы датчики перестают отвечать и вместо данных в браке уходит "null". Сначала подумал что проблема с брокером, переключился на локального . Не помогло. Переписал код по другой датчик (был bmt180, стал dht 11). Опять непомогло... Незнаю в какую ещё сторону думать, может посоветуете?
 

klbsss

New member
@Victor добрый день! Возникли сложности, может быть вы сможете помочь...
Проблема в следующем: делаю свои скетчи на основе примера4, Всё хорошо. Компилируется, заливается в IoT manager данные отображаются, но после 4-5 минут работы датчики перестают отвечать и вместо данных в браке уходит "null". Сначала подумал что проблема с брокером, переключился на локального . Не помогло. Переписал код по другой датчик (был bmt180, стал dht 11). Опять непомогло... Незнаю в какую ещё сторону думать, может посоветуете?
у меня было такое.
Увеличите значение StaticJsonBuffer<8024> jsonBuffer;
 

Victor

Administrator
Команда форума
данные отображаются, но после 4-5 минут работы датчики перестают отвечать и вместо данных в браке уходит "null"
Увеличите значение StaticJsonBuffer<8024> jsonBuffer;
поддерживаю и посмотрите логи еще - может утечка памяти где-то (функция [inline]FreeHEAP[/inline] именно для этого)
 

grigorygn

New member
Добрый день!
Можно ли как-то подключить 74HC595 в качестве расширителя портов (выходов) наподобие того, как это описано здесь?
 

Victor

Administrator
Команда форума
Добрый день!
Можно ли как-то подключить 74HC595 в качестве расширителя портов (выходов) наподобие того, как это описано здесь?
да, конечно. IoT Manager к железу вообще никак не привязан - хоть от холодильника вашего будет принимать данные.
Кстати, есть еще вариант подключения Arduino Pro Mini через I2C по двум проводам в качестве расширителя портов от наших коллег esp8266.nu MiniProExtender:
Код:
/****************************************************************************************************************************\
* Arduino project "ESP Easy" � Copyright www.esp8266.nu
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
* You received a copy of the GNU General Public License along with this program in file 'License.txt'.
*
* IDE download    : https://www.arduino.cc/en/Main/Software
* ESP8266 Package : https://github.com/esp8266/Arduino
*
* Source Code     : https://sourceforge.net/projects/espeasy/
* Support         : http://www.esp8266.nu
* Discussion      : http://www.esp8266.nu/forum/
*
* Additional information about licensing can be found at : http://www.gnu.org/licenses
\*************************************************************************************************************************/

// This file is to be loaded onto an Arduino Pro Mini so it will act as a simple IO extender to the ESP module.
// Communication between ESP and Arduino is using the I2C bus, so only two wires needed.
// It best to run the Pro Mini on 3V3, although the 16MHz versions do not officially support this voltage level on this frequency.
// That way, you can skip levelconverters on I2C.
// Arduino Mini Pro uses A4 and A5 for I2C bus. ESP I2C can be configured but they are on GPIO-4 and GPIO-5 by default.

#include <Wire.h>

#define I2C_MSG_IN_SIZE    4
#define I2C_MSG_OUT_SIZE   4

#define CMD_DIGITAL_WRITE  1
#define CMD_DIGITAL_READ   2
#define CMD_ANALOG_WRITE   3
#define CMD_ANALOG_READ    4

volatile uint8_t sendBuffer[I2C_MSG_OUT_SIZE];

void setup()
{
  Wire.begin(0x7f);
  Wire.onReceive(receiveEvent);
  Wire.onRequest(requestEvent);
}

void loop() {}

void receiveEvent(int count)
{
  if (count == I2C_MSG_IN_SIZE)
  {
    byte cmd = Wire.read();
    byte port = Wire.read();
    int value = Wire.read();
    value += Wire.read()*256;
    switch(cmd)
      {
        case CMD_DIGITAL_WRITE:
          pinMode(port,OUTPUT);
          digitalWrite(port,value);
          break;
        case CMD_DIGITAL_READ:
          pinMode(port,INPUT_PULLUP);
          clearSendBuffer();
          sendBuffer[0] = digitalRead(port);
          break;
        case CMD_ANALOG_WRITE:
          analogWrite(port,value);
          break;
        case CMD_ANALOG_READ:
          clearSendBuffer();
          int valueRead = analogRead(port);
          sendBuffer[0] = valueRead & 0xff;
          sendBuffer[1] = valueRead >> 8;
          break;
      }
  }
}

void clearSendBuffer()
{
  for(byte x=0; x < sizeof(sendBuffer); x++)
    sendBuffer[x]=0;
}

void requestEvent()
{
  Wire.write((const uint8_t*)sendBuffer,sizeof(sendBuffer));
}
 
StaticJsonBuffer<8024> jsonBuffer
Спасибо, кажется помогло, прорестирую ещё ночью, но уже работает минут 30 без проблем.
Не подскажете, где посмотреть информацию о том как использовать ножки TX RX в качестве GPIO?

З.Ы. к сожалению спустя три часа все сломалось...
Вижу несколько выходов: 1. перезагружать модуль программно каждый час (костыль и неудобно); 2. отказаться от Json; 3.решить проблему с растущим буфером.
 
Последнее редактирование:

Victor

Administrator
Команда форума
решить проблему с растущим буфером.
попробуйте эту строку [inline]JsonObject& json_status = jsonBuffer.createObject();[/inline] перенести внутрь функций setStatus - это первый кандидат на утечку памяти. Также чтобы точно определить, что дело именно в утечке нужно отслеживать логи через терминал. Уменьшите [inline]jsonBuffer[/inline] обратно и все логи с запуска до вылета в студию :)
 
попробуйте эту строку JsonObject& json_status = jsonBuffer.createObject(); перенести внутрь функций setStatus.... Уменьшите jsonBuffer обратно и все логи с запуска до вылета в студию :)
Код:
MQTT client started.
Mode: STA
PHY mode: N
Channel: 1
AP id: 0
Status: 0
Auto connect: 1
SSID (0):
Passphrase (0):
BSSID set: 0
Connecting via WiFi to esp8266...

WiFi connect: Success
IP address: 192.168.1.165
Connecting to MQTT server ...
Connect to MQTT server: Success
Get data from subscribed topic /IoTmanager => dev04
Publish config: Success ({"id":0,"page":"HDT11","widget":"display-value","class1":"item no-border","style1":"","descr":"Влажность  %","class2":"balanced","style2":"font-size:20px;float:left;padding-top:10px;font-weight:bold;","topic":"/IoTmanager/dev04/HDT11_temp","class3":"","style3":"float:right;","height":"40","color":"#52FF00","inactive_color":"#414141","digits_count":3})
Publish config: Success ({"id":1,"page":"HDT11","widget":"display-value","class1":"item no-border","style1":"","descr":"Темп-ра  *C","class2":"balanced","style2":"font-size:20px;float:left;padding-top:10px;font-weight:bold;","topic":"/IoTmanager/dev04/HDT11_hum","class3":"","style3":"float:right;","height":"40","color":"#52FF00","inactive_color":"#414141","digits_count":3})
Publish config: Success
Publish new status for /IoTmanager/dev04/HDT11_temp, value: {"status":0}
Publish new status for /IoTmanager/dev04/HDT11_hum, value: {"status":0}
Publish new status for /IoTmanager/dev04/HDT11_temp, value: {"status":"35.00"}
Memory leak detected! old free heap = 40616, new value = 40544
Publish new status for /IoTmanager/dev04/HDT11_hum, value: {"status":"20.00"}
Publish new status for /IoTmanager/dev04/HDT11_temp, value: {"status":"35.00"}
Memory leak detected! old free heap = 40544, new value = 40328
Publish new status for /IoTmanager/dev04/HDT11_hum, value: {"status":"20.00"}
Publish new status for /IoTmanager/dev04/HDT11_temp, value: {"status":"35.00"}
Publish new status for /IoTmanager/dev04/HDT11_hum, value: {"status":"20.00"}
Publish new status for /IoTmanager/dev04/HDT11_temp, value: {"status":"35.00"}
Publish new status for /IoTmanager/dev04/HDT11_hum, value: {"status":"20.00"}
Publish new status for /IoTmanager/dev04/HDT11_temp, value: {"status":"35.00"}
Publish new status for /IoTmanager/dev04/HDT11_hum, value: {"status":"20.00"}
Publish new status for /IoTmanager/dev04/HDT11_temp, value: {"status":"35.00"}
Publish new status for /IoTmanager/dev04/HDT11_hum, value: {"status":"20.00"}
Publish new status for /IoTmanager/dev04/HDT11_temp, value: {"status":"35.00"}
Publish new status for /IoTmanager/dev04/HDT11_hum, value: {"status":"20.00"}
Publish new status for /IoTmanager/dev04/HDT11_temp, value: {"status":"35.00"}
Publish new status for /IoTmanager/dev04/HDT11_hum, value: {"status":"20.00"}
Publish new status for /IoTmanager/dev04/HDT11_temp, value: {"status":"34.00"}
Publish new status for /IoTmanager/dev04/HDT11_hum, value: {"status":"21.00"}
Publish new status for /IoTmanager/dev04/HDT11_temp, value: {"status":"35.00"}
Publish new status for /IoTmanager/dev04/HDT11_hum, value: {}
Get data from subscribed topic /IoTmanager => HELLO
Get data from subscribed topic /IoTmanager => dev04
Publish config: Success ({"id":0,"page":"HDT11","widget":"display-value","class1":"item no-border","style1":"","descr":"Влажность  %","class2":"balanced","style2":"font-size:20px;float:left;padding-top:10px;font-weight:bold;","topic":"/IoTmanager/dev04/HDT11_temp","class3":"","style3":"float:right;","height":"40","color":"#52FF00","inactive_color":"#414141","digits_count":3})
Publish config: Success ({"id":1,"page":"HDT11","widget":"display-value","class1":"item no-border","style1":"","descr":"Темп-ра  *C","class2":"balanced","style2":"font-size:20px;float:left;padding-top:10px;font-weight:bold;","topic":"/IoTmanager/dev04/HDT11_hum","class3":"","style3":"float:right;","height":"40","color":"#52FF00","inactive_color":"#414141","digits_count":3})
Publish config: Success
Publish new status for /IoTmanager/dev04/HDT11_temp, value: {}
Memory leak detected! old free heap = 40328, new value = 40216
Publish new status for /IoTmanager/dev04/HDT11_hum, value: {}
Publish new status for /IoTmanager/dev04/HDT11_temp, value: {}
Publish new status for /IoTmanager/dev04/HDT11_hum, value: {}
Publish new status for /IoTmanager/dev04/HDT11_temp, value: {}
Publish new status for /IoTmanager/dev04/HDT11_hum, value: {}
Publish new status for /IoTmanager/dev04/HDT11_temp, value: {}
Publish new status for /IoTmanager/dev04/HDT11_hum, value: {}
Publish new status for /IoTmanager/dev04/HDT11_temp, value: {}
 

Victor

Administrator
Команда форума
Данные из терминала
Код:
Publish new status for /IoTmanager/dev04/HDT11_hum, value: {}
дело не в утечке памяти, вроде датчик отваливается?
проверяйте [inline]temp[/inline] и [inline]davlen[/inline] после чтения данных и перед тем, как вызывать [inline]setStatus[/inline] и объявление этих переменных и чтение данных из датчика вынести в отдельную функцию (тогда они будут пересоздаваться каждый раз при вызове функции и не смогут влиять на утечку памяти)
 
Попробую, но почему увеличение буфера так сильно помогло. Ещё один момент, я пробовал сдвумя разными датчиками (датчик давления и датчик влажности) соответственно две разные библиотеки и два данных кода опроса датчиков. А результат одинаковый. Я тут задумался, а неможет быть это из-за кириллицы?
 
Выложите последний вариант скетча, я еще подумаю
Код:
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11   // DHT 11

DHT dht(DHTPIN, DHTTYPE);

String hum, temp; float h, t; int ttt;

const char *ssid =  "esp8266";            // cannot be longer than 32 characters!
const char *pass =  "12345678";       // WiFi password

String prefix   = "/IoTmanager";      // global prefix for all topics - must be some as mobile device
String deviceID = "dev04";            // thing ID - unique device id in our project

WiFiClient wclient;

// config for cloud mqtt broker by DNS hostname ( for example, cloudmqtt.com use: m20.cloudmqtt.com - EU, m11.cloudmqtt.com - USA )
//String mqttServerName = "m11.cloudmqtt.com";            // for cloud broker - by hostname, from CloudMQTT account data
//int    mqttport = 10927;                                // default 1883, but CloudMQTT.com use other, for example: 13191, 23191 (SSL), 33191 (WebSockets) - use from CloudMQTT account data
//String mqttuser =  "test";                              // from CloudMQTT account data
//String mqttpass =  "test";                              // from CloudMQTT account data
//PubSubClient client(wclient, mqttServerName, mqttport); // for cloud broker - by hostname


// config for local mqtt broker by IP address
IPAddress server(192, 168, 1, 100);                        // for local broker - by address
int    mqttport = 1883;                                    // default 1883
String mqttuser =  "test";                                     // from broker config
String mqttpass =  "test";                                     // from broker config
PubSubClient client(wclient, server, mqttport);            // for local broker - by address

String val;
String ids = "";
int newValue, newtime, oldtime, freeheap;

const int nWidgets = 2;
String sTopic      [nWidgets];
String stat        [nWidgets];
int    pin         [nWidgets];
String thing_config[nWidgets];
StaticJsonBuffer<1024>jsonBuffer;
//JsonObject& json_status = jsonBuffer.createObject();
String string_status;

void FreeHEAP() {
  if ( ESP.getFreeHeap() < freeheap ) {
    if ( ( freeheap != 100000) ) {
       Serial.print("Memory leak detected! old free heap = ");
       Serial.print(freeheap);
       Serial.print(", new value = ");
       Serial.println(ESP.getFreeHeap());
    }
    freeheap = ESP.getFreeHeap();
  }
}

String setStatus ( String s ) {
  JsonObject& json_status = jsonBuffer.createObject();
  json_status["status"] = s;
  string_status = "";
  json_status.printTo(string_status);
  return string_status;
}
String setStatus ( int s ) {
  JsonObject& json_status = jsonBuffer.createObject();
  json_status["status"] = s;
  string_status = "";
  json_status.printTo(string_status);
  return string_status;
}
void initVar() {

  sTopic[0] = prefix + "/" + deviceID + "/HDT11_temp";
  stat  [0] = setStatus (0);
  sTopic[1] = prefix + "/" + deviceID + "/HDT11_hum";
  stat  [1] = setStatus (1);

  JsonObject& root = jsonBuffer.createObject();
  JsonObject& cfg  = jsonBuffer.createObject();

  root["id"] = 0;
  root["page"] = "HDT11";
  root["widget"] = "display-value";
  root["class1"] = "item no-border";                          // class for 1st div
  root["style1"] = "";                                        // style for 1st div
  root["descr"]  = "Влажность  %";                            // text  for description
  root["class2"] = "balanced";                                // class for description from Widgets Guide - Color classes
  root["style2"] = "font-size:20px;float:left;padding-top:10px;font-weight:bold;"; // style for description
  root["topic"] = sTopic[0];
  root["class3"] = "";                                        // class for 3 div - SVG
  root["style3"] = "float:right;";                            // style for 3 div - SVG
  root["height"] = "40";                                      // SVG height without "px"
  root["color"]  = "#52FF00";                                 // color for active segments
  root["inactive_color"] = "#414141";                         // color for inactive segments
  root["digits_count"]   = 3;                                 // how many digits
 
  root.printTo(thing_config[0]);

//////////////////////////////////////
root["id"] = 1;
  root["page"] = "HDT11";
  root["widget"] = "display-value";
  root["class1"] = "item no-border";                          // class for 1st div
  root["style1"] = "";                                        // style for 1st div
  root["descr"]  = "Темп-ра  *C";                            // text  for description
  root["class2"] = "balanced";                                // class for description from Widgets Guide - Color classes
  root["style2"] = "font-size:20px;float:left;padding-top:10px;font-weight:bold;"; // style for description
  root["topic"] = sTopic[1];
  root["class3"] = "";                                        // class for 3 div - SVG
  root["style3"] = "float:right;";                            // style for 3 div - SVG
  root["height"] = "40";                                      // SVG height without "px"
  root["color"]  = "#52FF00";                                 // color for active segments
  root["inactive_color"] = "#414141";                         // color for inactive segments
  root["digits_count"]   = 3;                                 // how many digits
 
  root.printTo(thing_config[1]);
//////////////////////////////////////
 
}
void pubStatus(String t, String payload) { 
    if (client.publish(t + "/status", payload)) {
       Serial.println("Publish new status for " + t + ", value: " + payload);
    } else {
       Serial.println("Publish new status for " + t + " FAIL!");
    }
    FreeHEAP();
}
void pubConfig() {
  bool success;
  success = client.publish(MQTT::Publish(prefix, deviceID).set_qos(1));
  if (success) {
      delay(500);
      for (int i = 0; i < nWidgets; i = i + 1) {
        success = client.publish(MQTT::Publish(prefix + "/" + deviceID + "/config", thing_config[i]).set_qos(1));
        if (success) {
          Serial.println("Publish config: Success (" + thing_config[i] + ")");
        } else {
          Serial.println("Publish config FAIL! ("    + thing_config[i] + ")");
        }
        delay(150);
      }     
  }
  if (success) {
     Serial.println("Publish config: Success");
  } else {
     Serial.println("Publish config: FAIL");
  }
  stat[0] = setStatus(  ttt=0 ); // пока не понял то это
  stat[1] = setStatus(  ttt=0 ); // пока не понял то это
  for (int i = 0; i < nWidgets; i = i + 1) {
      pubStatus(sTopic[i], stat[i]);
      delay(100);
  }     
}
void callback(const MQTT::Publish& sub) {
  Serial.print("Get data from subscribed topic ");
  Serial.print(sub.topic());
  Serial.print(" => ");
  Serial.println(sub.payload_string());

  if ( sub.payload_string() == "HELLO" ) {  // handshaking
     pubConfig();
  }
}

void setup() {
    dht.begin();
  WiFi.mode(WIFI_STA);
  initVar();
  oldtime = 0;
  Serial.begin(115200);
  delay(10);
  Serial.println();
  Serial.println();
  Serial.println("MQTT client started.");
  FreeHEAP();
  freeheap = 100000;
  WiFi.disconnect();
  WiFi.printDiag(Serial);
}

void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    Serial.print("Connecting via WiFi to ");
    Serial.print(ssid);
    Serial.println("...");

    WiFi.begin(ssid, pass);

    if (WiFi.waitForConnectResult() != WL_CONNECTED) {
      return;
    }

    Serial.println("");
    Serial.println("WiFi connect: Success");
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
  }

  if (WiFi.status() == WL_CONNECTED) {
    if (!client.connected()) {
      Serial.println("Connecting to MQTT server ...");
      bool success;
      if (mqttuser.length() > 0) {
        success = client.connect( MQTT::Connect( deviceID ).set_auth(mqttuser, mqttpass) );
      } else {
        success = client.connect( deviceID );
      }
      if (success) {
        client.set_callback(callback);
        Serial.println("Connect to MQTT server: Success");
        client.subscribe(prefix); // for receiving HELLO messages and handshaking
        pubConfig();
      } else {
        Serial.println("Connect to MQTT server: FAIL");  
        delay(1000);
      }
    }

    if (client.connected()) {
      newtime = millis();
      if (newtime - oldtime > 10000) { // read ADC and publish data every 10 sec
       
        h = dht.readHumidity();
        hum = String(h);
        t=dht.readTemperature();
        temp = String (t);
       
        stat[0] = setStatus( hum );
        stat[1] = setStatus( temp );
        pubStatus(sTopic[0], stat[0] );
        pubStatus(sTopic[1], stat[1] );
        oldtime = newtime;
      }
      client.loop();
    }
  }
}
 

Victor

Administrator
Команда форума
ну вы еще не выполнили предыдущие рекомендации.
и еще объявление [inline]string_status[/inline] перенесите внутрь [inline]setStatus[/inline]
 
Итак, что удалось выяснить:
1. проблема точно не в кириллице;
2.точно не в отваливающемся датчике.
Проблема где-то вот в этом куске кода
Код:
String setStatus ( String s ) {
  JsonObject& json_status = jsonBuffer.createObject();
  String string_status;
  json_status["status"] = s;
  string_status = "";
  json_status.printTo(string_status);
  return string_status;
}
String setStatus ( int s ) {
  JsonObject& json_status = jsonBuffer.createObject();
  String string_status;
  json_status["status"] = s;
  string_status = "";
  json_status.printTo(string_status);
  return string_status;

после того как я заменил его на аналогичный кусок из примера 1
Код:
String setStatus ( String s ) {
  String stat = "{\"status\":\"" + s + "\"}";
  return stat;
}
String setStatus ( int s ) {
  String stat = "{\"status\":\"" + String(s) + "\"}";
  return stat;
}
все стало работать как часы. я конечно оставлю теститься на ночь... Утром сделаю выводы...
P/S/ Отработало всю ночь без косяков.
 
Последнее редактирование:

Victor

Administrator
Команда форума
Вышла новая версия IoT Manager - подробности в новой теме.
Этот топик помечен как архивный, но доступен для чтения. Для дальнейшего обсуждения IoT Manager создан отдельный раздел, в котором будем стараться придерживаться правила "Каждый вопрос в отдельном топике"
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу