ESP8266 Web and MQTT Framework

Поделиться
HTML-код
  • Опубликовано: 17 ноя 2024

Комментарии • 76

  • @peut
    @peut 8 лет назад +1

    Thanks Alex. Your examples are very helpful. I do not understand Russian, but I do understand your projects.

    • @alexmorozov73
      @alexmorozov73  8 лет назад

      You are welcome!
      Last framework code in video "Умное реле на ESP8266 (версия 2.0)". Virtual method defaultConfig changes parameter type from bool to byte to supports partial defaults (0 = defaults at all levels of inheritance, see code).

  • @АндрейКузнецов-э2п1ф

    Вот спасибо. Делаю инкубатор и там думаю использовать этот датчик. И тут такая находка, Ваш ролик. Еще раз СПАСИБО.

  • @doprdele
    @doprdele 8 лет назад

    Отличное видео. Спасибо за разъяснения и исходники, интересно покопаться )

    • @alexmorozov73
      @alexmorozov73  8 лет назад

      Пожалуйста. Но в видео про реле 2.0 код фреймворка чуть поновее. Лучше его копайте. :)

    • @krepton85you
      @krepton85you 8 лет назад

      Можете скинуть все необходимые библиотеки для данного скетча, а то с моими что то не компилируется?

    • @alexmorozov73
      @alexmorozov73  8 лет назад

      PubSubClient я устанавливал из самой среды Arduino IDE через менеджер библиотек из стандартного репозитория, ссылка в нем ведет на pubsubclient.knolleary.net/
      Остальные библиотеки - это пакет поддержки ESP8266 последней версии (2.3.0) с github.com/esp8266/Arduino

    • @krepton85you
      @krepton85you 8 лет назад

      yadi.sk/d/i9TlP1A6wXdSX не компелирует смотрите сами ошибки компиляции.

    • @alexmorozov73
      @alexmorozov73  8 лет назад

      У меня поддержка ESP 2.3.0, а в ошибках 2.2.0. У себя на 3-х компьютерах никаких проблем с компилляцией не имею.

  • @kabikin
    @kabikin 6 лет назад

    Попробовал адаптировать код под датчик Si7021 с Adafruit_Si7021.h( да простит автор за вольное усечения кода-в планах только Si7021) .В сериале только первая "мусорная"строка, uptime(0),Heap(0), данные с датчика (0).Если будет время пробежать по коду,буду благодарен за любое замечание..
    #include
    #include
    #include "ESPWebMQTT.h"
    const char* const jsonTemperature PROGMEM = "temperature";
    const char* const jsonHumidity PROGMEM = "humidity";
    class ESPBaro : public ESPWebMQTTBase {
    public:
    ESPBaro();
    protected:
    void setupExtra();
    void loopExtra();
    void handleRootPage();
    String jsonData();
    private:
    Adafruit_Si7021* bm;
    float temperature;
    float humidity;
    };
    /*
    * ESPWebBaro class implementation
    */
    ESPBaro::ESPBaro() : ESPWebMQTTBase() {
    bm = new Adafruit_Si7021();
    }
    void ESPBaro::setupExtra() {
    ESPWebMQTTBase::setupExtra();
    bm->begin();
    }
    void ESPBaro::loopExtra() {
    const uint32_t timeout = 1000; // 1 sec.
    static uint32_t nextTime;
    ESPWebMQTTBase::loopExtra();
    if (millis() >= nextTime) {
    temperature = bm->readTemperature();
    humidity = bm->readHumidity();
    if (pubSubClient->connected()) {
    String path, topic;
    if (_mqttClient != strEmpty) {
    path += charSlash;
    path += _mqttClient;
    }
    path += charSlash;
    topic = path + FPSTR(jsonTemperature);
    mqttPublish(topic, String(temperature));
    topic = path + FPSTR(jsonHumidity);
    mqttPublish(topic, String(humidity));
    }
    nextTime = millis() + timeout;
    }
    }
    void ESPBaro::handleRootPage() {
    String script = F("var temp, press, humid;
    \
    function refreshData() {
    \
    var request = new XMLHttpRequest();
    \
    request.open('GET', '");
    script += FPSTR(pathData);
    script += F("', true);
    \
    request.onreadystatechange = function() {
    \
    if (request.readyState == 4) {
    \
    var data = JSON.parse(request.responseText);
    \
    document.getElementById('");
    script += FPSTR(jsonFreeHeap);
    script += F("').innerHTML = data.");
    script += FPSTR(jsonFreeHeap);
    script += F(";
    \
    document.getElementById('");
    script += FPSTR(jsonUptime);
    script += F("').innerHTML = data.");
    script += FPSTR(jsonUptime);
    script += F(";
    \
    document.getElementById('");
    script += FPSTR(jsonTemperature);
    script += F("').innerHTML = data.");
    script += FPSTR(jsonTemperature);
    script += F(";
    ");
    script += F("document.getElementById('");
    script += FPSTR(jsonHumidity);
    script += F("').innerHTML = data.");
    script += FPSTR(jsonHumidity);
    script += F(";
    ");
    script += F("temp.add(data.temperature);
    ");
    script += F("humid.add(data.humidity);
    ");
    script += F("}
    \
    }
    \
    request.send(null);
    \
    setTimeout(refreshData, 1000);
    \
    }
    \
    function onBodyLoad() {
    \
    temp = createGraph(document.getElementById(\"temp\"), \"Temperature (C)\", 400, 200, 0, 50, false, \"cyan\");
    ");
    script += F("humid = createGraph(document.getElementById(\"humid\"), \"Humidity (%)\", 400, 200, 0, 100, false, \"gold\");
    ");
    script += F("refreshData();
    \
    }
    ");
    String page = ESPWebBase::webPageStart(F("SI7021"));
    page += ESPWebBase::webPageScript(F("graphs.js"), true);
    page += ESPWebBase::webPageScript(script);
    page += ESPWebBase::webPageBody(F("onload=\"onBodyLoad()\""));
    page += F("ESP8266
    \

    \
    Heap free size: 0 bytes
    \
    Uptime: 0 seconds
    \
    Temperature: 0 C
    ");
    page += F("Humidity: 0 %
    ");
    page += F("
    \

    ");
    page += F("
    ");
    page += F("
    ");
    page += navigator();
    page += ESPWebBase::webPageEnd();
    httpServer->send(200, FPSTR(textHtml), page);
    }
    String ESPBaro::jsonData() {
    String result = ESPWebMQTTBase::jsonData();
    result += F(",\"");
    result += FPSTR(jsonTemperature);
    result += F("\":");
    result += String(temperature);
    result += F(",\"");
    result += F(",\"");
    result += FPSTR(jsonHumidity);
    result += F("\":");
    result += String(humidity);
    return result;
    }
    ESPBaro* app = new ESPBaro();
    void setup() {
    Serial.begin(115200);
    Serial.println();
    app->setup();
    }
    void loop() {
    app->loop();
    }

  • @chrisn.6760
    @chrisn.6760 6 лет назад

    Маленький совет, если что-то хотите показать, то пожалуйста в камеру. А так видно интересное

  • @АндрейМельниченко-ъ2щ

    Доброй ночи! Лайк за видео, очень подробно объясняете. Хотел Вам задать пару вопросов. В первой версии ESP_Relay Вы используете один ino файл и для передачи вэб-страницы используете String message = F("....); и используете конкатенацию строк для вывода переменных, используемых на странице. В более поздних версиях кода Вы уже используете несколько файлов с классами. Для чего было необходимо введение классов?
    В некоторых примерах мне встречалось использование префикса R - необработанные строковые литералы для передачи вэб-страницы. Почемы Вы не использовали данный префикс? А используете для вывода страницы префикс F. А для вывода скрипта уже используете строковые константы в флеш памяти и префикс FPSTR. Получилось немного сумбурно, но понравилась Ваша реализация вэб-интерфейса и хотелось бы разобраться в самом коде, а не просто использовать обертку.
    ЗЫ: еще вопрос вдогонку, почему не используете для хранения html, js, css SPIFFS?

    • @alexmorozov73
      @alexmorozov73  4 года назад

      А почитать, что такое R() и F()? Тогда и вопрос ненужный не возникнет... Заодно и зачем ООП придумали тоже почитать.
      "Движок" позволяет использовать SPIFFS, но это значит, что процесс обновления прошивки становится (возможно) двухэтапным. И я в код страниц вставляю имена констант, так что это уже динамические страницы, а значит их если и хранить в SPIFFS, то только в виде шаблона.
      Вся эта кухня устарела...

    • @АндрейМельниченко-ъ2щ
      @АндрейМельниченко-ъ2щ 4 года назад

      @@alexmorozov73 Что Вы имеете в виду, насчет устаревшей кухни?

    • @alexmorozov73
      @alexmorozov73  4 года назад

      @@АндрейМельниченко-ъ2щ что я больше такой фреймворк не использую, даже параметры храню теперь сильно иначе, но платой за универсальность является уменьшенная гибкость, увы. Можете посмотреть код из ролика про релейный модуль для ESP01S из свежих, чтобы понимать о чем я.

    • @АндрейМельниченко-ъ2щ
      @АндрейМельниченко-ъ2щ 4 года назад

      @@alexmorozov73 А не подскажите как видео называется. Помню, что где-то попадалось, но не могу вспомнить название.

  • @plantingAsia
    @plantingAsia 7 лет назад

    Спасибо за толковые видео!

    • @alexmorozov73
      @alexmorozov73  7 лет назад

      В среде Arduino IDE установить через менеджер библиотек.
      А вообще это очень старое видео, последняя версия фреймворка используется в "умных реле", так что посмотрите ролики и о них.

  • @АндрейКузнецов-э2п1ф

    Спасибо за видео. Вопрос , датчик SHT10 подключится аналогично как и BMP, с соответствующим добавлением библиотеки ?

    • @alexmorozov73
      @alexmorozov73  7 лет назад

      А почему должно быть иначе? :)
      Только это слишком старый код, последний код фреймворка в ролике ruclips.net/video/gycQfap7T1k/видео.html

  • @АндрейКузнецов-э2п1ф

    Еще вопрос. Поставить библиотеку SHT1x с датчиком в Ваш скетч не получиться??? придется весь код переделывать? В библиотеке BME 280 сразу прописывается подключение датчика по I2C, а в библиотеке SHT1x такого нет((( нужно будет в скетче обозначать пины подключения? или есть более легкий путь?

    • @alexmorozov73
      @alexmorozov73  7 лет назад

      Весь код переделывать из-за одного датчика не придется. Путь один и он легче некуда. То, что при вызове конструктора класса датчика BMx не указываются пины - не делает код проще.

    • @АндрейКузнецов-э2п1ф
      @АндрейКузнецов-э2п1ф 7 лет назад

      Открой секрет какой? Где посмотреть?

  • @stanislavbogdanovich7996
    @stanislavbogdanovich7996 6 лет назад +1

    Алекс, добрый день!
    Если не трудно. подскажите как это можно сделать?
    Недавно в коментах к одному из ваших роликов всплыла тема SSDP. Показалось интересным добавить данную возможность к вашим наработкам. Пытался добавить код в ваш класс ESPWeb Но, увы, пока мозгов не хватает :)
    в доках на библиотеку вроде все просто. нужно:
    ...
    HTTP.on("/description.xml", HTTP_GET, [](){
    SSDP.schema(HTTP.client());
    });
    HTTP.begin();
    Serial.printf("Starting SSDP...
    ");
    SSDP.setSchemaURL("description.xml");
    SSDP.setHTTPPort(80);
    SSDP.setName("Philips hue clone");
    SSDP.setSerialNumber("001788102201");
    SSDP.setURL("index.html");
    SSDP.setModelName("Philips hue bridge 2012");
    SSDP.setModelNumber("929000226503");
    SSDP.setModelURL("www.meethue.com");
    SSDP.setManufacturer("Royal Philips Electronics");
    SSDP.setManufacturerURL("www.philips.com");
    SSDP.begin();
    проблема возникла с реализацией вот этого момента:
    HTTP.on("/description.xml", HTTP_GET, [](){
    SSDP.schema(HTTP.client());
    });
    что пытался сделать:
    1. добавил библиотеку
    #include
    2. в ESPWebBase::setupHttpServer() добавил строки
    httpServer->on(String(FPSTR(SSDPData )).c_str(), HTTP_GET, std::bind(&ESPWebBase::handleSSDP, this));
    SSDP.setSchemaURL("description.xml");
    SSDP.setHTTPPort(80);
    SSDP.setName("ESPWEBSERVER");
    SSDP.setSerialNumber("00000001");
    SSDP.setURL("/");
    SSDP.setModelName("ESPWEBSERVER");
    SSDP.setModelNumber("000000000001");
    SSDP.setModelURL("bla.bla.bla/");
    SSDP.setManufacturer("bla.bla.bla");
    SSDP.setManufacturerURL("bla.bla.bla");
    SSDP.begin();
    }
    3. добавил в ESPWebBase.h
    const char* const SSDPData PROGMEM = "/description.xml";
    4. добавил функцию handleSSDP
    void ESPWebBase::handleSSDP() {
    SSDP.schema(httpServer->client());
    }
    при обращении по /description.xml браузер честно отображает содержимое всех полей SSDP, но в сетевом окружении ничего не появляется...
    я, как правильный Олень, понимаю,что проблема в неверной реализации конструкции
    SSDP.schema(HTTP.client());
    но как ее сделать верной - не догоняю. увы.
    не подскажете?

    • @alexmorozov73
      @alexmorozov73  6 лет назад

      Я вижу разницу с примером только в том, что методы SSDP.setXXX и SSDP.begin() вызываются после HTTP.begin(), а значит им место в конце метода onWiFiConnected. Точнее SSDP.setXXX можно оставить, а вот SSDP.begin() точно нужно перенести после HTTP.begin()

    • @alexmorozov73
      @alexmorozov73  6 лет назад

      На самом деле и в первоначальном случае SSDP.begin() вызывается после HTTP.begin(), так что и ваш код правильный. Другое дело, что у меня и стандартный пример не работает как надо, т.е. устройство в сети не находит. Так что дело, боюсь, не во фреймворке.

    • @stanislavbogdanovich7996
      @stanislavbogdanovich7996 6 лет назад

      Спасибо за ответ и за потраченное время :)
      Я ранее запускал подобный код в "процедурной" реализации. Все работало. Было удобно: не надо было помнить IP устройств. Видимо, какие-то подводные камни при переносе таки есть :(
      Жаль.
      Еще раз спасибо!

    • @alexmorozov73
      @alexmorozov73  6 лет назад

      Я же говорил, что на последних версиях библиотек не работает пример SSDP!
      А вот если добавить при конфигурировании параметров перед SSDP.begin() строку
      SSDP.setDeviceType(F("upnp:rootdevice"));
      то все работает и в стандартном примере и во фреймворке.
      Другое дело, что библиотека реализует взаимодействие на таймере, что не полезно при сложных скетчах.

    • @stanislavbogdanovich7996
      @stanislavbogdanovich7996 6 лет назад

      Огромное спасибо!
      Сам бы,я наверняка не разобрался.

  • @ainasauciageras
    @ainasauciageras 7 лет назад

    Wow как у вас тут всё "просто", с разбегу и я хотел на этом примере ещё BH1750 прикрутить, но целый день провозился и без результатно, но всё же наверное лучше одну ESP не нагружать винегретом, а к реле добавить BH1750 и PIR датчик. Например в этот www.electrodragon.com/product/wifi-iot-relay-board-based-esp8266/ и может управлять светом по заданием по МЖД.

    • @alexmorozov73
      @alexmorozov73  7 лет назад

      Посмотрите мои последние ролики из серии "умное реле" (5 и 5+), там навешано на ESP достаточно немало, а народ все просит и просит еще прикрутить какую-нибудь фигню. :)

  • @krendely0k
    @krendely0k 7 лет назад

    Почему-то после ребута у меня пин всегда переходит в HIGH, независимо от выбранного варианта в настройках.

    • @alexmorozov73
      @alexmorozov73  7 лет назад

      Вы вообще о чем? Где в этих скетчах настройки?

    • @krendely0k
      @krendely0k 7 лет назад

      Вот про эти настройки)) pp.userapi.com/c841527/v841527958/36955/szEqLmEQJmU.jpg Это разве не настройки состояния пинов после загрузки?

    • @alexmorozov73
      @alexmorozov73  7 лет назад

      А писать под роликом, которого это касается, не пробовали?
      В первую очередь при перезагрузке реле пытается восстановить предыдущее состояние из RTC памяти. И если RTC пуста, то тогда отрабатывают настройки.

    • @alexmorozov73
      @alexmorozov73  7 лет назад

      Чего путаться?! Берете скетч из ролика про LDR, он вроде бы самый последний. RTC-память присутствует в самом ESP.
      При отключении питания секунд на 10 и подачи обратно какое состояние пина после загрузки?

    • @krendely0k
      @krendely0k 7 лет назад

      Да скетч именно оттуда (с возможностью задавать имя для реле). Питание пока не могу отключить. Модуль прикручен к кнопке питания нетбука, а нетбук лежит на работе))
      P.S. Был еще забавный момент. Сегодня установил расширение для гугл хрома MQTT Leens. Нормально отработало несколько переключений. Закрыл его и забыл. Решил зайти в веб-интерфейс ESP. И во время загрузки случилось что-то непонятное. Нетбук выключился. Зашел в андроид MQTT клиент. А там мой ESP со скоростью несколько раз в секунду переключает контакт))) И такой треш продолжался несколько минут. Думал, хана нетбуку. Удаление MQTT Leens, выгрузка андоид-клиента из процессов не помогла. Проблема самоустранилась. Нетбук выжил. Думаю, было зависание ESP. Причина - неизвестна. Питание для нее берется с нетбука (3,3 вольта) pp.userapi.com/c841039/v841039619/34180/JC5YOxViOEo.jpg В общем, я тут задумался, а что если бы ESP управляла большой нагрузкой? Типа ТЭНа какого-нибудь)) Так и "умный" дом спалить можно, наверное.
      P.S.S. С другой стороны, как-то странно ESP зависла... Связь с MQTT брокером осталась ведь. Приколы публичных MQTT серверов? o_0

  • @АндрейКузнецов-э2п1ф

    Alex привет. Помоги прикрутить датчик SHT к ESP 8266, слежу за твоим каналом ты в этой теме как рыба в воде, и наверное для тебя это будет сущий пустяк. Или хотя бы подскажи где найти информацию.

    • @alexmorozov73
      @alexmorozov73  7 лет назад

      Информацию найти в интернете. Для меня много что пустяк, как раз пустяки меня совершенно не интересуют.
      В ino-файле поменять библиотеку на нужную.
      В определении класса изменить тип переменной датчика на нужный.
      В конструкторе класса вызвать нужный конструктор датчика с нужными параметрами.
      В методе setupExtra вызвать нужный метод класса датчика для его инициализации (если необходимо).
      В методе loopExtra поправить имена методов класса датчика.
      Остальное все менять не нужно.
      Если все описанное выше для Вас китайский язык - то не надо устраиваться на работу переводчиком с китайского. :)

    • @АндрейКузнецов-э2п1ф
      @АндрейКузнецов-э2п1ф 7 лет назад +1

      Спасибо за развернутый ответ. Не боги горшки обжигают, освоим и китайскую грамоту. Удачи Вам.

  • @VDen75
    @VDen75 7 лет назад

    Здравствуй, подскажи если не сложно как и где в скетче прописать по умолчанию свою точку доступа, к которой конектится устройство?

    • @alexmorozov73
      @alexmorozov73  7 лет назад

      Это самый старый фреймворк, его дальнейшие модификации легли в основу "умных реле", но суть не поменялась.
      Параметры хранятся в "EEPROM", изначально модуль стартует в режиме ТД с именем из константы defSSID и паролем из константы defPassword из файла ESPWeb.h, а уж подцепившись к нему, можно настроить имя и пароль своей ТД, выбрать режим инфраструктуры и перезагрузиться.
      Если хотите все изначально "испортить" под себя, то правьте функцию ESPWebBase::defaultConfig()

    • @VDen75
      @VDen75 7 лет назад

      ок, спасибо разобрался.

  • @SibMan54
    @SibMan54 7 лет назад

    Здравствуйте
    Я использую ваш проект Умного реле в связке с Cloudmqtt.com
    Есть такая проблемка - при изменении состояния реле через Web интерфейс или ИК пультом и последующем открытии мобильного MQTT клиента (MQTT Dash), последний невидит изменившегося состояния реле! (получается что MQTT клиент не читает топики которые были опубликованны в его отсутствие)
    Можно ли какнибудь это побороть?

    • @alexmorozov73
      @alexmorozov73  7 лет назад

      Обработчик MQTT поддерживает запрос текущего состояния передачей некорректного значения на вход (например "?"). Либо заставьте вашего клиента подать такой запрос, либо добавляйте в код скетча периодическую отсылку текущих статусов даже при отсутствии их изменения.

    • @SibMan54
      @SibMan54 7 лет назад

      Я убил кучу времени но так и не смог победить эту проблему!
      Что нужно прописать sub ? если pub выглядит так /TV_Rozetka/Relay/1
      и нужно-ли ставить галочку на Retained ?

    • @alexmorozov73
      @alexmorozov73  7 лет назад

      Код посмотреть не пробовали? Там все очевидно.
      Если реле включается /blablabla/Relay/1 подачей 1, то на команду /blablabla/Relay/1 с данными ? оно вернет 0 или 1.
      Что такое retained я вообще понятия не имею.

    • @VadimM1974
      @VadimM1974 7 лет назад

      В спецификации протокола MQTT нет понятия "запросить статус".
      Клиент может только "слушать" топик.
      И если состояние реле изменено в веб-интерфейсе, то прошивка должна продублировать состояние через MQTT.
      Как MQTT Dash должна иначе узнать о смене состояния, если в топик ничего не было послано при смене состояния?
      А Retained - это важная часть протокола MQTT. Если в топик было послана команда с этим флагом,
      то MQTT брокер сохранит это значение и каждый новый MQTT клиент получит это значение при подписке на топик.
      В общем, рекомендую немного почитать о протоколе MQTT, как он работает и как его используют в подобных системах.
      И незачем изобретать велосипед с командой "?", когда уже существует "retained" на уровне протокола.

    • @SibMan54
      @SibMan54 7 лет назад

      Это всё понятно, при изменении в веб-интерфейсе устройство отправляет и в mqtt, но если мобильный клиент не был в это время запущен, в последствии он не увидит это изменение. Как я понимаю флаг retained должно установить само устройство (умное реле) при отправке сообщения в mqtt, а это уже сложнее т.к. нужно вносить изменения в скетч!

  • @АндрейКузнецов-э2п1ф

    Alex в чем может быть проблема пытаюсь проверить твой код, без исправлений, хотел потом поменять на датчик sht10, выдает ошибку C:\Program Files (x86)\Arduino\libraries\ESP8266WebServer\src/ESP8266WebServer.h:27:22: fatal error: functional: No such file or directory
    #include
    Библиотека точно есть скачал с github.com/esp8266/Arduino и из с папки архива libraries, перенес в библиотеку Ардуины C:\Program Files (x86)\Arduino\libraries\ESP8266WebServer. Почему не видитэту библиотеку не пойму. версия дуины IDE 1.8.2

    • @alexmorozov73
      @alexmorozov73  7 лет назад

      А у Вас вообще установлена поддержка для ESP8266 в Arduino IDE? Судя по пути - нет, ибо она ставится в пользовательский каталог.

    • @АндрейКузнецов-э2п1ф
      @АндрейКузнецов-э2п1ф 7 лет назад

      Упс. пытался проверить на Promini ))))

  • @krepton85you
    @krepton85you 7 лет назад

    помогите разобраться с этой библиотекой pubsubclient - не подключается если параметры восстановлены из eeprom (правильно восстановлены!!), если статично прописать в скетче, то все отлично подключается.
    В общем вот мусор: yadi.sk/d/WfQwqs6O3F5KW8 конфигурируется он чере простенький вэб-интерфейс, через точку доступа "Wi-Fi_ESP8266Client" пароль к ей: "AP12345678" ip 192.168.4.1.
    В общем ни как у меня не выходит и с разными библиатеками pubsubclient пробовал.
    Кстати косяк (если создать с 10 - ок подписок то виснет на 4 подписке) с подписками в вашей знаменитой библиотеке я решил - оказывается нельзя за один цикл loop создавать все 10 подписок, нужно по одной подписке за один цикл loop иными словами подписаться на 10 топиков нужно только за 10 повторов цикла loop. Та жа проблема в др. библиотеке pubsubclient ( imroy.github.io/pubsubclient/namespaceMQTT.html ), но уже с исходящими сообщениями - на отправку одного сообщения исходящего уходит много времени где то 200 миСек и если отправлять с 10-ок за раз (один цикл loop) то создается не хилое преривание цикла loop :)

    • @alexmorozov73
      @alexmorozov73  7 лет назад

      Не может быть никакой разницы, восстановлены строковые переменные из EEPROM или присвоены непосредственно. И тут уж точно никакая библиотека виновна быть не может. У меня нет проблем с восстановленными из EEPROM значениями, другое дело, что я не таким варварским способом их сохраняю и восстанавливаю, например зачем целочисленный порт записывать как строку? :)
      А перегрузка библиотеки - это возможно, но тут уж ничего не поделать, лаги у нее и при нормальной работе имеются.
      Не подскажете, зачем setCallback делать не сразу, это же только на прием влияет. Правильнее уж тогда не гадить публикациями до момента окончания подписки на все топики.
      И когда я вижу, как глобальному указателю на с-строку тут же с помощью new распределяют память, да еще и константным значением - я понимаю, что я вообще ничего в таком коде не смогу понять. :)

    • @krepton85you
      @krepton85you 7 лет назад

      Да с setCallback это я игрался так :) это не важно. С портом да вы правы, но я уже перепробовал все комбинации - порт прописывал статично, а др. данные из eeprom и все равно ни как не подключается.

    • @krepton85you
      @krepton85you 7 лет назад

      Ух, ты по др. начал сохранять в EEPROM строки и о чюдо, все заработало:
      for (byte i = 0; i < mqtt_server_.length(); i++){
      EEPROM.write(404 + i, mqtt_server_.charAt(i));
      }
      EEPROM.commit();
      delay(10);
      Но как, я в шоке, столько времени потратил. :)
      Сейчас с др. либой попробую точно так же.

    • @alexmorozov73
      @alexmorozov73  7 лет назад

      А коммитить флеш несколько раз - это чтобы ее быстрее сжечь? Одного раза в конце достаточно. Это же перезапись целой страницы флеша каждый раз происходит.
      Эх, жаль комсомол помер... Им было бы чему поучиться... :)

    • @krepton85you
      @krepton85you 7 лет назад

      Alex Morozov да ладно, серьезно EEPROM.commit() перезаписывает всю флэш каждый раз как ее вызываешь?