• Система автоматизации с открытым исходным кодом на базе 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 создан отдельный раздел, в котором будем стараться придерживаться правила "Каждый вопрос в отдельном топике"
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу