Страница 1 из 1

Зависание программы с дисплеем

Добавлено: 30 июн 2026, 12:09
YelleSwarm
Приветствую, уважаемые.
Составил программу с выводом на дисплей 1602 через I2C но она через некоторое время зависает. Arduino nano. Занято 47% памяти.
Screenshot_2.png
А1 и А0 термисторы. Через нелинейное масштабирование переводится в градусы цельсия (там минимальное количество точек, с шагом 5 градусов), сравнивается с установленной настройкой, если температура выше установленной, включается вывод Д4 через таймеры задержки. (фрагмент программы в самом верху считывает датчик холла через Д2, чтобы при наличии вращения также включать выход Д4).
На дисплей выводится статичный текст для обозначения величин, текущая температура с двух датчиков, установленная настройкой температура сработки и состояние температурного триггера (вкл/выкл). Все работает как нужно, но заметил что спустя несколько часов программа зависает. Добавил символы >< <> со сменой раз в 500 мс через свич для индикации работы программы (обведено красным), стало зависать еще быстрее.

Нейросеть говорит что проблема в типе Стринг, который фрагментирует память. А его тут много именно из-за дисплеев. Уже думаю избавиться от дисплея полностью, установить пару диодных индикаторов на вкл/выкл и убрать нелинейное масштабирование, чтобы контроллер работал напрямую со значениями с датчика. Надежность тут нужна прежде всего. Но крайне не хотелось бы, потому что это костыль, проблема с дисплеем у меня останется, и никогда не использовать его вообще - неприятная перспектива. Ну, и в данном устройстве мониторинг температуры был бы очень желателен. Это контроллер вентилятора пылезащищенного шкафа. По датчику холла - при включении кулера установленного оборудования и по температуре в шкафу при его пассивном охлаждении.

Что вы можете мне посоветовать?

Re: Зависание программы с дисплеем

Добавлено: 30 июн 2026, 14:26
Student
Попробуйте добавить в программу генератор с триггером Ftrig и подключить все выводы EN ваших дисплеев к этому триггеру, так у вас разгрузится микроконтроллер от бесконечной передачи данных. Задайте необходимый интервал обновления в свойствах генервтора. И что конкретно зависает? Микроконтроллер перестает выполнять комманды, или контроллер выполняет код, но не меняются показания на дисплее?

Re: Зависание программы с дисплеем

Добавлено: 30 июн 2026, 14:35
WildCat
Рекомендую прочитать это

viewtopic.php?t=7583

Re: Зависание программы с дисплеем

Добавлено: 30 июн 2026, 16:58
YelleSwarm
Student писал(а): 30 июн 2026, 14:26 Попробуйте добавить в программу генератор с триггером Ftrig и подключить все выводы EN ваших дисплеев к этому триггеру, так у вас разгрузится микроконтроллер от бесконечной передачи данных. Задайте необходимый интервал обновления в свойствах генервтора. И что конкретно зависает? Микроконтроллер перестает выполнять комманды, или контроллер выполняет код, но не меняются показания на дисплее?
Зависает именно программа. Я это вижу по исполнительному устройству - вентилятору. Один раз он "завис" во включенном состоянии, также "зависал" в выключенном, когда и температура и датчик холла должны были его запустить. Дисплей при этом был статичен и отображал последние полученные данные.
Попробую сделать как вы говорите. Но опять-таки, это может отсрочить зависание, а нужно его полностью избежать.
Спасибо за подсказку, я так понял, что весь статичный текст можно также одним импульсом вывести при запуске программы.
Также не понимаю, можно ли в дисплеях с константами одним блоком определить весь текст на строчку, используя пробелы там, где должны быть пропущены места для вывода данных, и упростило бы ли это обработку этого текста контроллеру.
Кроме того, задавался вопросом как замедлить опрос датчиков, но так и не разобрался. Раз в несколько секунд было бы достаточно, но даже по дисплею видно мерцание цифр, то есть он опрашивается очень быстро и обновление на дисплей происходит очень быстро. Но ни то ни другое не требуется.

Re: Зависание программы с дисплеем

Добавлено: 30 июн 2026, 17:49
WildCat
Периодический опрос датчиков:

[аналоговый вход] — (переменная)

Далее на поле выносится переменная, в настройках ставится галка «вход разрешения записи»
На вход импульсы от генератора с нужной периодичностью через rtrig.

Re: Зависание программы с дисплеем

Добавлено: 30 июн 2026, 19:15
Student
По всей видимости зависает сам контроллер и манипуляции с кодом здесь могут не сработать. При постоянной прередаче данных на LCD действительно наблюдаются большие тормоза, но контроллер от этого не виснет. Здесь может быть фактор помех от коммутации каких либо устройств, к примеру если есть реле которое с какой то периодичностью включается и в обвязке катушки нет диода от обратного эдс, с большой долей вероятности это может быть причиной зависания, или же коммутируется индуктивная нагрузка без каких либо цепей защиты от эдс. Если поправки кода не принесут должного результата попробуйте потестить своё устройство в (холостую) без подключенных исполнительных механизмов и реле, если зависаниий не будет, обратите внимание на цепи управления и коммутации.

Re: Зависание программы с дисплеем

Добавлено: 30 июн 2026, 19:33
Student
Можно задействовать сторожевой таймер, в FLprog я так понимаю сторожевой таймер активируется в пункте "защита от зависания"
. Суть этого таймера в том что он ведёт отсчёт независимо от исполнения кода и при каждом новом цикле его значения каждый раз обнуляются. Когда происходит зависание, код не выполняется и счётчик перестаёт обнуляться. По истечении времени по переполнению значений счётчика происходит перезагрузка микроконтроллера. Но есть и недостатки у такого метода. Если в коде ведутся какие либо рассчёты, они начнутся заново. Это может решить вашу проблему даже при наличии помех, но стоит учитывать тот фактор что контроллер каждый раз будет перезагружен. Мне эту функцию не приходилось использовать, могу в чём то ошибаться.

Re: Зависание программы с дисплеем

Добавлено: 30 июн 2026, 20:36
ecoins
Student писал(а): 30 июн 2026, 19:33 Можно задействовать сторожевой таймер, в FLprog я так понимаю сторожевой таймер активируется в пункте "защита от зависания"
. Суть этого таймера в том что он ведёт отсчёт независимо от исполнения кода и при каждом новом цикле его значения каждый раз обнуляются. Когда происходит зависание, код не выполняется и счётчик перестаёт обнуляться. По истечении времени по переполнению значений счётчика происходит перезагрузка микроконтроллера. Но есть и недостатки у такого метода. Если в коде ведутся какие либо рассчёты, они начнутся заново. Это может решить вашу проблему даже при наличии помех, но стоит учитывать тот фактор что контроллер каждый раз будет перезагружен. Мне эту функцию не приходилось использовать, могу в чём то ошибаться.
Перейдите на другой контроллер (ESP,RP2040) - в новых версиях FLProg тормозить будет LCD. Также доступны графические дисплеи. Дисплеи OLED 128x64 i2c работают быстрее чем LCD 16x2 i2c.

Re: Зависание программы с дисплеем

Добавлено: 30 июн 2026, 20:38
YelleSwarm
Student писал(а): 30 июн 2026, 19:15 По всей видимости зависает сам контроллер и манипуляции с кодом здесь могут не сработать.
Программу и устройство я "наращивал" постепенно. Сначала был только датчик холла. Управляемый вентилятор, питание, коммутации и всё остальное было то же самое, что и сейчас, никаких проблем и зависаний не было. Через какое-то время я решил, что было бы хорошо добавить туда еще и контроль по температуре с выводом значений для наглядности. Вот тут и начались проблемы.

Долго думал, склоняюсь все-таки сейчас убрать дисплей и лишние преобразования. Оставить контрольную температуру зашитой неизменно в виде ADC. Светодиод на индикацию включения по температуре и моргающий диод для индикации работы программы. В будущем, если проблема все-таки окажется в Стринг данных, то может быть добавлю отдельный контроллер, чтобы уже он переводил ADC в градусы и выводил на дисплей.

Вотчдог в целом подходит. Данное устройство можно перезапускать сколько угодно, главное чтобы было обеспечено выполнение функции. Но лучше бы внешний, не привязанный к этому камню вообще, для надежности. Просто таймер с отключением питания контроллера на несколько секунд раз в пару часов.

Спасибо за ваше время и ответы. Почерпнул для себя полезного.

Re: Зависание программы с дисплеем

Добавлено: 02 июл 2026, 12:51
Di1000
Была похожая проблема, где то даже ее тут описывал!
ESP 8266. Проект правда значительно больше вашего будет.
Из периферии... два датчика DS18b20, плата расширения портов по I2C, 5 электромагнитных клапанов, плюс MQTT. Плата абсолютно хаотично перезагружалась, чего только в коде не менял, один черт перезагрузки и подвисания платы.
Вот тот же самый проект со всей обвязкой залил в ESP 32 и все, как бабка отшептала, все уже месяц работает стабильно, ни одной перезагрузки и подвисания!

Re: Зависание программы с дисплеем

Добавлено: 02 июл 2026, 14:55
YelleSwarm
По итогу... Почти ничего не менял в том направлении, на которое грешил сначала. Добавил две переменные для входов А1 и А0, разрешил запись только через каждые 2 секунды. С этих переменных уже считывается нелинейное преобразование и всё остальное дальше по цепи. Индикация работы программы выведена отдельно на моргающий светодиод чтобы дисплей "не нагружать". Вторые сутки без зависаний. Дальше буду посмотреть...

Все равно не нравится конструкция (несимметричный мультивибратор) - (Р триггер) - (разрешение записи).
Выглядит как костыль. Учитывая, что нужна пауза между считываниями в 2 сек, с длиной импульса в 1 цикл, делать включение выхода генератора на 200 мс (как установлено у меня), чтобы обеспечить включение Р триггера, - определённо лишние операции. Но блока, который объединит это, то есть сделает включение на 1 цикл через установленную паузу, - нету.



Сглазил. Как только отписался сюда - сразу зависло. После кнопки ресет зависло опять очень быстро. После кратковременного отключения питания - чуть подольше но опять зависло. Отключил питание на 15 секунд - работает пока. Видимо, замедление считывания просто отсрочило фрагментацию памяти. Буду все-таки пытаться убирать дисплей и все преобразования из программы до голых функций считал - сравнил - включил.

Re: Зависание программы с дисплеем

Добавлено: 02 июл 2026, 15:03
WildCat
YelleSwarm писал(а): 02 июл 2026, 14:55 Но блока, который объединит это, то есть сделает включение на 1 цикл через установленную паузу, - нету.
Есть.
ПБ tick от Анатолия (Phaz)
Его можно найти в примерах использования передачи данных по UDP. Поиском по форуму найдите.

Re: Зависание программы с дисплеем

Добавлено: 02 июл 2026, 15:45
Student
Вот простой пример генератора с r триггером он создаёт импульс в 1 цикл программы. Можете переменную EN привязывать к любым блокам своей программы.
Rtrig.flp

Re: Зависание программы с дисплеем

Добавлено: 02 июл 2026, 16:01
Student
У вас программа маленькая, я думаю нет особого смысла городить агарод с опросом аналоговых входов, достаточно будет ограничиться дисплеем. Там действительно будет видна разница с ртриггером. Период можно сделать 250ms. Это достаточно для LCD1602.

Re: Зависание программы с дисплеем

Добавлено: 02 июл 2026, 16:04
Student
Если есть недопонимания как реализовать, выложите программу, постараюсь отредактировать и добавить нужные блоки.

Re: Зависание программы с дисплеем

Добавлено: 02 июл 2026, 17:29
KulibinOrsk
Форум умирает... не был тут 3 года, как началась "перестройка" форума и вот сейчас вижу что на порядок меньше кругооборота мозгов.
По вашей проблеме с I2C - это старая проблема именно I2C.
Что могу посоветовать:
- подтяните линии I2C резисторами 1-3 кОм к + питания
- проверьте пульсации питания
- сделайте на дисплее рыбу, и обновляйте только изменяющиеся переменные, статику не трогайте - уменьшите обьем передаваймой инфы.
- сделайте вывод на дисплей раз в 5 сек. ну или на сколько не критично.

Re: Зависание программы с дисплеем

Добавлено: 02 июл 2026, 17:53
YelleSwarm
Student писал(а): 02 июл 2026, 16:01 У вас программа маленькая, я думаю нет особого смысла городить агарод с опросом аналоговых входов, достаточно будет ограничиться дисплеем. Там действительно будет видна разница с ртриггером. Период можно сделать 250ms. Это достаточно для LCD1602.
В блоке дисплея EN не просто отправляет данные на дисплей. Я пробовал ставить туда таймеры и разовые включения, текст просто исчезает если EN не получает сигнала. А если сигнал получает, то обмен идет мгновенный и постоянный. Убедился я в этом когда попробовал поставить пробелы между статичным текстом вместо добавления отдельного блока на каждый такой текст. Получил в итоге мерцание чисел там, где находятся пробелы. То есть постоянно идет "борьба", обновляется и пробел и выводимые данные. В отличие от зависания, когда программа перестает работать, дисплей явно просто сам по себе отображает последние данные.
Да, не понимаю как реализовать то, что вы говорите. Не понимаю как ограничить скорость обмена с дисплеем и сохранение на нем статичных данных до следующего обновления. Существующие блоки дисплея и скрипты в них постоянно дергают линию обмена даже если данные не меняются. Вот бы оно работало по принципу "электронных чернил", один раз отправил и оно там висит, пока не обновил, контроллеру было бы проще.

Re: Зависание программы с дисплеем

Добавлено: 02 июл 2026, 18:05
YelleSwarm
KulibinOrsk писал(а): 02 июл 2026, 17:29 Форум умирает... не был тут 3 года, как началась "перестройка" форума и вот сейчас вижу что на порядок меньше кругооборота мозгов.
По вашей проблеме с I2C - это старая проблема именно I2C.
Что могу посоветовать:
- подтяните линии I2C резисторами 1-3 кОм к + питания
- проверьте пульсации питания
- сделайте на дисплее рыбу, и обновляйте только изменяющиеся переменные, статику не трогайте - уменьшите обьем передаваймой инфы.
- сделайте вывод на дисплей раз в 5 сек. ну или на сколько не критично.
Л2Ц имеет обратную связь и влияет на работу всей программы? Ведь зависает всё полностью. В предыдущем ответе другому человеку написал, что не понимаю как ограничить скорость обмена с дисплеем, потому что даже статичный текст постоянно обновляется. Питание от аккумулятора - линейный понижающий 27-12В с фильтрующими конденсаторами - линейный понижающий 12-5В на плате ардуино. Ну и двое суток работает без проблем в не меняющихся условиях. Думаю проблема не в питании.

Re: Зависание программы с дисплеем

Добавлено: 02 июл 2026, 18:07
Student
А можно на прогу поглядеть?

Re: Зависание программы с дисплеем

Добавлено: 02 июл 2026, 18:10
YelleSwarm
Student писал(а): 02 июл 2026, 18:07 А можно на прогу поглядеть?
Fan.flp