Правильный ли получился код для устранения мерцания lcd 1602?

Nubas_
Offline
Зарегистрирован: 19.07.2021
void loop() {
  if ((millis()-lastouttime)>500)
  {
  	lcd.clear();
        lastouttime=millis();
  }else {
  lcd.print(millis());//вывод текста
  }}

Чтобы очищать экран использую clear(), но из-за него появляются мерцания. И чтобы не мерцало решил использовать delay и проблема решилась, но она задерживает код и из-за этого решил использовать millis(), но правильно ли я "перевел" код(который снизу)?

"Перевел" этот код под millis()

void loop() {
  lcd.clear();
  lcd.setCursor(7, 0);
  lcd.print(millis());//вывод текста
  delay(500);
  }

 

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

А ты clear убери и буит те щасье)))

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Nubas_ пишет:

но правильно ли я "перевел" код(который снизу)?>

Нет, неправильно. В момент срабатывания миллис у тебя очищается экран, все остальное время у тебя выводятся данные на экран при каждой итерации loop()

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Чтобы не мерцало - не нужно его очищать, лучше перерисовывай. К примеру, я если нужно очистить экран в каком-то участке - зарисовываю его пробелами. Может и не правильно, но работает и отлично работает!))

Kakmyc
Offline
Зарегистрирован: 15.01.2018

А мне просто интересно нафига вообще в каждом цикле что то на экран выводить ?
Раз в 200мс выводишь и хватит, вполне наглядно и комфортно

Green
Offline
Зарегистрирован: 01.10.2015

Бестолку ничего не выводишь - выводишь только при изменении инфо для вывода на экран.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Green пишет:

Бестолку ничего не выводишь - выводишь только при изменении инфо для вывода на экран.

Так себе подход, иногда меняется значение очень часто.

Green
Offline
Зарегистрирован: 01.10.2015

Если цифири бегут при измерении, тогда да, выводишь с нераздражающим глаз периодом, 500 мс, например.

Pyotr
Offline
Зарегистрирован: 12.03.2014

Можно примерно так

byte i = lcd.print(val);
for(; i < TOT_CHAR_LCD; i++){ lcd.print(' ');} //остальную часть заполняем пробелами

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Господа, вы бредите?

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

В итоге - считаю, что экран стоит обновлять при появлении новых данных и прошествии одной секунды.

Nubas_
Offline
Зарегистрирован: 19.07.2021

v258 пишет:

Nubas_ пишет:

но правильно ли я "перевел" код(который снизу)?>

Нет, неправильно. В момент срабатывания миллис у тебя очищается экран, все остальное время у тебя выводятся данные на экран при каждой итерации loop()

Написал этот код и обновляется каждые 0,5с. Можно ли как-то упростить этот код? Или есть ли какие-то ошибки?

printed = false;
void loop() {
  if ((millis()-lastouttime)>500)
  {
    if(printed == true) printed = false;
    if(printed == false) lcd.clear();

    lcd.setCursor(7, 0);
    lcd.print(millis());
    printed = true;

    lastouttime = millis();
  }}

 

Nubas_
Offline
Зарегистрирован: 19.07.2021

Nubas_ пишет:

v258 пишет:

Nubas_ пишет:

но правильно ли я "перевел" код(который снизу)?>

Нет, неправильно. В момент срабатывания миллис у тебя очищается экран, все остальное время у тебя выводятся данные на экран при каждой итерации loop()

Написал этот код, проверил и теперь информация обновляется каждые 0,5с как и надо было. Можно ли как-то упростить этот код? Или есть ли какие-то ошибки?

printed = false;
void loop() {
  if ((millis()-lastouttime)>500)
  {
    if(printed == true) printed = false;
    if(printed == false) lcd.clear();

    lcd.setCursor(7, 0);
    lcd.print(millis());
    printed = true;

    lastouttime = millis();
  }}

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Nubas_ пишет:

 Или есть ли какие-то ошибки?

Возможно есть. Если надо выдавать данные раз в пол-секунды, то нет. Но если по получению новых данных и 0,5 секунд - то да.

Nubas_
Offline
Зарегистрирован: 19.07.2021
printed = false;
void loop() {
  if ((millis()-lastouttime)>500)
  {
    lcd.clear();

    lcd.setCursor(7, 0);
    lcd.print(millis());

    lastouttime = millis();
  }}

Вот так правильнее. А то зачем-то придумал переменную printed

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Короче так:

printed = false;
void loop() {
  if (((millis()-lastouttime)>500) && boolean izmenenieDannyh)
  {
    if(printed == true) printed = false;
    if(printed == false) lcd.clear();

    lcd.setCursor(7, 0);
    lcd.print(millis());
    printed = true;

    lastouttime = millis();
  }}

 

Nubas_
Offline
Зарегистрирован: 19.07.2021

mykaida пишет:

Nubas_ пишет:

 Или есть ли какие-то ошибки?

Возможно есть. Если надо выдавать данные раз в пол-секунды, то нет. Но если по получению новых данных и 0,5 секунд - то да.

Вроде все правильно работает

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Nubas_ пишет:

Вроде все правильно работает

Конечно! Обновление экрана идёт раз в 0,5 секунд. Но возникает вопрос - а зачем обновлять экран, если ничего не изменилось?

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

Kakmyc
Offline
Зарегистрирован: 15.01.2018

objName.clear(); по своей сути крайне бесполезная функция.
Мы же в любой момент времени знаем, что нам нужно видеть на экране .
Зачем его очищать в ноль, если можно просто вывести в нужное место нужные нам данные ?
Это конечно может быть сложным для понимания, когда не имеешь понятия о том, как работает дисплей.
На этот случай на трубе есть видео , где чувак без всяких микроконтроллеров управляет дисплеем при помощи набора тумблеров .

Nubas_
Offline
Зарегистрирован: 19.07.2021

mykaida пишет:

Nubas_ пишет:

Вроде все правильно работает

Конечно! Обновление экрана идёт раз в 0,5 секунд. Но возникает вопрос - а зачем обновлять экран, если ничего не изменилось?

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

Если долго так будет работать, то с дисплеем может что-то случиться?

Nubas_
Offline
Зарегистрирован: 19.07.2021

Kakmyc пишет:
objName.clear(); по своей сути крайне бесполезная функция. Мы же в любой момент времени знаем, что нам нужно видеть на экране . Зачем его очищать в ноль, если можно просто вывести в нужное место нужные нам данные ? Это конечно может быть сложным для понимания, когда не имеешь понятия о том, как работает дисплей. На этот случай на трубе есть видео , где чувак без всяких микроконтроллеров управляет дисплеем при помощи набора тумблеров .

У меня почти на всем экране все почти меняется. Поэтому, мне кажется, лучше clear использовать в моем случае

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

Если меняется почти все, то это все и следует накрыть сверху новой инфой. Clear и Home - самые долгие операции для HD44780.

Nubas_
Offline
Зарегистрирован: 19.07.2021

sadman41 пишет:
Если меняется почти все, то это все и следует накрыть сверху новой инфой. Clear и Home - самые долгие операции для HD44780.

Просто может вдруг случиться так, что будет значение 1000, а потом 50, то будет показываться 50000, поэтому, очищаю

Kakmyc
Offline
Зарегистрирован: 15.01.2018

У меня в проектах обычно используются массивы:
topRow[17];
bottomRow[17];//при работе с кириллицей [33]

Если нужно измененить информацию на экране поднимаю флаг : lcdUpdate=1;
В каждом цикле идёт проверка флага и если он поднят то вызывается функция в которой выводятся обе строки.
Во всех местах , где должна меняется информация на дисплее в массив забиваются нужные сейчас значения и поднимается флаг.

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

Nubas_ пишет:

sadman41 пишет:
Если меняется почти все, то это все и следует накрыть сверху новой инфой. Clear и Home - самые долгие операции для HD44780.

Просто может вдруг случиться так, что будет значение 1000, а потом 50, то будет показываться 50000, поэтому, очищаю


Для этого у нас есть snprintf со всякими бешеными опциями форматирования.

Nubas_
Offline
Зарегистрирован: 19.07.2021

sadman41 пишет:
Nubas_ пишет:

sadman41 пишет:
Если меняется почти все, то это все и следует накрыть сверху новой инфой. Clear и Home - самые долгие операции для HD44780.

Просто может вдруг случиться так, что будет значение 1000, а потом 50, то будет показываться 50000, поэтому, очищаю

Для этого у нас есть snprintf со всякими бешеными опциями форматирования.

Спасибо

Nubas_
Offline
Зарегистрирован: 19.07.2021

Kakmyc пишет:
У меня в проектах обычно используются массивы: topRow[17]; bottomRow[17];//при работе с кириллицей [33] Если нужно измененить информацию на экране поднимаю флаг : lcdUpdate=1; В каждом цикле идёт проверка флага и если он поднят то вызывается функция в которой выводятся обе строки. Во всех местах , где должна меняется информация на дисплее в массив забиваются нужные сейчас значения и поднимается флаг.

Спасибо

Nubas_
Offline
Зарегистрирован: 19.07.2021

Остальным тоже спасибо

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Nubas_ пишет:

Если долго так будет работать, то с дисплеем может что-то случиться?

Да, в принципе, ничего. Выгорит (поскольку Вы не отключаете подсветку).

А так - нужу по стариковски. Привык, что чем меньше данных гоняешь, тем меньше ошибки.

Профессиональный перекос, однако.