Delay в библиотеке liquidcrystal_i2c.h. Есть ли альтернативы?

m.yakovenko
Offline
Зарегистрирован: 02.08.2020

   Доброго времени суток, прошу мнения знатоков, совета.
Есть устройство - измеряет температуру и давление в колбе, реализована обратная связь, т.е. поддерживает заданные величины (давление - шаговым двигателем, температуру вторым шаговым двигателем). Весь код без библиотек, только loop и прерывания по таймеру. Всё реализовано на Arduino Mega.
   Сейчас стоит задача:  выводить текущие данные с датчиков на 1602 к примеру, три "страницы" листать кнопками: на 1-ой текущие значения °С и p, на второй указывать значение для корректировки давления, на третьей для температуры. 

Ознакомившись с библиотекой liquidcrystal_i2c.h немного растерялся, ведь при вызове lcd.clear, home, и многих других используется delay, при том еще и немаленькая. Если кто-то готов дать совет - прошу исходить из того, что delay использовать в регулируемых мною процессах просто недопустимо, возможно есть альтернативы всё же?
 

Вопрос: как выводить данные на дисплей 1602 по шине I2c избавившись от delay?

И вопрос номер два: вот была эта библиотека написана, и работа периферии (дисплея) ДОЛЖНА подвешивать МК на какое-то время, не иначе. Честно, в голове не укладывается, не могу понять.  

m.yakovenko
Offline
Зарегистрирован: 02.08.2020

Вот, пытаюсь разобраться, забыл в вопросе упомянуть что i2c собственно и некритично использовать, для того Mega и была взята. Но тут вижу тоже есть delay

sadman41
Offline
Зарегистрирован: 19.10.2016

Есть задачи, где эти дилеи не страшны, поэтому библиотека вполне себе жизнеспособна. Если же избегать тяжёлых операций типа clear(), то 90% потребностей простого ардуинщика ею удовлетворяются.

BOOM
BOOM аватар
Онлайн
Зарегистрирован: 14.11.2018

Вместо clear забиваю дисплей пробелами, не знаю на сколько это правильно, но делеев нет при этом способе)))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

m.yakovenko, вот Вы обратили внимание на наличие delay(), а ничего, что эта библиотека выводит один символ 2.9 мс? Другими словами, просто вывод двух строк по 16 символов займет более 100 мс.

Вам надо не пугаться delay(), а сформулировать четкие критерии: какие задержки для Вас допустимы (любой код создает задержки), а какие - нет. И, исходя из этих критериев либо писать/подбирать софт, либо подбирать "железо", ибо нет никаких гарантий, что использование первого попавшегося дисплея позволит удовлетворить требования сформулированных критериев.

m.yakovenko
Offline
Зарегистрирован: 02.08.2020

Я с вами полностью, всецело согласен. А вы согласны ли с тезисом: LCD это периферия, работа с которой почему-то должна подвешивать процессор управляющего им устройства и это де-факто признаётся как норма?
Вот я не delay-диссидент, а просто не понимаю.

"выводит один символ 2.9 мс" - пусть себе выводит, зачем процессор тормозить-то, а не прекращать обмен данными с памятью дисплея на это время?

Собственно, выход я уже нашёл: 150 рублей. Ардуино Нано с LCD и кнопками в роли slave, моя Mega как мастер. 

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

m.yakovenko
Offline
Зарегистрирован: 02.08.2020

"выводит один символ 2.9 мс" - пусть себе выводит, зачем процессор тормозить-то, а не прекращать обмен данными с памятью дисплея на это время?
Прошу не придираться к словам - надеюсь смысл понятен, что после вызова lcd.clear можно делать что-то полезное, а не стоять на месте. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Типичное замешивает мух в котлеты.

Никто не мешает написать отличную библиотеку, которая по таймеру кольцевой буфер выплёвывает в дисплей. Но для любительских нужд это не требуется. Если у вас рилтайм устройство - не используйте liquidcrystal, рисуйте код сами.

b707
Offline
Зарегистрирован: 26.05.2017

m.yakovenko пишет:

  Ознакомившись с библиотекой liquidcrystal_i2c.h немного растерялся, ведь при вызове lcd.clear, home, и многих других используется delay, при том еще и немаленькая.

какая "немаленькая задержка"? 2 миллисекунды? Вы серьезно?

 Вам уже выше сказали - вывод любой строчки на этот дисплей займет у вас как минимум на порядок дольше. И все это время ваша система точно так же "не будет делать ничего полезного". в том числе не будет реагировать на сигналы датчиков.

Если у вас столь критичнывй процесс, почему задержка в 30-50мс на время вывода строчки вас не трогает, а задержка 2мс на очистку дисплея - вдруг так важна?

По-моему вы просто не понимаете, о чем говорите. Вам кажется. что во время вывода данных на экран контроллер продолжает следить за вашим процессом. а во время задержки - он "тормозит". На самом деле разницы между командой вывода символа и командой очистки дисплея нет никакой - и там и там контроллер засыпает и тупо ждет 2-3 мс

-NMi-
Offline
Зарегистрирован: 20.08.2018

m.yakovenko пишет:

"выводит один символ 2.9 мс" - пусть себе выводит, зачем процессор тормозить-то, а не прекращать обмен данными с памятью дисплея на это время?

Правильно, зачем тормозить процессор. Рисуем собственную библиотеку, которая ничего не выводит в шину и2с а аккуратно складывает байты для вывода в буфер. После формирования ВСЕГО буфера даём "отмашку" в виде флага и уходим из процедуры. Другая процедура, которая синхронизирована с таймером (например раз в 1 секунду) "смотрит" на флаг "отмашки" и если есть оба события (флаг + таймер) запускает третью процедуру, которая СПОКОЙНО байт за байтом выводит на АППАРАТНОМ уровне через вектор_TWI весь буфер на шину и2с. Всё будет без ДЕЛЕЕВ и на аппаратном уровне, время ПРОЦЕССОРА не будет затрачено ВООБЩЕ. Есть и подводные камни у этого метода, но куда-ж без них, зато БЕЗ делеев! )))

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

m.yakovenko пишет:
Если кто-то готов дать совет - прошу исходить из того, что delay использовать в регулируемых мною процессах просто недопустимо, возможно есть альтернативы всё же?

 

Вариант №1 (для джедаев) - работать с экраном без этой библы. Ну, тоесть, написать свою со всеми пирогами.

 

Вариант №2 простой, для лентяев. Использовать ДВЕ ардуины, соединенные любым простым способом, например по UART. Одной снимать показания и быстро выпинывать их во вторую. Вторая без всякой спешки работает со штатной библиотекой экрана. Если вместо второй ардуины взять ESP, то еще и на телефончик можно будет передавать 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

m.yakovenko пишет:

"выводит один символ 2.9 мс" - пусть себе выводит, зачем процессор тормозить-то, а не прекращать обмен данными с памятью дисплея на это время?

Ну так а кто будет выводить? Вот процессор и выводит. Все 2.9 мс. Можно сделать, чтобы выводил быстрее? Конечно можно! Можно, чтобы на порядок быстрее? Тоже можно. Вопрос, стоит ли этим заниматься? Ответ - стоит, если это решит Ваши проблемы. Мои, например, решились: http://arduino.ru/forum/apparatnye-voprosy/medlennaya-rabota-liquidcrystali2c А решит ли Ваши, я не знаю, конкретных цифр Вы не приводите.

Цитата:

Прошу не придираться к словам - надеюсь смысл понятен, что после вызова lcd.clear можно делать что-то полезное, а не стоять на месте. 

Смысл как раз непонятен: я ни разу не использовал lcd.clear, объясните смысл этого действия.