Здравствуйте. Подскажите пожалуйста. Свой дом. Есть есп node mcu, дисплей max7219. Эта связка работает в качестве информера - выводит время и текстовую строку. Код взят на просторах сети, немного модифицирован. Строка сбрасывается на есп посредством mqtt. С это строкой проблема. Если строка длинная, больше 25 символов, то есп через пару минут начинает тупить и теряет связь с mqtt. Уменьшаешь количество символов до <25 - есп нормально работает. Может в коде какая ошибка? https://pastebin.com/rPNpUnFy благодарю
С памятью вольно работаете: Код (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) { Дальше не смотрел, там подобных нежданчиков - хватает. По работе с оперативкой - откровенный бардак. Надо вдумчиво править
Похоже это то, о чем я писал здесь. Пока у Вас бежит строка по экрану, Вы не выходите из цикла вывода строки в loop(). Соответственно, не отдается управление в обработчики других процессов. Например в client.loop(); Чем длиннее строка тем дольше не отдается управление. По хорошему нужно убирать delay(), и делать вывод без блокировки остальных процессов. Если у Вас отваливается MQTT, попробуйте вставить client.loop(); в функцию ScrollText() после matrix.write(); Посмотрите, что будет с длинными строками.