Esp8266 + max7219+mqtt =вывод длинной строки

Тема в разделе "ESP8266, ESP32", создана пользователем yden, 12 окт 2018.

  1. yden

    yden Гик

    Здравствуйте.
    Подскажите пожалуйста. Свой дом. Есть есп node mcu, дисплей max7219. Эта связка работает в качестве информера - выводит время и текстовую строку. Код взят на просторах сети, немного модифицирован. Строка сбрасывается на есп посредством mqtt. С это строкой проблема. Если строка длинная, больше 25 символов, то есп через пару минут начинает тупить и теряет связь с mqtt. Уменьшаешь количество символов до <25 - есп нормально работает. Может в коде какая ошибка?
    https://pastebin.com/rPNpUnFy

    благодарю
     
  2. DIYMan

    DIYMan Guest

    С памятью вольно работаете:
    Код (C++):
    if (String(topic) == "ihouse/gadget/informerIn")
    Зачем создавать копию строки в памяти, если есть strcmp?

    Вместо этого:
    Код (C++):


    str = "";
    for (int i = 0; i < length; i++)
       {
        str = str + (char)payload[i];
       }

     
    лучше, как минимум, такое:
    Код (C++):
       str = "";
       str.reserve(length+1);
        for (int i = 0; i < length; i++)
        {
          str += (char)payload[i];
        }
    Зачем имя клиента в String:
    Код (C++):
    String clientId = "informerIn";
        clientId += String(random(0xffff), HEX);
        if (client.connect(clientId.c_str(), mqtt_user, mqtt_pass))
    Если можно сразу:
    Код (C++):

        clientId += String(random(0xffff), HEX);
        if (client.connect( "informerIn", mqtt_user, mqtt_pass))
    Дичь:
    Код (C++):
    matrix.drawChar(14, y, (String(":"))[0], HIGH, LOW, 1);
    Что мешает написать так:
    Код (C++):
    matrix.drawChar(14, y, ':', HIGH, LOW, 1);
    Копирование по значению:
    Код (C++):
    void DisplayText(String text) {
    Надо, как минимум, так:
    Код (C++):
    void DisplayText(String& text) {
    Дальше не смотрел, там подобных нежданчиков - хватает. По работе с оперативкой - откровенный бардак. Надо вдумчиво править ;)
     
    yden нравится это.
  3. SergeiL

    SergeiL Оракул Модератор

    Похоже это то, о чем я писал здесь.
    Пока у Вас бежит строка по экрану, Вы не выходите из цикла вывода строки в loop().
    Соответственно, не отдается управление в обработчики других процессов. Например в client.loop();
    Чем длиннее строка тем дольше не отдается управление.
    По хорошему нужно убирать delay(), и делать вывод без блокировки остальных процессов.
    Если у Вас отваливается MQTT, попробуйте вставить client.loop(); в функцию ScrollText() после matrix.write(); Посмотрите, что будет с длинными строками.
     
    Последнее редактирование: 9 ноя 2018
    yden нравится это.