вот у нас есть лсидишка, на неё выводим значение с датчика простой командой, значение изменяется на несколько порядков (допустим там от 0 до 1000 при этой занимая от 1 до 4 ячеек на лсд) и при уменьшении значения ячейка на экране не опустошается, а остается самое последнее значение. как это программно можно исправить???
Вариант 1 - перед выводом числа выводить туда же строку из четырех пробелов. Вариант 2 - в зависимости от порядка числа выводить после или перед числом нужное количество пробелов. что-то вроде Код (Text): lcd.setCursor(x,y); if (n<1000) lcd.print(" "); if (n<100) lcd.print(" "); if (n<10) lcd.print(" "); lcd print(n); Вариант 3 - формировать строку через sprintf Код (Text): char s[5]; sprintf(s,"%4d",n);
Для очистки экрана есть clear, но это очистка всего экрана, в результате все перерисовывать, откуда моргание. sprintf - стандартная функция из стандартной библиотеки. Первым параметром идет char*. В него можно передать массив char достаточной длины (не меньше длины строки, которая должна в итоге получиться, плюс еще один символ сверху, для нуля, завершающего сишную строку) или переменную char*, которой выделена в нужном объеме память. Вторым параметром идет форматная строка, которая описывает, как надо выводить последующие параметры. В форматной строке каждому параметру из следующих за ней должна соответствовать конструкция начинающаяся с символа % и заканчивающаяся буквой. определяющей тип данных. Эта конструкция собственно и описывает правила вывода очередного параметра. Все остальное трактуется как текст, обрамляющий параметры. между символом % и буквой может быть много всего, влияющего на вывод, например, длина поля. В частности, %4d заставит вывести соответствующий параметр как целое число в поле шириной 4 символа с дополнением пробелами слева. Если надо выравнивать влево (пробелы справа), то %-4d. Все, что получается в результате преобразования "выводится" в строку, переданную как первый параметр (массив или указатель). Эту строку уже можно использовать дальше, например, загнать в lcd.print. Подробности тут: https://ru.wikipedia.org/wiki/Printf Там описана аналогичная функция, только выводящая в стандартную консоль (которой в ардуино не наблюдается), а не в строку, как sprintf. Потому там нет первого параметра. Но правила построения форматной строки совпадают.
итак, предложенные вами варианты я перепробывал, но результат остался одинаковым - "не нужные" клетки не очищались. я конечно понимаю, что я где-то неправильно прописал. вот как я делал. вариант 1. было изначально так: Код (Text): lcd.setCursor(0,1); lcd.print("T"); lcd.setCursor(1,1); lcd.print(currentTimeout1-(time4-startTime1)); я так понял что, после "Т" надо поставить 4 пробела Код (Text): lcd.setCursor(0,1); lcd.print("T "); lcd.setCursor(1,1); lcd.print(currentTimeout1-(time4-startTime1)); вариант 2. Код (Text): int n = (currentTimeout1-(time4-startTime1)); lcd.setCursor(0,1); lcd.print("T"); lcd.setCursor(1,1); if (n<1000) lcd.print(" "); if (n<100) lcd.print(" "); if (n<10) lcd.print(" "); lcd print(n); вариант 3. очень детально расписан и я так понял сразу готов к употреблению). в конце в "lcd.print( )" мы ж ведь впечатываем уже "s"??? Код (Text): int n = (currentTimeout1-(time4-startTime1)); lcd.setCursor(0,1); lcd.print("T"); char s[5]; sprintf(s,"%4d",n); lcd.setCursor(1,1); lcd.print(s); вариант 4. с командой "лсд клир принт". я не нашел у себя образца с такой командой
лишних? интересно каких? и вообще-то хотелось услышать о явных ошибках, из-за которых не очищаются клетки...
так? Код (Text): int n = (currentTimeout1-(time4-startTime1)); lcd.setCursor(0,1); char s[5]; sprintf(s,"T%4d",n); lcd.print(s);
Да, так. Только массив s надо сделать на один байт больше: знак Т + 4 цифры + признак окончания строки = 6 байт
ну, да. правильно. Код (Text): int n = (currentTimeout1-(time4-startTime1)); lcd.setCursor(0,1); char s[6]; sprintf(s,"T%4d",n); lcd.print(s);
ув. камрады! да что же делать с этими ячейками (клеточками)??? уже и шаман вуду танцевал и темные силы призывал и с вангой советовался и в астрал трижды к джобсу уходил, а клетка как заговоренная (ну или как телка которая ломается и ей ни один довод не канает) нулик и пишет...
туда где должно быть пусто... ну это когда ситуация с обратным отчетом. допустим с 10 на 9, девятка у нас занимает первую клеточку, а во второй должна быть пустота, а вместо этого остается нулик от десятки....
Друзья, доброго времени суток. Тоже остается лишний "0" , когда идёт обратный отсчёт. Получается 12-11-10-90-80-70-60-50...и т.д. Кто как поборол проблему?
Вот такое решение своего вопроса я нашел случайно в примерах скетчей для LCD: Код (C++): lcd.setCursor (0, 2); // куда угодно ставим курсор lcd.print("PWM: "); // Выводим на экран надпись PWM (=ШИМ) lcd.print(fadeValue); // После неё выводим актульное значение ШИМ от 0 до 255 lcd.print(" "); // и самое важное - пробел! И ячейка с лишним нулём более не активна