LCD1602 мигание текста

Подскажите пожалуйста, как избавиться от delay() в моем коде. Нужно чтобы мерцали 2 сегмента на дисплее, нажал кнопку и эти сегменты начали мерцать чтобы выделить это значение для изменения вручную.
if (ekran == 3 && metka3 == 2)
{
lcd.setCursor(14, 1);
lcd.print(obduv_off);
if (millis() - timer >= 500)
{
lcd.setCursor(14, 1);
lcd.print(" ");
timer = millis();
delay(100);
}
}

Для начала научится искать информацию, а потом внимательно изучать!

1 лайк

Очевидно, что бы получить мигание текста, нужно его половину времени выводить, а вторую половину времени выводить на месте этого текста “ничего”

Все секретные технологии раpболтал :frowning:

Так там в самом дисплее вроде и мигание и инверсия есть, но это ж читать надоть.

1 лайк

И никто не обратил внимание что в 1602 нет сегментов)))

Если вы про lcd.blink(), то разве он умеет мигать одним символом?
А инверсию я вообще не нашёл. Где это?

Емнип, там мигает курсор

Именно.
Причём курсор, который совсем не курсор (в виде “чёрточки”), а целое знакоместо.
Уродство, одним словом.
А ТС-у нужно мигать символом.
Собственно, эту задачу он решил, за исключением того, что испытывает сильный личный неприязнь к delay. :slight_smile:
Ну и оговорился с “сегментами”.
На что некоторые не преминули съязвить, хотя и прекрасно поняли, про что речь.

P.S. У себя я “мигаю” вот так (без delay).

if ((millis() / 500) & 1) 
{
 lcd.print("ERR");
} else {
 lcd.print("   ");
}
1 лайк

На графических :slightly_smiling_face: На символьных тоже не нашёл. Отложился в памяти какой то аппарат, но, походу, там был как раз графический в формфакторе1602.

Хрена-се!

Вы, надеюсь, понимаете, что Вы выводите информацию на экран ПРИ КАЖДОМ проходе loop?

1 лайк

Ещё и деление на 500 не комильфо.

А где Вы увидели loop? :wink:
Это всего лишь кусочек кода “мигалки”.
Естественно, этот код находится внутри условия. Типа так

if (err)
{
 lcd.setCursor(0,7);
 if ((millis() / 500) & 1) 
 {
  lcd.print("ERR");
 } else {
  lcd.print("   ");
 }
}

И вообще, эта “мигалка” у меня находится в подпрограмме вывода на дисплей,
которая, в свою очередь, вызывается из loop по таймингу, либо при выходе из меню.

Так-что, совсем НЕ хрена-се! :wink:

Интересно, почему?

Но деление всё равно лишнее. Не проще флагом работать?

В смысле почему? Туева хуча тактов впустую.
Если извращаться, то можно проверять нулевой бит второго байта миллиса, что даст 2 Гц.

1 лайк

Нуууу… Если честно, то это не мой код. Я его спи…копировал из скетча синтезатора для трансивера.
Кстати, у автора было деление не на 500, а на 700. Я уже не помню, чем мне 700 не понравилось.
Возможно, медленно мигало.

Тогда это ниюха не мигалка ибо мигать её или застыть в каком-то положении, зависит от err.

В любом случае, оно не должно выводить когда ничего не поменялось. Впрочем, это не моё дело. Если Вы считаете, что знаете, что делаете, то и флаг Вам в руки!

Мне предстоит в своей библиотечке внедрять мигание. Будет функция куда передавать координаты начала и кол-во знаков подлежащих миганию. Внутри запускаем таймер на запись-стирание нужной области в видеопамять.
Либо можно ещё внедрить функционал непосредственно в блок отображения(что лучше, так как не нужен лишний таймер и мигающая область не стирается из видеопамяти). При очередном “прогоне” при отображении, просто пишем пробел в нужную область.

От застывания на “ERR”, ничего не мешает добавить “затиралку”

if (err)
{
 lcd.setCursor(0,7);
 if ((millis() / 500) & 1) 
 {
  lcd.print("ERR");
 } else {
  lcd.print("   ");
 }
} else {
 lcd.setCursor(0,7);
 lcd.print("   ");
}

Вообщем, рабочее решение задачи ТС-а я предложил, ну а дальше уж как хотитЁ.
Кстати… Критикуя - предлагай! Неча бубенцами впустую звенеть! :wink:

Ну, я же Вам уже сказал:

ставьте затиралки или ещё чего-нибудь, мне без разницы.

если заменить первую строку на if (millis() & 512) то вычисление условия будет в несколько сотен раз быстрее (частота мигания изменится на 2%). Ну где и как расположить - отдельный вопрос.