Зависание программы с дисплеем
-
YelleSwarm
- Рядовой
- Сообщения: 12
- Зарегистрирован: 15 окт 2024, 22:29
- Имя: Yelle
- Благодарил (а): 5 раз
Зависание программы с дисплеем
Приветствую, уважаемые.
Составил программу с выводом на дисплей 1602 через I2C но она через некоторое время зависает. Arduino nano. Занято 47% памяти.
А1 и А0 термисторы. Через нелинейное масштабирование переводится в градусы цельсия (там минимальное количество точек, с шагом 5 градусов), сравнивается с установленной настройкой, если температура выше установленной, включается вывод Д4 через таймеры задержки. (фрагмент программы в самом верху считывает датчик холла через Д2, чтобы при наличии вращения также включать выход Д4).
На дисплей выводится статичный текст для обозначения величин, текущая температура с двух датчиков, установленная настройкой температура сработки и состояние температурного триггера (вкл/выкл). Все работает как нужно, но заметил что спустя несколько часов программа зависает. Добавил символы >< <> со сменой раз в 500 мс через свич для индикации работы программы (обведено красным), стало зависать еще быстрее.
Нейросеть говорит что проблема в типе Стринг, который фрагментирует память. А его тут много именно из-за дисплеев. Уже думаю избавиться от дисплея полностью, установить пару диодных индикаторов на вкл/выкл и убрать нелинейное масштабирование, чтобы контроллер работал напрямую со значениями с датчика. Надежность тут нужна прежде всего. Но крайне не хотелось бы, потому что это костыль, проблема с дисплеем у меня останется, и никогда не использовать его вообще - неприятная перспектива. Ну, и в данном устройстве мониторинг температуры был бы очень желателен. Это контроллер вентилятора пылезащищенного шкафа. По датчику холла - при включении кулера установленного оборудования и по температуре в шкафу при его пассивном охлаждении.
Что вы можете мне посоветовать?
Составил программу с выводом на дисплей 1602 через I2C но она через некоторое время зависает. Arduino nano. Занято 47% памяти.
А1 и А0 термисторы. Через нелинейное масштабирование переводится в градусы цельсия (там минимальное количество точек, с шагом 5 градусов), сравнивается с установленной настройкой, если температура выше установленной, включается вывод Д4 через таймеры задержки. (фрагмент программы в самом верху считывает датчик холла через Д2, чтобы при наличии вращения также включать выход Д4).
На дисплей выводится статичный текст для обозначения величин, текущая температура с двух датчиков, установленная настройкой температура сработки и состояние температурного триггера (вкл/выкл). Все работает как нужно, но заметил что спустя несколько часов программа зависает. Добавил символы >< <> со сменой раз в 500 мс через свич для индикации работы программы (обведено красным), стало зависать еще быстрее.
Нейросеть говорит что проблема в типе Стринг, который фрагментирует память. А его тут много именно из-за дисплеев. Уже думаю избавиться от дисплея полностью, установить пару диодных индикаторов на вкл/выкл и убрать нелинейное масштабирование, чтобы контроллер работал напрямую со значениями с датчика. Надежность тут нужна прежде всего. Но крайне не хотелось бы, потому что это костыль, проблема с дисплеем у меня останется, и никогда не использовать его вообще - неприятная перспектива. Ну, и в данном устройстве мониторинг температуры был бы очень желателен. Это контроллер вентилятора пылезащищенного шкафа. По датчику холла - при включении кулера установленного оборудования и по температуре в шкафу при его пассивном охлаждении.
Что вы можете мне посоветовать?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Student
- Рядовой
- Сообщения: 31
- Зарегистрирован: 30 май 2026, 10:11
- Имя: Иван
- Благодарил (а): 4 раза
- Поблагодарили: 11 раз
Re: Зависание программы с дисплеем
Попробуйте добавить в программу генератор с триггером Ftrig и подключить все выводы EN ваших дисплеев к этому триггеру, так у вас разгрузится микроконтроллер от бесконечной передачи данных. Задайте необходимый интервал обновления в свойствах генервтора. И что конкретно зависает? Микроконтроллер перестает выполнять комманды, или контроллер выполняет код, но не меняются показания на дисплее?
-
YelleSwarm
- Рядовой
- Сообщения: 12
- Зарегистрирован: 15 окт 2024, 22:29
- Имя: Yelle
- Благодарил (а): 5 раз
Re: Зависание программы с дисплеем
Зависает именно программа. Я это вижу по исполнительному устройству - вентилятору. Один раз он "завис" во включенном состоянии, также "зависал" в выключенном, когда и температура и датчик холла должны были его запустить. Дисплей при этом был статичен и отображал последние полученные данные.Student писал(а): 30 июн 2026, 14:26 Попробуйте добавить в программу генератор с триггером Ftrig и подключить все выводы EN ваших дисплеев к этому триггеру, так у вас разгрузится микроконтроллер от бесконечной передачи данных. Задайте необходимый интервал обновления в свойствах генервтора. И что конкретно зависает? Микроконтроллер перестает выполнять комманды, или контроллер выполняет код, но не меняются показания на дисплее?
Попробую сделать как вы говорите. Но опять-таки, это может отсрочить зависание, а нужно его полностью избежать.
Спасибо за подсказку, я так понял, что весь статичный текст можно также одним импульсом вывести при запуске программы.
Также не понимаю, можно ли в дисплеях с константами одним блоком определить весь текст на строчку, используя пробелы там, где должны быть пропущены места для вывода данных, и упростило бы ли это обработку этого текста контроллеру.
Кроме того, задавался вопросом как замедлить опрос датчиков, но так и не разобрался. Раз в несколько секунд было бы достаточно, но даже по дисплею видно мерцание цифр, то есть он опрашивается очень быстро и обновление на дисплей происходит очень быстро. Но ни то ни другое не требуется.
-
WildCat
- Лейтенант
- Сообщения: 610
- Зарегистрирован: 04 июн 2022, 04:14
- Имя: Михаил
- Благодарил (а): 26 раз
- Поблагодарили: 44 раза
Re: Зависание программы с дисплеем
Периодический опрос датчиков:
[аналоговый вход] — (переменная)
Далее на поле выносится переменная, в настройках ставится галка «вход разрешения записи»
На вход импульсы от генератора с нужной периодичностью через rtrig.
[аналоговый вход] — (переменная)
Далее на поле выносится переменная, в настройках ставится галка «вход разрешения записи»
На вход импульсы от генератора с нужной периодичностью через rtrig.
- Student
- Рядовой
- Сообщения: 31
- Зарегистрирован: 30 май 2026, 10:11
- Имя: Иван
- Благодарил (а): 4 раза
- Поблагодарили: 11 раз
Re: Зависание программы с дисплеем
По всей видимости зависает сам контроллер и манипуляции с кодом здесь могут не сработать. При постоянной прередаче данных на LCD действительно наблюдаются большие тормоза, но контроллер от этого не виснет. Здесь может быть фактор помех от коммутации каких либо устройств, к примеру если есть реле которое с какой то периодичностью включается и в обвязке катушки нет диода от обратного эдс, с большой долей вероятности это может быть причиной зависания, или же коммутируется индуктивная нагрузка без каких либо цепей защиты от эдс. Если поправки кода не принесут должного результата попробуйте потестить своё устройство в (холостую) без подключенных исполнительных механизмов и реле, если зависаниий не будет, обратите внимание на цепи управления и коммутации.
- Student
- Рядовой
- Сообщения: 31
- Зарегистрирован: 30 май 2026, 10:11
- Имя: Иван
- Благодарил (а): 4 раза
- Поблагодарили: 11 раз
Re: Зависание программы с дисплеем
Можно задействовать сторожевой таймер, в FLprog я так понимаю сторожевой таймер активируется в пункте "защита от зависания"
. Суть этого таймера в том что он ведёт отсчёт независимо от исполнения кода и при каждом новом цикле его значения каждый раз обнуляются. Когда происходит зависание, код не выполняется и счётчик перестаёт обнуляться. По истечении времени по переполнению значений счётчика происходит перезагрузка микроконтроллера. Но есть и недостатки у такого метода. Если в коде ведутся какие либо рассчёты, они начнутся заново. Это может решить вашу проблему даже при наличии помех, но стоит учитывать тот фактор что контроллер каждый раз будет перезагружен. Мне эту функцию не приходилось использовать, могу в чём то ошибаться.
. Суть этого таймера в том что он ведёт отсчёт независимо от исполнения кода и при каждом новом цикле его значения каждый раз обнуляются. Когда происходит зависание, код не выполняется и счётчик перестаёт обнуляться. По истечении времени по переполнению значений счётчика происходит перезагрузка микроконтроллера. Но есть и недостатки у такого метода. Если в коде ведутся какие либо рассчёты, они начнутся заново. Это может решить вашу проблему даже при наличии помех, но стоит учитывать тот фактор что контроллер каждый раз будет перезагружен. Мне эту функцию не приходилось использовать, могу в чём то ошибаться.
-
ecoins
- Администратор
- Сообщения: 4487
- Зарегистрирован: 12 фев 2016, 11:40
- Откуда: Шатура
- Имя: Энвер
- Благодарил (а): 224 раза
- Поблагодарили: 368 раз
Re: Зависание программы с дисплеем
Перейдите на другой контроллер (ESP,RP2040) - в новых версиях FLProg тормозить будет LCD. Также доступны графические дисплеи. Дисплеи OLED 128x64 i2c работают быстрее чем LCD 16x2 i2c.Student писал(а): 30 июн 2026, 19:33 Можно задействовать сторожевой таймер, в FLprog я так понимаю сторожевой таймер активируется в пункте "защита от зависания"
. Суть этого таймера в том что он ведёт отсчёт независимо от исполнения кода и при каждом новом цикле его значения каждый раз обнуляются. Когда происходит зависание, код не выполняется и счётчик перестаёт обнуляться. По истечении времени по переполнению значений счётчика происходит перезагрузка микроконтроллера. Но есть и недостатки у такого метода. Если в коде ведутся какие либо рассчёты, они начнутся заново. Это может решить вашу проблему даже при наличии помех, но стоит учитывать тот фактор что контроллер каждый раз будет перезагружен. Мне эту функцию не приходилось использовать, могу в чём то ошибаться.
-
YelleSwarm
- Рядовой
- Сообщения: 12
- Зарегистрирован: 15 окт 2024, 22:29
- Имя: Yelle
- Благодарил (а): 5 раз
Re: Зависание программы с дисплеем
Программу и устройство я "наращивал" постепенно. Сначала был только датчик холла. Управляемый вентилятор, питание, коммутации и всё остальное было то же самое, что и сейчас, никаких проблем и зависаний не было. Через какое-то время я решил, что было бы хорошо добавить туда еще и контроль по температуре с выводом значений для наглядности. Вот тут и начались проблемы.Student писал(а): 30 июн 2026, 19:15 По всей видимости зависает сам контроллер и манипуляции с кодом здесь могут не сработать.
Долго думал, склоняюсь все-таки сейчас убрать дисплей и лишние преобразования. Оставить контрольную температуру зашитой неизменно в виде ADC. Светодиод на индикацию включения по температуре и моргающий диод для индикации работы программы. В будущем, если проблема все-таки окажется в Стринг данных, то может быть добавлю отдельный контроллер, чтобы уже он переводил ADC в градусы и выводил на дисплей.
Вотчдог в целом подходит. Данное устройство можно перезапускать сколько угодно, главное чтобы было обеспечено выполнение функции. Но лучше бы внешний, не привязанный к этому камню вообще, для надежности. Просто таймер с отключением питания контроллера на несколько секунд раз в пару часов.
Спасибо за ваше время и ответы. Почерпнул для себя полезного.
-
Di1000
- Рядовой
- Сообщения: 58
- Зарегистрирован: 21 окт 2023, 17:16
- Имя: Дмитрий
- Благодарил (а): 18 раз
- Поблагодарили: 2 раза
Re: Зависание программы с дисплеем
Была похожая проблема, где то даже ее тут описывал!
ESP 8266. Проект правда значительно больше вашего будет.
Из периферии... два датчика DS18b20, плата расширения портов по I2C, 5 электромагнитных клапанов, плюс MQTT. Плата абсолютно хаотично перезагружалась, чего только в коде не менял, один черт перезагрузки и подвисания платы.
Вот тот же самый проект со всей обвязкой залил в ESP 32 и все, как бабка отшептала, все уже месяц работает стабильно, ни одной перезагрузки и подвисания!
ESP 8266. Проект правда значительно больше вашего будет.
Из периферии... два датчика DS18b20, плата расширения портов по I2C, 5 электромагнитных клапанов, плюс MQTT. Плата абсолютно хаотично перезагружалась, чего только в коде не менял, один черт перезагрузки и подвисания платы.
Вот тот же самый проект со всей обвязкой залил в ESP 32 и все, как бабка отшептала, все уже месяц работает стабильно, ни одной перезагрузки и подвисания!
-
YelleSwarm
- Рядовой
- Сообщения: 12
- Зарегистрирован: 15 окт 2024, 22:29
- Имя: Yelle
- Благодарил (а): 5 раз
Re: Зависание программы с дисплеем
По итогу... Почти ничего не менял в том направлении, на которое грешил сначала. Добавил две переменные для входов А1 и А0, разрешил запись только через каждые 2 секунды. С этих переменных уже считывается нелинейное преобразование и всё остальное дальше по цепи. Индикация работы программы выведена отдельно на моргающий светодиод чтобы дисплей "не нагружать". Вторые сутки без зависаний. Дальше буду посмотреть...
Все равно не нравится конструкция (несимметричный мультивибратор) - (Р триггер) - (разрешение записи).
Выглядит как костыль. Учитывая, что нужна пауза между считываниями в 2 сек, с длиной импульса в 1 цикл, делать включение выхода генератора на 200 мс (как установлено у меня), чтобы обеспечить включение Р триггера, - определённо лишние операции. Но блока, который объединит это, то есть сделает включение на 1 цикл через установленную паузу, - нету.
Сглазил. Как только отписался сюда - сразу зависло. После кнопки ресет зависло опять очень быстро. После кратковременного отключения питания - чуть подольше но опять зависло. Отключил питание на 15 секунд - работает пока. Видимо, замедление считывания просто отсрочило фрагментацию памяти. Буду все-таки пытаться убирать дисплей и все преобразования из программы до голых функций считал - сравнил - включил.
Все равно не нравится конструкция (несимметричный мультивибратор) - (Р триггер) - (разрешение записи).
Выглядит как костыль. Учитывая, что нужна пауза между считываниями в 2 сек, с длиной импульса в 1 цикл, делать включение выхода генератора на 200 мс (как установлено у меня), чтобы обеспечить включение Р триггера, - определённо лишние операции. Но блока, который объединит это, то есть сделает включение на 1 цикл через установленную паузу, - нету.
Сглазил. Как только отписался сюда - сразу зависло. После кнопки ресет зависло опять очень быстро. После кратковременного отключения питания - чуть подольше но опять зависло. Отключил питание на 15 секунд - работает пока. Видимо, замедление считывания просто отсрочило фрагментацию памяти. Буду все-таки пытаться убирать дисплей и все преобразования из программы до голых функций считал - сравнил - включил.
Последний раз редактировалось YelleSwarm 02 июл 2026, 16:00, всего редактировалось 1 раз.
-
WildCat
- Лейтенант
- Сообщения: 610
- Зарегистрирован: 04 июн 2022, 04:14
- Имя: Михаил
- Благодарил (а): 26 раз
- Поблагодарили: 44 раза
Re: Зависание программы с дисплеем
Есть.YelleSwarm писал(а): 02 июл 2026, 14:55 Но блока, который объединит это, то есть сделает включение на 1 цикл через установленную паузу, - нету.
ПБ tick от Анатолия (Phaz)
Его можно найти в примерах использования передачи данных по UDP. Поиском по форуму найдите.
- Student
- Рядовой
- Сообщения: 31
- Зарегистрирован: 30 май 2026, 10:11
- Имя: Иван
- Благодарил (а): 4 раза
- Поблагодарили: 11 раз
Re: Зависание программы с дисплеем
Вот простой пример генератора с r триггером он создаёт импульс в 1 цикл программы. Можете переменную EN привязывать к любым блокам своей программы.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Student
- Рядовой
- Сообщения: 31
- Зарегистрирован: 30 май 2026, 10:11
- Имя: Иван
- Благодарил (а): 4 раза
- Поблагодарили: 11 раз
Re: Зависание программы с дисплеем
У вас программа маленькая, я думаю нет особого смысла городить агарод с опросом аналоговых входов, достаточно будет ограничиться дисплеем. Там действительно будет видна разница с ртриггером. Период можно сделать 250ms. Это достаточно для LCD1602.
- Student
- Рядовой
- Сообщения: 31
- Зарегистрирован: 30 май 2026, 10:11
- Имя: Иван
- Благодарил (а): 4 раза
- Поблагодарили: 11 раз
Re: Зависание программы с дисплеем
Если есть недопонимания как реализовать, выложите программу, постараюсь отредактировать и добавить нужные блоки.
-
KulibinOrsk
- Лейтенант
- Сообщения: 520
- Зарегистрирован: 25 фев 2018, 08:48
- Откуда: Оренбург
- Имя: Александр
- Поблагодарили: 1 раз
Re: Зависание программы с дисплеем
Форум умирает... не был тут 3 года, как началась "перестройка" форума и вот сейчас вижу что на порядок меньше кругооборота мозгов.
По вашей проблеме с I2C - это старая проблема именно I2C.
Что могу посоветовать:
- подтяните линии I2C резисторами 1-3 кОм к + питания
- проверьте пульсации питания
- сделайте на дисплее рыбу, и обновляйте только изменяющиеся переменные, статику не трогайте - уменьшите обьем передаваймой инфы.
- сделайте вывод на дисплей раз в 5 сек. ну или на сколько не критично.
По вашей проблеме с I2C - это старая проблема именно I2C.
Что могу посоветовать:
- подтяните линии I2C резисторами 1-3 кОм к + питания
- проверьте пульсации питания
- сделайте на дисплее рыбу, и обновляйте только изменяющиеся переменные, статику не трогайте - уменьшите обьем передаваймой инфы.
- сделайте вывод на дисплей раз в 5 сек. ну или на сколько не критично.
-
YelleSwarm
- Рядовой
- Сообщения: 12
- Зарегистрирован: 15 окт 2024, 22:29
- Имя: Yelle
- Благодарил (а): 5 раз
Re: Зависание программы с дисплеем
В блоке дисплея EN не просто отправляет данные на дисплей. Я пробовал ставить туда таймеры и разовые включения, текст просто исчезает если EN не получает сигнала. А если сигнал получает, то обмен идет мгновенный и постоянный. Убедился я в этом когда попробовал поставить пробелы между статичным текстом вместо добавления отдельного блока на каждый такой текст. Получил в итоге мерцание чисел там, где находятся пробелы. То есть постоянно идет "борьба", обновляется и пробел и выводимые данные. В отличие от зависания, когда программа перестает работать, дисплей явно просто сам по себе отображает последние данные.Student писал(а): 02 июл 2026, 16:01 У вас программа маленькая, я думаю нет особого смысла городить агарод с опросом аналоговых входов, достаточно будет ограничиться дисплеем. Там действительно будет видна разница с ртриггером. Период можно сделать 250ms. Это достаточно для LCD1602.
Да, не понимаю как реализовать то, что вы говорите. Не понимаю как ограничить скорость обмена с дисплеем и сохранение на нем статичных данных до следующего обновления. Существующие блоки дисплея и скрипты в них постоянно дергают линию обмена даже если данные не меняются. Вот бы оно работало по принципу "электронных чернил", один раз отправил и оно там висит, пока не обновил, контроллеру было бы проще.
Последний раз редактировалось YelleSwarm 02 июл 2026, 18:09, всего редактировалось 1 раз.
-
YelleSwarm
- Рядовой
- Сообщения: 12
- Зарегистрирован: 15 окт 2024, 22:29
- Имя: Yelle
- Благодарил (а): 5 раз
Re: Зависание программы с дисплеем
Л2Ц имеет обратную связь и влияет на работу всей программы? Ведь зависает всё полностью. В предыдущем ответе другому человеку написал, что не понимаю как ограничить скорость обмена с дисплеем, потому что даже статичный текст постоянно обновляется. Питание от аккумулятора - линейный понижающий 27-12В с фильтрующими конденсаторами - линейный понижающий 12-5В на плате ардуино. Ну и двое суток работает без проблем в не меняющихся условиях. Думаю проблема не в питании.KulibinOrsk писал(а): 02 июл 2026, 17:29 Форум умирает... не был тут 3 года, как началась "перестройка" форума и вот сейчас вижу что на порядок меньше кругооборота мозгов.
По вашей проблеме с I2C - это старая проблема именно I2C.
Что могу посоветовать:
- подтяните линии I2C резисторами 1-3 кОм к + питания
- проверьте пульсации питания
- сделайте на дисплее рыбу, и обновляйте только изменяющиеся переменные, статику не трогайте - уменьшите обьем передаваймой инфы.
- сделайте вывод на дисплей раз в 5 сек. ну или на сколько не критично.
-
YelleSwarm
- Рядовой
- Сообщения: 12
- Зарегистрирован: 15 окт 2024, 22:29
- Имя: Yelle
- Благодарил (а): 5 раз
Re: Зависание программы с дисплеем
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость