Oled дисплей 128x64, помощь

gzp13
Offline
Зарегистрирован: 06.04.2015

Здравствуйте, делаю сигнализатор скорости для машины. При выводе на дисплей скорости в сторону увеличения все хорошо, но вот при уменьшении скорости, остаётся число на экране, например было трехзначное число, при достижении скорости 99 первый разряд предыдущего числа горит на экране. Вопрос как его убрать? Пробовал наложить на этот разряд квадрат в цвет фона, но он постоянно мерцает.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

gzp13, выводить не число а  строку во всю ширину дисплея

gzp13
Offline
Зарегистрирован: 06.04.2015

Как это строку? Я указываю координаты, указываю что надо вывести скорость и все. Да, библиотеку использую iarduino OLED.
Я вывожу так, myOLED. print(speed, 55,55);

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Идея простая: конвертируем число в строку, и слева (или справа, как угодно) - добиваем пробелами до максимальной разрядности. При этом число 99 будет выглядеть так: "99 ", число 123 - так: "123" и т.п. Т.е. пробелы - просто для затирания неиспользуемого разряда, чтобы он не оставался на экране.

Именно об этом говорил dimax. Данный способ - самый простой, как кувалда. Есть пограмотнее, но посложнее. Почему пограмотнее: незачем постоянно перерисовывать все разряды - надо только при смене разрядности выводимого числа в меньшую сторону - стирать знакоместо канувшего в небытие разряда. 

gzp13
Offline
Зарегистрирован: 06.04.2015

Я правильно понял, надо сделать так?
MYOLED. print(speed, 50,55);
MYOLED.setcursor(60,66);
MYOLED.print(" ") ;

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

Лучше  snprintf() в буфер, а потом буфер в print(). Тогда будет примыкание пробела к цифрам стопроцентное.

gzp13
Offline
Зарегистрирован: 06.04.2015

Все, разобрался, спасибо за наводки. Просто нарисовал квадрат в цвет фона и вставил куда надо на экране.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

gzp13 пишет:

Все, разобрался, спасибо за наводки. Просто нарисовал квадрат в цвет фона и вставил куда надо на экране.

этта правильно, канеш, но не быстро. 

gzp13
Offline
Зарегистрирован: 06.04.2015

Опять я что то затупил, не понимаю что делать?

Посмотрите пожалуйста, в чем ошибка? Смысл в том, что если speed<10 то надо затереть цифры справа, чтобы индицировалось одноразрядное число от 0 до 9. Если 100>speed>10 то надо затереть цифры, но чтобы индицировались уже два разряда.

 if (speed<100 && speed>10 )                                 // тут при выводе скорости, если число двухзначное
{                                   
   myOLED.print("  ",59,40);
   myOLED.print("  ",59,55);
 } 
  if (speed<10)
  {
    myOLED.print("   ",44,55);
    }
   myOLED.update();
  myOLED.setFont(BigNumbers);
 myOLED.print(speed,30,55,0);  


В результате исполнения этого кода сначала затирается правая цифра, но потом она опять появляется, и так по кругу.Я понимаю, что код выполняется правильно, но не могу найти правильного решения.     

 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

если speed целое, то

char buf[4];

sprintf(buf,"%-3d",speed);

myOLED.print(buf,30,55,0);

(но это не точно)  проверь щажжэ, я от канпилятора далеко и у меня OLED нету.

 

gzp13
Offline
Зарегистрирован: 06.04.2015

Ща проверю.

Проверил, работает правильно, но мне же надо затереть цифру 0 при достижении значения 10, чтобы на экране отображалась цифра 9.

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

http://cpp.com.ru/shildt_spr_po_c/08/0804.html

Искать разделы со словом "модификаторы".

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

минус убери:

sprintf(buf,"%3d",speed);

gzp13
Offline
Зарегистрирован: 06.04.2015
sprintf(buf,"%3d",speed);

Это работает с числами типа INT, а у меня скорость float.

 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

ну иоптваюмать.  цифры после запятой нужны? 

 

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

А еще чтобы float задом-наперед выводилось.

И красненьким.

Но иногда можно синим.

Точечка чтоб мигала.

Но не быстро.

Или быстро, когда скорость большая.

Попискивала еще чтоб.

На IPS OLED MP3 экране.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

gzp13 пишет:

sprintf(buf,"%3d",speed);

Это работает с числами типа INT, а у меня скорость float.

Ну и что, фантазию включай.

sprintf(buf, "Speed= %2d,%02d", (int)speed, (int)(speed*100)%100  );

 

mixail844
Offline
Зарегистрирован: 30.04.2012

dimax пишет:

gzp13 пишет:

sprintf(buf,"%3d",speed);

Это работает с числами типа INT, а у меня скорость float.

Ну и что, фантазию включай.

sprintf(buf, "Speed= %2d,%02d", (int)speed, (int)(speed*100)%100  );

 

(int)(speed*100)%100

поправочка :  ((x*y) mod y) = x ,всегда

более уместней будет : 

(int)((speed % 100) * 100)

 

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

mixail844 пишет:

поправочка :  ((x*y) mod y) = x ,всегда

более уместней будет : 

(int)((speed % 100) * 100)

 

Если это была шутка, то она несмешная.. 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

на самом деле, ((x*y) mod y) = 0 ,всегда, если x и y целые

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

DetSimen,А у нас "x" это флоат. Поэтому (3.1415*100)%100 = 14

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

dimax пишет:

DetSimen,А у нас "x" это флоат. Поэтому (3.1415*100)%100 = 14

а я согласно. 

mixail844
Offline
Зарегистрирован: 30.04.2012

dimax пишет:

mixail844 пишет:

поправочка :  ((x*y) mod y) = x ,всегда

более уместней будет : 

(int)((speed % 100) * 100)

 

Если это была шутка, то она несмешная.. 

 

DetSimen пишет:

на самом деле, ((x*y) mod y) = 0 ,всегда, если x и y целые

да, поспешил,был не прав.