как очистить ячейку (lsd1602)

Тема в разделе "Флудилка", создана пользователем dreadfull, 16 сен 2014.

  1. dreadfull

    dreadfull Гик

    вот у нас есть лсидишка, на неё выводим значение с датчика простой командой, значение изменяется на несколько порядков (допустим там от 0 до 1000 при этой занимая от 1 до 4 ячеек на лсд) и при уменьшении значения ячейка на экране не опустошается, а остается самое последнее значение. как это программно можно исправить???
     
  2. geher

    geher Гуру

    Вариант 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);
     
  3. dreadfull

    dreadfull Гик

    можно поподробней 3 вариант.
    п.с. я думал может есть какая-то команда типо "клирПринт";)
     
  4. geher

    geher Гуру

    Для очистки экрана есть clear, но это очистка всего экрана, в результате все перерисовывать, откуда моргание.

    sprintf - стандартная функция из стандартной библиотеки.
    Первым параметром идет char*. В него можно передать массив char достаточной длины (не меньше длины строки, которая должна в итоге получиться, плюс еще один символ сверху, для нуля, завершающего сишную строку) или переменную char*, которой выделена в нужном объеме память.
    Вторым параметром идет форматная строка, которая описывает, как надо выводить последующие параметры. В форматной строке каждому параметру из следующих за ней должна соответствовать конструкция начинающаяся с символа % и заканчивающаяся буквой. определяющей тип данных. Эта конструкция собственно и описывает правила вывода очередного параметра. Все остальное трактуется как текст, обрамляющий параметры.
    между символом % и буквой может быть много всего, влияющего на вывод, например, длина поля.
    В частности, %4d заставит вывести соответствующий параметр как целое число в поле шириной 4 символа с дополнением пробелами слева.
    Если надо выравнивать влево (пробелы справа), то %-4d.

    Все, что получается в результате преобразования "выводится" в строку, переданную как первый параметр (массив или указатель).
    Эту строку уже можно использовать дальше, например, загнать в lcd.print.

    Подробности тут:
    https://ru.wikipedia.org/wiki/Printf
    Там описана аналогичная функция, только выводящая в стандартную консоль (которой в ардуино не наблюдается), а не в строку, как sprintf.
    Потому там нет первого параметра.
    Но правила построения форматной строки совпадают.
     
    dreadfull нравится это.
  5. dreadfull

    dreadfull Гик

    итак, предложенные вами варианты я перепробывал, но результат остался одинаковым - "не нужные" клетки не очищались. я конечно понимаю, что я где-то неправильно прописал. вот как я делал.

    вариант 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. с командой "лсд клир принт". я не нашел у себя образца с такой командой
     
  6. ANV

    ANV Гуру

    В третьем варианте две лишних строчки кода. Можно написать sprintf(s,"T%4d",n);
     
  7. dreadfull

    dreadfull Гик

    лишних? интересно каких?
    и вообще-то хотелось услышать о явных ошибках, из-за которых не очищаются клетки...
     
  8. dreadfull

    dreadfull Гик

    так?
    Код (Text):
      int n = (currentTimeout1-(time4-startTime1));
      lcd.setCursor(0,1);
      char s[5];
      sprintf(s,"T%4d",n);
      lcd.print(s);
     
  9. ANV

    ANV Гуру

    Да, так. Только массив s надо сделать на один байт больше: знак Т + 4 цифры + признак окончания строки = 6 байт
     
  10. dreadfull

    dreadfull Гик

    ну, да. правильно.
    Код (Text):
      int n = (currentTimeout1-(time4-startTime1));
      lcd.setCursor(0,1);
      char s[6];
      sprintf(s,"T%4d",n);
      lcd.print(s);
     
  11. dreadfull

    dreadfull Гик

    ув. камрады!
    да что же делать с этими ячейками (клеточками)???
    уже и шаман вуду танцевал и темные силы призывал и с вангой советовался и в астрал трижды к джобсу уходил, а клетка как заговоренная (ну или как телка которая ломается и ей ни один довод не канает) нулик и пишет...:mad::mad::mad:
     
  12. Unixon

    Unixon Оракул Модератор

    Куда нулик пишет?
     
  13. dreadfull

    dreadfull Гик

    туда где должно быть пусто...
    ну это когда ситуация с обратным отчетом. допустим с 10 на 9, девятка у нас занимает первую клеточку, а во второй должна быть пустота, а вместо этого остается нулик от десятки....
     
    Последнее редактирование: 5 окт 2014
  14. RxdTxd

    RxdTxd Нуб

    Друзья, доброго времени суток. Тоже остается лишний "0" , когда идёт обратный отсчёт. Получается 12-11-10-90-80-70-60-50...и т.д. Кто как поборол проблему?
     
  15. RxdTxd

    RxdTxd Нуб

    Вот такое решение своего вопроса я нашел случайно в примерах скетчей для LCD:
    Код (C++):
    lcd.setCursor (0, 2); // куда угодно ставим курсор
    lcd.print("PWM: "); // Выводим на экран надпись PWM (=ШИМ)
    lcd.print(fadeValue); // После неё выводим актульное значение ШИМ от 0 до 255
    lcd.print("  "); // и самое важное - пробел! И ячейка с лишним нулём более не активна