Правильный ли получился код для устранения мерцания lcd 1602?
- Войдите на сайт для отправки комментариев
Чт, 11/11/2021 - 21:22
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);
}
А ты clear убери и буит те щасье)))
но правильно ли я "перевел" код(который снизу)?>
Нет, неправильно. В момент срабатывания миллис у тебя очищается экран, все остальное время у тебя выводятся данные на экран при каждой итерации loop()
Чтобы не мерцало - не нужно его очищать, лучше перерисовывай. К примеру, я если нужно очистить экран в каком-то участке - зарисовываю его пробелами. Может и не правильно, но работает и отлично работает!))
А мне просто интересно нафига вообще в каждом цикле что то на экран выводить ?
Раз в 200мс выводишь и хватит, вполне наглядно и комфортно
Бестолку ничего не выводишь - выводишь только при изменении инфо для вывода на экран.
Бестолку ничего не выводишь - выводишь только при изменении инфо для вывода на экран.
Так себе подход, иногда меняется значение очень часто.
Если цифири бегут при измерении, тогда да, выводишь с нераздражающим глаз периодом, 500 мс, например.
Можно примерно так
byte i = lcd.print(val); for(; i < TOT_CHAR_LCD; i++){ lcd.print(' ');} //остальную часть заполняем пробеламиГоспода, вы бредите?
Выдавайте переменную только когда она изменилась. Если нужна большая скорость, чем скорость обновления экрана, то возьмите другой экран. (Хотя нахера - непонятно. Всё равно оттуда ничего считать будет нельзя)
В итоге - считаю, что экран стоит обновлять при появлении новых данных и прошествии одной секунды.
но правильно ли я "перевел" код(который снизу)?>
Нет, неправильно. В момент срабатывания миллис у тебя очищается экран, все остальное время у тебя выводятся данные на экран при каждой итерации 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(); }}но правильно ли я "перевел" код(который снизу)?>
Нет, неправильно. В момент срабатывания миллис у тебя очищается экран, все остальное время у тебя выводятся данные на экран при каждой итерации 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(); }}Или есть ли какие-то ошибки?
Возможно есть. Если надо выдавать данные раз в пол-секунды, то нет. Но если по получению новых данных и 0,5 секунд - то да.
printed = false; void loop() { if ((millis()-lastouttime)>500) { lcd.clear(); lcd.setCursor(7, 0); lcd.print(millis()); lastouttime = millis(); }}Вот так правильнее. А то зачем-то придумал переменную printed
Короче так:
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(); }}Или есть ли какие-то ошибки?
Возможно есть. Если надо выдавать данные раз в пол-секунды, то нет. Но если по получению новых данных и 0,5 секунд - то да.
Вроде все правильно работает
Вроде все правильно работает
Конечно! Обновление экрана идёт раз в 0,5 секунд. Но возникает вопрос - а зачем обновлять экран, если ничего не изменилось?
Возможно для Вас это не принципиально, но представьте ситуацию очень долгого работы аппарата.
objName.clear(); по своей сути крайне бесполезная функция.
Мы же в любой момент времени знаем, что нам нужно видеть на экране .
Зачем его очищать в ноль, если можно просто вывести в нужное место нужные нам данные ?
Это конечно может быть сложным для понимания, когда не имеешь понятия о том, как работает дисплей.
На этот случай на трубе есть видео , где чувак без всяких микроконтроллеров управляет дисплеем при помощи набора тумблеров .
Вроде все правильно работает
Конечно! Обновление экрана идёт раз в 0,5 секунд. Но возникает вопрос - а зачем обновлять экран, если ничего не изменилось?
Возможно для Вас это не принципиально, но представьте ситуацию очень долгого работы аппарата.
Если долго так будет работать, то с дисплеем может что-то случиться?
У меня почти на всем экране все почти меняется. Поэтому, мне кажется, лучше clear использовать в моем случае
Если меняется почти все, то это все и следует накрыть сверху новой инфой. Clear и Home - самые долгие операции для HD44780.
Просто может вдруг случиться так, что будет значение 1000, а потом 50, то будет показываться 50000, поэтому, очищаю
У меня в проектах обычно используются массивы:
topRow[17];
bottomRow[17];//при работе с кириллицей [33]
Если нужно измененить информацию на экране поднимаю флаг : lcdUpdate=1;
В каждом цикле идёт проверка флага и если он поднят то вызывается функция в которой выводятся обе строки.
Во всех местах , где должна меняется информация на дисплее в массив забиваются нужные сейчас значения и поднимается флаг.
Просто может вдруг случиться так, что будет значение 1000, а потом 50, то будет показываться 50000, поэтому, очищаю
Для этого у нас есть snprintf со всякими бешеными опциями форматирования.
Просто может вдруг случиться так, что будет значение 1000, а потом 50, то будет показываться 50000, поэтому, очищаю
Спасибо
Спасибо
Остальным тоже спасибо
Если долго так будет работать, то с дисплеем может что-то случиться?
Да, в принципе, ничего. Выгорит (поскольку Вы не отключаете подсветку).
А так - нужу по стариковски. Привык, что чем меньше данных гоняешь, тем меньше ошибки.
Профессиональный перекос, однако.